Tests/Integration/MSFT_xExchAutodiscoverVirtualDirectory.Integration.Tests.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<#
    .SYNOPSIS
        Automated unit integration for MSFT_xExchAutodiscoverVirtualDirectory DSC Resource.
        This test module requires use of credentials.
        The first run through of the tests will prompt for credentials from the logged on user.
#>


#region HEADER
[System.String]$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
[System.String]$script:DSCModuleName = 'xExchange'
[System.String]$script:DSCResourceFriendlyName = 'xExchAutodiscoverVirtualDirectory'
[System.String]$script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)"

Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'Tests' -ChildPath (Join-Path -Path 'TestHelpers' -ChildPath 'xExchangeTestHelper.psm1'))) -Force
Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'Modules' -ChildPath 'xExchangeHelper.psm1')) -Force
Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResources' -ChildPath (Join-Path -Path "$($script:DSCResourceName)" -ChildPath "$($script:DSCResourceName).psm1")))

#Check if Exchange is installed on this machine. If not, we can't run tests
[System.Boolean]$exchangeInstalled = Get-IsSetupComplete

#endregion HEADER

if ($exchangeInstalled)
{
    #Get required credentials to use for the test
    $shellCredentials = Get-TestCredential

    if ($null -eq $serverFqdn)
    {
        $serverFqdn = [System.Net.Dns]::GetHostByName($env:COMPUTERNAME).HostName
    }

    Describe 'Test Setting Properties with xExchAutodiscoverVirtualDirectory' {
        $testParams = @{
            Identity =  "$($env:COMPUTERNAME)\Autodiscover (Default Web Site)"
            Credential = $shellCredentials
            BasicAuthentication = $true
            DigestAuthentication = $false
            ExtendedProtectionFlags = @('AllowDotlessspn','NoServicenameCheck')
            ExtendedProtectionSPNList = @('http/mail.fabrikam.com','http/mail.fabrikam.local','http/wxweqc')
            ExtendedProtectionTokenChecking = 'Allow'
            OAuthAuthentication = $true
            WindowsAuthentication = $true
            WSSecurityAuthentication = $true
        }

        $expectedGetResults = @{
            Identity =  "$($env:COMPUTERNAME)\Autodiscover (Default Web Site)"
            BasicAuthentication = $true
            DigestAuthentication = $false
            ExtendedProtectionTokenChecking = 'Allow'
            OAuthAuthentication = $true
            WindowsAuthentication = $true
            WSSecurityAuthentication = $true
        }

        Test-TargetResourceFunctionality -Params $testParams `
                                         -ContextLabel 'Set standard parameters' `
                                         -ExpectedGetResults $expectedGetResults

        Test-ArrayContentsEqual -TestParams $testParams `
                                -DesiredArrayContents $testParams.ExtendedProtectionFlags `
                                -GetResultParameterName 'ExtendedProtectionFlags' `
                                -ContextLabel 'Verify ExtendedProtectionFlags' `
                                -ItLabel 'ExtendedProtectionSPNList should contain three values'

        Test-ArrayContentsEqual -TestParams $testParams `
                                -DesiredArrayContents $testParams.ExtendedProtectionSPNList `
                                -GetResultParameterName 'ExtendedProtectionSPNList' `
                                -ContextLabel 'Verify ExtendedProtectionSPNList' `
                                -ItLabel 'ExtendedProtectionSPNList should contain three values'

        Context 'Test missing ExtendedProtectionFlags for ExtendedProtectionSPNList' {
            $caughtException = $false
            $testParams.ExtendedProtectionFlags = @('NoServicenameCheck')
            try
            {
                Set-TargetResource @testParams | Out-Null
            }
            catch
            {
                $caughtException = $true
            }

            It 'Should hit exception for missing ExtendedProtectionFlags AllowDotlessSPN' {
                $caughtException | Should Be $true
            }

            It 'Test results should be true after adding missing ExtendedProtectionFlags' {
                $testParams.ExtendedProtectionFlags = @('AllowDotlessSPN')
                Set-TargetResource @testParams
                $testResults = Test-TargetResource @testParams
                $testResults | Should Be $true
            }
        }

        Context 'Test invalid combination in ExtendedProtectionFlags' {
            $caughtException = $false
            $testParams.ExtendedProtectionFlags = @('NoServicenameCheck','None')
            try
            {
                Set-TargetResource @testParams | Out-Null
            }
            catch
            {
                $caughtException = $true
            }

            It 'Should hit exception for invalid combination ExtendedProtectionFlags' {
                $caughtException | Should Be $true
            }

            It 'Test results should be true after correction of ExtendedProtectionFlags' {
                $testParams.ExtendedProtectionFlags = @('AllowDotlessSPN')
                Set-TargetResource @testParams
                $testResults = Test-TargetResource @testParams
                $testResults | Should Be $true
            }
        }

        $testParams.BasicAuthentication = $false
        $testParams.DigestAuthentication = $true
        $testParams.OAuthAuthentication = $true
        $testParams.ExtendedProtectionFlags = 'None'
        $testParams.ExtendedProtectionSPNList = $null
        $testParams.ExtendedProtectionTokenChecking = 'None'
        $testParams.WindowsAuthentication = $false
        $testParams.WSSecurityAuthentication = $true
        $expectedGetResults.BasicAuthentication = $false
        $expectedGetResults.DigestAuthentication = $true
        $expectedGetResults.ExtendedProtectionFlags = $null
        $expectedGetResults.ExtendedProtectionSPNList = $null
        $expectedGetResults.ExtendedProtectionTokenChecking = 'None'
        $expectedGetResults.OAuthAuthentication = $true
        $expectedGetResults.WindowsAuthentication = $false
        $expectedGetResults.WSSecurityAuthentication = $true

        Test-TargetResourceFunctionality -Params $testParams `
                                         -ContextLabel 'Change some parameters' `
                                         -ExpectedGetResults $expectedGetResults
    }
}
else
{
    Write-Verbose 'Tests in this file require that Exchange is installed to be run.'
}