Tests/Integration/MSFT_xDSCWebService.xxx.ps1

######################################################################################
# Integration Tests for DSC Resource xDSCWebService
#
# There tests will make changes to your system, we are tyring to roll them back,
# but you never know. Best to run this on a throwaway VM.
# Run as an elevated administrator
######################################################################################

$here = Split-Path -Parent $MyInvocation.MyCommand.Path

# create a unique name that we use for our temp files and folders
[string]$tempName = "xDSCWebServiceTests_" + (Get-Date).ToString("yyyyMMdd_HHmmss")

Describe "xDSCWebService" {

    function Verify-DSCPullServer ($protocol,$hostname,$port) {
        ([xml](invoke-webrequest "$($protocol)://$($hostname):$($port)/psdscpullserver.svc" | % Content)).service.workspace.collection.href
    }

    function Remove-WebRoot([string]$filePath)
    {
       if (Test-Path $filePath)
       {
           Get-ChildItem $filePath -Recurse | Remove-Item -Recurse
           Remove-Item $filePath
       }
    }

    try
    {


        # before doing our changes, create a backup of the current config
        Backup-WebConfiguration -Name $tempName


        It 'Installing Service' -test {
        {

            # define the configuration
            configuration InstallingService
            {
                WindowsFeature DSCServiceFeature
                {
                    Ensure = “Present”
                    Name   = “DSC-Service”
                }
            }

            # execute the configuration into a temp location
            InstallingService -OutputPath $env:temp\$($tempName)_InstallingService
            # run the configuration, it should not throw any errors
            Start-DscConfiguration -Path $env:temp\$($tempName)_InstallingService -Wait -Verbose -ErrorAction Stop -Force}  | should not throw

            (Get-WindowsFeature -name DSC-Service | Where Installed).count | should be 1
        }

        It 'Creating Sites' -test {
        {
            # define the configuration
            configuration CreatingSites
            {
                Import-DSCResource -ModuleName xPSDesiredStateConfiguration
                
                xDscWebService PSDSCPullServer
                {
                    EndpointName            = “TestPSDSCPullServer”
                    Port                    = 21001
                    CertificateThumbPrint   = “AllowUnencryptedTraffic”
                }
            }

            # execute the configuration into a temp location
            CreatingSites -OutputPath $env:temp\$($tempName)_CreatingSites
            # run the configuration, it should not throw any errors
            Start-DscConfiguration -Path $env:temp\$($tempName)_CreatingSites -Wait -Verbose -ErrorAction Stop -Force}  | should not throw

            # we now expect two sites starting with our prefix
            (Get-ChildItem iis:\sites | Where-Object Name -match "^TestPSDSC").count | should be 1

            # we expect some files in the web root, using the defaults
            (Test-Path "$env:SystemDrive\inetpub\TestPSDSCPullServer\web.config") | should be $true

            $FireWallRuleDisplayName = "Desired State Configuration - Pull Server Port:{0}"
            $ruleName = ($($FireWallRuleDisplayName) -f "21001")
            (Get-NetFirewallRule | Where-Object DisplayName -eq "$ruleName" | Measure-Object).count | should be 1

            # we also expect an XML document with certain strings at a certain URI
            (Verify-DSCPullServer "http" "localhost" "21001") | should match "Action|Module"

        }

        It 'Removing Sites' -test {
        {

            # define the configuration
            configuration RemovingSites
            {
                Import-DSCResource -ModuleName xPSDesiredStateConfiguration

                xDscWebService PSDSCPullServer
                {
                    Ensure                  = “Absent”
                    EndpointName            = “TestPSDSCPullServer”
                    CertificateThumbPrint   = “NotUsed”
                }
            }

            # execute the configuration into a temp location
            RemovingSites -OutputPath $env:temp\$($tempName)_RemovingSites
            # run the configuration, it should not throw any errors
            Start-DscConfiguration -Path $env:temp\$($tempName)_RemovingSites -Wait -Verbose -ErrorAction Stop -Force}  | should not throw

            # we now expect two sites starting with our prefix
            (Get-ChildItem iis:\sites | Where-Object Name -match "^TestPSDSC").count | should be 0

            (Test-Path "$env:SystemDrive\inetpub\TestPSDSCPullServer\web.config") | should be $false

            $FireWallRuleDisplayName = "Desired State Configuration - Pull Server Port:{0}"
            $ruleName = ($($FireWallRuleDisplayName) -f "8081")
            (Get-NetFirewallRule | Where-Object DisplayName -eq "$ruleName" | Measure-Object).count | should be 0

        }

        It 'CreatingSitesWithFTP' -test {
        {
            # create a new FTP site on IIS
            If (!(Test-Path IIS:\Sites\DummyFTPSite))
            {
                New-WebFtpSite -Name "DummyFTPSite" -Port "21000"
                # stop the site, we don't want it, it is just here to check whether setup works
                (get-Website -Name "DummyFTPSite").ftpserver.stop()
            }

            # define the configuration
            configuration CreatingSitesWithFTP
            {
                Import-DSCResource -ModuleName xPSDesiredStateConfiguration

                xDscWebService PSDSCPullServer2
                {
                    EndpointName            = “TestPSDSCPullServer2”
                    Port                    = 21003
                    CertificateThumbPrint   = “AllowUnencryptedTraffic”
                }
            }

            # execute the configuration into a temp location
            CreatingSitesWithFTP -OutputPath $env:temp\$($tempName)_CreatingSitesWithFTP
            # run the configuration, it should not throw any errors
            Start-DscConfiguration -Path $env:temp\$($tempName)_CreatingSitesWithFTP -Wait -Verbose -ErrorAction Stop -Force}  | should not throw

        }

    }
    finally
    {
        # roll back our changes
        Restore-WebConfiguration -Name $tempName
        Remove-WebConfigurationBackup -Name $tempName

        # remove possible web files
        Remove-WebRoot -filePath "$env:SystemDrive\inetpub\TestPSDSCPullServer"
        Remove-WebRoot -filePath "$env:SystemDrive\inetpub\TestPSDSCPullServer2"

        # remove the generated MoF files
        Get-ChildItem $env:temp -Filter $tempName* | Remove-item -Recurse

        # remove all firewall rules starting with port 21*
        Get-NetFirewallRule | Where-Object DisplayName -match "^Desired State Configuration - Pull Server Port:21" | Remove-NetFirewallRule

    } 
}