Test/MSFT_xExchExchangeServer.Integration.Tests.ps1

###NOTE: 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

Import-Module $PSScriptRoot\..\DSCResources\MSFT_xExchExchangeServer\MSFT_xExchExchangeServer.psm1
Import-Module $PSScriptRoot\..\Misc\xExchangeCommon.psm1 -Verbose:0
Import-Module $PSScriptRoot\xExchange.Tests.Common.psm1 -Verbose:0

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

    Import-Module ActiveDirectory
    ClearServerADProp("msExchProductID")
    ClearServerADProp("msExchCustomerFeedbackEnabled")
    ClearServerADProp("msExchInternetWebProxy")
    #ClearServerADProp("msExchShadowDisplayName")
}

#Used to null out the specified Active Directory property of an Exchange Server
function ClearServerADProp
{
    [CmdletBinding()]
    param($prop)

    Get-ADObject -SearchBase "$($Global:ExchangeServerDN)" -Filter {ObjectClass -eq "msExchExchangeServer"} | Where-Object {$_.ObjectClass -eq "msExchExchangeServer"} | Set-ADObject -Clear "$($prop)"
}

function VerifyServerPrepped
{
    [CmdletBinding()]
    param()

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

        #It "CustomerFeedbackEnabled should be null" {
        # $getResult.CustomerFeedbackEnabled | Should Be $null
        #}

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

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

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

if ($null -ne $adModule)
{
    #Check if Exchange is installed on this machine. If not, we can't run tests
    [bool]$exchangeInstalled = IsSetupComplete

    if ($exchangeInstalled)
    {
        #Get required credentials to use for the test
        if ($null -eq $Global:ShellCredentials)
        {
            [PSCredential]$Global:ShellCredentials = Get-Credential -Message "Enter credentials for connecting a Remote PowerShell session to Exchange"
        }

        if ($null -eq $Global:ExchangeServerDN)
        {
            GetRemoteExchangeSession -Credential $Global:ShellCredentials -CommandsToLoad "Get-ExchangeServer"

            $server = Get-ExchangeServer -Identity $env:COMPUTERNAME

            if ($null -ne $server)
            {
                $Global:ExchangeServerDN = $server.DistinguishedName
            }

            if ($null -eq $Global:ExchangeServerDN)
            {
                throw "Failed to determine distinguishedName of Exchange Server object"
            }
        }

        #Get the product key to use for testing
        if ($null -eq $Global:ProductKey)
        {
            $Global:ProductKey = Read-Host -Prompt "Enter the product key to license Exchange with"
        }

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

            #First prepare the server for tests
            PrepTestExchangeServer
            VerifyServerPrepped


            #Now do tests
            $testParams = @{
                Identity = $env:COMPUTERNAME
                Credential = $Global:ShellCredentials
                InternetWebProxy = "http://someproxy.local/"
                ProductKey = $Global:ProductKey
            }

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

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