Tests/Integration/MSFT_xExchMailboxServer.Integration.Tests.ps1

<#
    .SYNOPSIS
        Automated integration test for MSFT_xExchMailboxServer 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 = 'xExchMailboxServer'
[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 = IsSetupComplete

#endregion HEADER

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'
    }

    Describe 'Test Setting Properties with xExchMailboxServer' {
        $serverVersion = GetExchangeVersion

        #Make sure DB activation is not blocked
        $testParams = @{
            Identity = $env:COMPUTERNAME
            Credential = $Global:ShellCredentials
            AutoDatabaseMountDial = 'BestAvailability'
            CalendarRepairIntervalEndWindow = '15'
            CalendarRepairLogDirectorySizeLimit = '1GB'
            CalendarRepairLogEnabled = $false
            CalendarRepairLogFileAgeLimit = '30.00:00:00'
            CalendarRepairLogPath = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Calendar Repair DSC'
            CalendarRepairLogSubjectLoggingEnabled = $false
            CalendarRepairMissingItemFixDisabled = $true
            CalendarRepairMode = 'ValidateOnly'
            DatabaseCopyActivationDisabledAndMoveNow = $false
            DatabaseCopyAutoActivationPolicy = 'Unrestricted'
            FolderLogForManagedFoldersEnabled = $true
            ForceGroupMetricsGeneration = $true
            IsExcludedFromProvisioning = $true
            JournalingLogForManagedFoldersEnabled = $true
            LogDirectorySizeLimitForManagedFolders = '10GB'
            LogFileAgeLimitForManagedFolders = '7.00:00:00'
            LogFileSizeLimitForManagedFolders = '15MB'
            LogPathForManagedFolders = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Managed Folder Assistant DSC'
            MAPIEncryptionRequired = $true
            MaximumActiveDatabases = '36'
            MaximumPreferredActiveDatabases = '24'
            RetentionLogForManagedFoldersEnabled = $false
            SharingPolicySchedule = 'Sun.11:30 PM-Mon.1:30 AM'
            SubjectLogForManagedFoldersEnabled = $true
        }

        $expectedGetResults = @{
            Identity = $env:COMPUTERNAME
            AutoDatabaseMountDial = 'BestAvailability'
            CalendarRepairIntervalEndWindow = '15'
            CalendarRepairLogDirectorySizeLimit = '1GB'
            CalendarRepairLogEnabled = $false
            CalendarRepairLogFileAgeLimit = '30.00:00:00'
            CalendarRepairLogPath = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Calendar Repair DSC'
            CalendarRepairLogSubjectLoggingEnabled = $false
            CalendarRepairMissingItemFixDisabled = $true
            CalendarRepairMode = 'ValidateOnly'
            DatabaseCopyActivationDisabledAndMoveNow = $false
            DatabaseCopyAutoActivationPolicy = 'Unrestricted'
            FolderLogForManagedFoldersEnabled = $true
            ForceGroupMetricsGeneration = $true
            IsExcludedFromProvisioning = $true
            JournalingLogForManagedFoldersEnabled = $true
            LogDirectorySizeLimitForManagedFolders = '10GB'
            LogFileAgeLimitForManagedFolders = '7.00:00:00'
            LogFileSizeLimitForManagedFolders = '15MB'
            LogPathForManagedFolders = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Managed Folder Assistant DSC'
            MAPIEncryptionRequired = $true
            MaximumActiveDatabases = '36'
            MaximumPreferredActiveDatabases = '24'
            RetentionLogForManagedFoldersEnabled = $false
            SharingPolicySchedule = 'Sun.11:30 PM-Mon.1:30 AM'
            SubjectLogForManagedFoldersEnabled = $true
        }

        if ($serverVersion -eq '2016')
        {
            $testParams.Add('WacDiscoveryEndpoint', '')
            $expectedGetResults.Add('WacDiscoveryEndpoint', '')
        }

        if ($serverVersion -eq '2013')
        {
            $testParams.Add('CalendarRepairWorkCycle', '2.00:00:00')
            $expectedGetResults.Add('CalendarRepairWorkCycle', '2.00:00:00')
            $testParams.Add('CalendarRepairWorkCycleCheckpoint', '2.00:00:00')
            $expectedGetResults.Add('CalendarRepairWorkCycleCheckpoint', '2.00:00:00')
            $testParams.Add('MailboxProcessorWorkCycle', '2.00:00:00')
            $expectedGetResults.Add('MailboxProcessorWorkCycle', '2.00:00:00')
            $testParams.Add('ManagedFolderAssistantSchedule', 'Sun.11:30 PM-Mon.1:30 AM')
            $expectedGetResults.Add('ManagedFolderAssistantSchedule', 'Sun.11:30 PM-Mon.1:30 AM')
            $testParams.Add('ManagedFolderWorkCycle', '2.00:00:00')
            $expectedGetResults.Add('ManagedFolderWorkCycle', '2.00:00:00')
            $testParams.Add('ManagedFolderWorkCycleCheckpoint', '2.00:00:00')
            $expectedGetResults.Add('ManagedFolderWorkCycleCheckpoint', '2.00:00:00')
            $testParams.Add('OABGeneratorWorkCycle', '10:00:00')
            $expectedGetResults.Add('OABGeneratorWorkCycle', '10:00:00')
            $testParams.Add('OABGeneratorWorkCycleCheckpoint', '10:00:00')
            $expectedGetResults.Add('OABGeneratorWorkCycleCheckpoint', '10:00:00')
            $testParams.Add('PublicFolderWorkCycle', '2.00:00:00')
            $expectedGetResults.Add('PublicFolderWorkCycle', '2.00:00:00')
            $testParams.Add('PublicFolderWorkCycleCheckpoint', '2.00:00:00')
            $expectedGetResults.Add('PublicFolderWorkCycleCheckpoint', '2.00:00:00')
            $testParams.Add('SharingPolicyWorkCycle', '2.00:00:00')
            $expectedGetResults.Add('SharingPolicyWorkCycle', '2.00:00:00')
            $testParams.Add('SharingPolicyWorkCycleCheckpoint', '2.00:00:00')
            $expectedGetResults.Add('SharingPolicyWorkCycleCheckpoint', '2.00:00:00')
            $testParams.Add('SharingSyncWorkCycle', '05:00:00')
            $expectedGetResults.Add('SharingSyncWorkCycle', '05:00:00')
            $testParams.Add('SharingSyncWorkCycleCheckpoint', '05:00:00')
            $expectedGetResults.Add('SharingSyncWorkCycleCheckpoint', '05:00:00')
            $testParams.Add('SiteMailboxWorkCycle', '05:00:00')
            $expectedGetResults.Add('SiteMailboxWorkCycle', '05:00:00')
            $testParams.Add('SiteMailboxWorkCycleCheckpoint', '05:00:00')
            $expectedGetResults.Add('SiteMailboxWorkCycleCheckpoint', '05:00:00')
            $testParams.Add('TopNWorkCycle', '10.00:00:00')
            $expectedGetResults.Add('TopNWorkCycle', '10.00:00:00')
            $testParams.Add('TopNWorkCycleCheckpoint', '2.00:00:00')
            $expectedGetResults.Add('TopNWorkCycleCheckpoint', '2.00:00:00')
            $testParams.Add('UMReportingWorkCycle', '2.00:00:00')
            $expectedGetResults.Add('UMReportingWorkCycle', '2.00:00:00')
            $testParams.Add('UMReportingWorkCycleCheckpoint', '2.00:00:00')
            $expectedGetResults.Add('UMReportingWorkCycleCheckpoint', '2.00:00:00')
        }

        Test-TargetResourceFunctionality -Params $testParams `
                                         -ContextLabel 'Set non-default values for all properties' `
                                         -ExpectedGetResults $expectedGetResults

        #Block DB activation
        $testParams.DatabaseCopyActivationDisabledAndMoveNow = $true
        $testParams.DatabaseCopyAutoActivationPolicy = 'Blocked'
        $testParams.MaximumActiveDatabases = '24'
        $testParams.MaximumPreferredActiveDatabases = '12'

        $expectedGetResults.DatabaseCopyActivationDisabledAndMoveNow = $true
        $expectedGetResults.DatabaseCopyAutoActivationPolicy = 'Blocked'
        $expectedGetResults.MaximumActiveDatabases = '24'
        $expectedGetResults.MaximumPreferredActiveDatabases = '12'

        if ($serverVersion -eq '2016')
        {
            $testParams['WacDiscoveryEndpoint'] = 'https://localhost/hosting/discovery'
            $expectedGetResults['WacDiscoveryEndpoint'] = 'https://localhost/hosting/discovery'
        }

        Test-TargetResourceFunctionality -Params $testParams `
                                         -ContextLabel 'Block DB Activation, Set WacDiscoveryEndpoint, and modify MaxDBValues' `
                                         -ExpectedGetResults $expectedGetResults

        #Make sure DB activation is not blocked
        $testParams = @{
            Identity = $env:COMPUTERNAME
            Credential = $Global:ShellCredentials
            AutoDatabaseMountDial = 'GoodAvailability'
            CalendarRepairLogDirectorySizeLimit = '500MB'
            CalendarRepairLogEnabled = $true
            CalendarRepairLogFileAgeLimit = '10.00:00:00'
            CalendarRepairLogPath = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Calendar Repair'
            CalendarRepairLogSubjectLoggingEnabled = $true
            CalendarRepairMissingItemFixDisabled = $false
            CalendarRepairMode = 'RepairAndValidate'
            DatabaseCopyActivationDisabledAndMoveNow = $false
            DatabaseCopyAutoActivationPolicy = 'Unrestricted'
            FolderLogForManagedFoldersEnabled = $false
            ForceGroupMetricsGeneration = $false
            IsExcludedFromProvisioning = $false
            JournalingLogForManagedFoldersEnabled = $false
            LogDirectorySizeLimitForManagedFolders = 'Unlimited'
            LogFileAgeLimitForManagedFolders = '00:00:00'
            LogFileSizeLimitForManagedFolders = '10MB'
            LogPathForManagedFolders = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Managed Folder Assistant'
            MAPIEncryptionRequired = $false
            MaximumActiveDatabases = ''
            MaximumPreferredActiveDatabases = ''
            RetentionLogForManagedFoldersEnabled = $false
            SharingPolicySchedule = $null
            SubjectLogForManagedFoldersEnabled = $false
        }

        $expectedGetResults = @{
            Identity = $env:COMPUTERNAME
            AutoDatabaseMountDial = 'GoodAvailability'
            CalendarRepairLogDirectorySizeLimit = '500MB'
            CalendarRepairLogEnabled = $true
            CalendarRepairLogFileAgeLimit = '10.00:00:00'
            CalendarRepairLogPath = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Calendar Repair'
            CalendarRepairLogSubjectLoggingEnabled = $true
            CalendarRepairMissingItemFixDisabled = $false
            CalendarRepairMode = 'RepairAndValidate'
            DatabaseCopyActivationDisabledAndMoveNow = $false
            DatabaseCopyAutoActivationPolicy = 'Unrestricted'
            FolderLogForManagedFoldersEnabled = $false
            ForceGroupMetricsGeneration = $false
            IsExcludedFromProvisioning = $false
            JournalingLogForManagedFoldersEnabled = $false
            LogDirectorySizeLimitForManagedFolders = 'Unlimited'
            LogFileAgeLimitForManagedFolders = '00:00:00'
            LogFileSizeLimitForManagedFolders = '10MB'
            LogPathForManagedFolders = 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\Managed Folder Assistant'
            MAPIEncryptionRequired = $false
            MaximumActiveDatabases = $null
            MaximumPreferredActiveDatabases = $null
            RetentionLogForManagedFoldersEnabled = $false
            SubjectLogForManagedFoldersEnabled = $false
        }

        if ($serverVersion -eq '2016')
        {
            $testParams['CalendarRepairIntervalEndWindow'] = '7'
            $expectedGetResults['CalendarRepairIntervalEndWindow'] = '7'
            $testParams['WacDiscoveryEndpoint'] = ''
            $expectedGetResults['WacDiscoveryEndpoint'] = ''
        }

        if ($serverVersion -eq '2013')
        {
            $testParams['CalendarRepairIntervalEndWindow'] = '30'
            $expectedGetResults['CalendarRepairIntervalEndWindow'] = '30'
            $testParams['CalendarRepairWorkCycle'] = '1.00:00:00'
            $expectedGetResults['CalendarRepairWorkCycle'] = '1.00:00:00'
            $testParams['CalendarRepairWorkCycleCheckpoint'] = '1.00:00:00'
            $expectedGetResults['CalendarRepairWorkCycleCheckpoint'] = '1.00:00:00'
            $testParams['MailboxProcessorWorkCycle'] = '1.00:00:00'
            $expectedGetResults['MailboxProcessorWorkCycle'] = '1.00:00:00'
            $testParams['ManagedFolderAssistantSchedule'] = $null
            $expectedGetResults['ManagedFolderAssistantSchedule'] = $null
            $testParams['ManagedFolderWorkCycle'] = '1.00:00:00'
            $expectedGetResults['ManagedFolderWorkCycle'] = '1.00:00:00'
            $testParams['ManagedFolderWorkCycleCheckpoint'] = '1.00:00:00'
            $expectedGetResults['ManagedFolderWorkCycleCheckpoint'] = '1.00:00:00'
            $testParams['OABGeneratorWorkCycle'] = '08:00:00'
            $expectedGetResults['OABGeneratorWorkCycle'] = '08:00:00'
            $testParams['OABGeneratorWorkCycleCheckpoint'] = '01:00:00'
            $expectedGetResults['OABGeneratorWorkCycleCheckpoint'] = '01:00:00'
            $testParams['PublicFolderWorkCycle'] = '1.00:00:00'
            $expectedGetResults['PublicFolderWorkCycle'] = '1.00:00:00'
            $testParams['PublicFolderWorkCycleCheckpoint'] = '1.00:00:00'
            $expectedGetResults['PublicFolderWorkCycleCheckpoint'] = '1.00:00:00'
            $testParams['SharingPolicyWorkCycle'] = '1.00:00:00'
            $expectedGetResults['SharingPolicyWorkCycle'] = '1.00:00:00'
            $testParams['SharingSyncWorkCycleCheckpoint'] = '1.00:00:00'
            $expectedGetResults['SharingSyncWorkCycleCheckpoint'] = '1.00:00:00'
            $testParams['SiteMailboxWorkCycle'] = '06:00:00'
            $expectedGetResults['SiteMailboxWorkCycle'] = '06:00:00'
            $testParams['SiteMailboxWorkCycleCheckpoint'] = '06:00:00'
            $expectedGetResults['SiteMailboxWorkCycleCheckpoint'] = '06:00:00'
            $testParams['TopNWorkCycle'] = '7.00:00:00'
            $expectedGetResults['TopNWorkCycle'] = '7.00:00:00'
            $testParams['TopNWorkCycleCheckpoint'] = '1.00:00:00'
            $expectedGetResults['TopNWorkCycleCheckpoint'] = '1.00:00:00'
            $testParams['UMReportingWorkCycle'] = '1.00:00:00'
            $expectedGetResults['UMReportingWorkCycle'] = '1.00:00:00'
            $testParams['UMReportingWorkCycleCheckpoint'] = '1.00:00:00'
            $expectedGetResults['UMReportingWorkCycleCheckpoint'] = '1.00:00:00'
        }

        Test-TargetResourceFunctionality -Params $testParams `
                                         -ContextLabel 'Reset values to default' `
                                         -ExpectedGetResults $expectedGetResults
        
        Test-ArrayContentsEqual -TestParams $testParams `
                                -DesiredArrayContents $testParams.SharingPolicySchedule `
                                -GetResultParameterName 'SharingPolicySchedule' `
                                -ContextLabel 'Verify SharingPolicySchedule' `
                                -ItLabel 'SharingPolicySchedule should be empty'
    }
}
else
{
    Write-Verbose -Message 'Tests in this file require that Exchange is installed to be run.'
}