Tests/Integration/MSFT_xExchExchangeServer.Integration.Tests.ps1

<#
    .SYNOPSIS
        Automated integration test for MSFT_xExchExchangeServer 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.
        This module has the following additional requirements:
            * Requires that the ActiveDirectory module is installed
#>


#region HEADER
[System.String]$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
[System.String]$script:DSCModuleName = 'xExchange'
[System.String]$script:DSCResourceFriendlyName = 'xExchExchangeServer'
[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 = Test-ExchangeSetupComplete

#endregion HEADER

#Sets properties retrieved by Get-ExchangeServer back to their default values
function Clear-PropsForExchDscServer
{
    [CmdletBinding()]
    param()

    Import-Module -Name ActiveDirectory
    Clear-ExchDscServerADProperty -Property 'msExchProductID'
    Clear-ExchDscServerADProperty -Property 'msExchCustomerFeedbackEnabled'
    Clear-ExchDscServerADProperty -Property 'msExchInternetWebProxy'
}

#Used to null out the specified Active Directory property of an Exchange Server
function Clear-ExchDscServerADProperty
{
    [CmdletBinding()]
    param
    (
        [Parameter()]
        [System.string]
        $Property
    )

    Get-ADObject -SearchBase "$($exchangeServerDN)" -Filter {ObjectClass -eq 'msExchExchangeServer'} | Where-Object -FilterScript {
        $_.ObjectClass -eq 'msExchExchangeServer'
    } | Set-ADObject -Clear "$($Property)"
}

function Test-ExchDscServerPrepped
{
    [CmdletBinding()]
    param()

    Context 'Server has had relevant properties nulled out for xExchExchangeServer tests' {
        [System.Collections.Hashtable]$getResult = Get-TargetResource @testParams -Verbose

        It 'InternetWebProxy should be empty' {
            [System.String]::IsNullOrEmpty($getResult.InternetWebProxy) | Should Be $true
        }

        It 'ProductKey should be empty' {
            [System.String]::IsNullOrEmpty($getResult.ProductKey) | Should Be $true
        }
    }
}

$adModule = Get-Module -ListAvailable ActiveDirectory -ErrorAction SilentlyContinue

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

        if ($null -eq $exchangeServerDN)
        {
            Get-RemoteExchangeSession -Credential $shellCredentials -CommandsToLoad 'Get-ExchangeServer'
            $server = Get-ExchangeServer -Identity $env:COMPUTERNAME

            if ($null -ne $server)
            {
                $exchangeServerDN = $server.DistinguishedName
            }

            if ($null -eq $exchangeServerDN)
            {
                throw 'Failed to determine distinguishedName of Exchange Server object'
            }
        }

        #Get the product key to use for testing
        if ($null -eq $productKey)
        {
            $productKey = Read-Host -Prompt 'Enter the product key to license Exchange with, or press ENTER to skip testing the licensing of the server.'
        }

        Describe 'Test Setting Properties with xExchExchangeServer' {
            #Create out initial test params
            $testParams = @{
                Identity = $env:COMPUTERNAME
                Credential = $shellCredentials
            }

            #First prepare the server for tests
            Clear-PropsForExchDscServer
            Test-ExchDscServerPrepped

            #Now do tests
            $testParams = @{
                Identity = $env:COMPUTERNAME
                Credential = $shellCredentials
                InternetWebProxy = 'http://someproxy.local/'
            }

            $expectedGetResults = @{
                Identity = $env:COMPUTERNAME
                InternetWebProxy = 'http://someproxy.local/'
            }

            if (![System.String]::IsNullOrEmpty($productKey))
            {
                $testParams.Add('ProductKey', $productKey)
                $expectedGetResults.Add('ProductKey', 'Licensed')
            }

            Test-TargetResourceFunctionality -Params $testParams `
                                             -ContextLabel 'Standard xExchExchangeServer tests' `
                                             -ExpectedGetResults $expectedGetResults
        }
    }
    else
    {
        Write-Verbose -Message 'Tests in this file require that Exchange is installed to be run.'
    }
}
else
{
    Write-Verbose -Message 'Tests in this file require that the ActiveDirectory module is installed. Run: Add-WindowsFeature RSAT-ADDS'
}