Tests/Unit/MSFT_xSQLServerRSConfig.Tests.ps1

$script:DSCModuleName = 'xSQLServer'
$script:DSCResourceName = 'MSFT_xSQLServerRSConfig'

#region HEADER

# Unit Test Template Version: 1.2.0
$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or `
    (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) )
{
    & git @('clone', 'https://github.com/PowerShell/DscResource.Tests.git', (Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\'))
}

Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force

$TestEnvironment = Initialize-TestEnvironment `
    -DSCModuleName $script:DSCModuleName   `
    -DSCResourceName $script:DSCResourceName  `
    -TestType Unit

#endregion HEADER

function Invoke-TestSetup
{
    Import-Module -Name (Join-Path -Path (Join-Path -Path (Join-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'Tests') -ChildPath 'Unit') -ChildPath 'Stubs') -ChildPath 'SQLPSStub.psm1') -Global -Force
}

function Invoke-TestCleanup
{
    Restore-TestEnvironment -TestEnvironment $TestEnvironment
}

# Begin Testing
try
{
    Invoke-TestSetup

    InModuleScope $script:DSCResourceName {
        $mockNamedInstanceName = 'INSTANCE'
        $mockDefaultInstanceName = 'MSSQLSERVER'
        $mockReportingServicesDatabaseServerName = 'SERVER'
        $mockReportingServicesDatabaseNamedInstanceName = $mockNamedInstanceName
        $mockReportingServicesDatabaseDefaultInstanceName = $mockDefaultInstanceName

        $mockReportsApplicationName = 'ReportServerWebApp'
        $mockReportsApplicationNameLegacy = 'ReportManager'
        $mockReportServerApplicationName = 'ReportServerWebService'
        $mockReportsApplicationUrl = 'http://+:80'
        $mockReportServerApplicationUrl = 'http://+:80'
        $mockVirtualDirectoryReportManagerName = 'Reports_SQL2016'
        $mockVirtualDirectoryReportServerName = 'ReportServer_SQL2016'

        $mockGetItemProperty = {
            return @{
                InstanceName = $mockInstanceName
                Version      = $mockDynamic_SqlBuildVersion
            }
        }

        $mockGetWmiObject_ConfigurationSetting_NamedInstance = {
            return @(
                (
                    New-Object Object |
                        Add-Member -MemberType NoteProperty -Name 'DatabaseServerName' -Value "$mockReportingServicesDatabaseServerName\$mockReportingServicesDatabaseNamedInstanceName" -PassThru |
                        Add-Member -MemberType NoteProperty -Name 'IsInitialized' -Value $mockDynamicIsInitialized -PassThru |
                        Add-Member -MemberType NoteProperty -Name 'InstanceName' -Value $mockNamedInstanceName -PassThru |
                        Add-Member -MemberType NoteProperty -Name 'VirtualDirectoryReportServer' -Value $mockVirtualDirectoryReportServerName -PassThru |
                        Add-Member -MemberType NoteProperty -Name 'VirtualDirectoryReportManager' -Value $mockVirtualDirectoryReportManagerName -PassThru |
                        Add-Member -MemberType ScriptMethod -Name SetVirtualDirectory {
                        $script:mockIsMethodCalled_SetVirtualDirectory = $true

                        return $null
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name ReserveURL {
                        $script:mockIsMethodCalled_ReserveURL = $true

                        return $null
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name GenerateDatabaseCreationScript {
                        $script:mockIsMethodCalled_GenerateDatabaseCreationScript = $true

                        return @{
                            Script = 'select * from something'
                        }
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name GenerateDatabaseRightsScript {
                        $script:mockIsMethodCalled_GenerateDatabaseRightsScript = $true

                        return @{
                            Script = 'select * from something'
                        }
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name SetDatabaseConnection {
                        $script:mockIsMethodCalled_SetDatabaseConnection = $true

                        return $null
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name InitializeReportServer {
                        $script:mockIsMethodCalled_InitializeReportServer = $true

                        return $null
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name RemoveURL {
                        $script:mockIsMethodCalled_RemoveURL = $true

                        return $null
                    } -PassThru |
                        Add-Member -MemberType ScriptMethod -Name ListReservedUrls {
                        $script:mockIsMethodCalled_ListReservedUrls = $true

                        return New-Object Object |
                            Add-Member -MemberType ScriptProperty -Name 'Application' {
                            return @(
                                $mockDynamicReportServerApplicationName,
                                $mockDynamicReportsApplicationName
                            )
                        } -PassThru |
                            Add-Member -MemberType ScriptProperty -Name 'UrlString' {
                            return @(
                                $mockDynamicReportsApplicationUrlString,
                                $mockDynamicReportServerApplicationUrlString
                            )
                        } -PassThru -Force
                    } -PassThru -Force
                ),
                (
                    # Array is a regression test for issue #819.
                    New-Object Object |
                        Add-Member -MemberType NoteProperty -Name 'DatabaseServerName' -Value "$mockReportingServicesDatabaseServerName\$mockReportingServicesDatabaseNamedInstanceName" -PassThru |
                        Add-Member -MemberType NoteProperty -Name 'IsInitialized' -Value $true -PassThru |
                        Add-Member -MemberType NoteProperty -Name 'InstanceName' -Value 'DummyInstance' -PassThru -Force
                )
            )
        }

        $mockGetWmiObject_ConfigurationSetting_DefaultInstance = {
            return New-Object Object |
                Add-Member -MemberType NoteProperty -Name 'DatabaseServerName' -Value "$mockReportingServicesDatabaseServerName" -PassThru |
                Add-Member -MemberType NoteProperty -Name 'IsInitialized' -Value $false -PassThru |
                Add-Member -MemberType NoteProperty -Name 'InstanceName' -Value $mockDefaultInstanceName -PassThru |
                Add-Member -MemberType NoteProperty -Name 'VirtualDirectoryReportServer' -Value '' -PassThru |
                Add-Member -MemberType NoteProperty -Name 'VirtualDirectoryReportManager' -Value '' -PassThru |
                Add-Member -MemberType ScriptMethod -Name SetVirtualDirectory {
                $script:mockIsMethodCalled_SetVirtualDirectory = $true

                return $null
            } -PassThru |
                Add-Member -MemberType ScriptMethod -Name ReserveURL {
                $script:mockIsMethodCalled_ReserveURL = $true

                return $null
            } -PassThru |
                Add-Member -MemberType ScriptMethod -Name GenerateDatabaseCreationScript {
                $script:mockIsMethodCalled_GenerateDatabaseCreationScript = $true

                return @{
                    Script = 'select * from something'
                }
            } -PassThru |
                Add-Member -MemberType ScriptMethod -Name GenerateDatabaseRightsScript {
                $script:mockIsMethodCalled_GenerateDatabaseRightsScript = $true

                return @{
                    Script = 'select * from something'
                }
            } -PassThru |
                Add-Member -MemberType ScriptMethod -Name SetDatabaseConnection {
                $script:mockIsMethodCalled_SetDatabaseConnection = $true

                return $null
            } -PassThru |
                Add-Member -MemberType ScriptMethod -Name InitializeReportServer {
                $script:mockIsMethodCalled_InitializeReportServer = $true

                return $null
            } -PassThru -Force
        }

        $mockGetWmiObject_ConfigurationSetting_ParameterFilter = {
            $Class -eq 'MSReportServer_ConfigurationSetting'
        }

        $mockGetWmiObject_Language = {
            return @{
                Language = '1033'
            }
        }

        $mockGetWmiObject_OperatingSystem_ParameterFilter = {
            $Class -eq 'Win32_OperatingSystem'
        }

        Describe "xSQLServerRSConfig\Get-TargetResource" -Tag 'Get' {
            BeforeAll {
                $mockDynamic_SqlBuildVersion = '13.0.4001.0'

                Mock -CommandName Get-ItemProperty -MockWith $mockGetItemProperty -Verifiable

                $defaultParameters = @{
                    InstanceName      = $mockNamedInstanceName
                    RSSQLServer       = $mockReportingServicesDatabaseServerName
                    RSSQLInstanceName = $mockReportingServicesDatabaseNamedInstanceName
                }
            }

            Context 'When the system is in the desired state' {
                BeforeAll {
                    $mockDynamicReportServerApplicationName = $mockReportServerApplicationName
                    $mockDynamicReportsApplicationName = $mockReportsApplicationName
                    $mockDynamicReportsApplicationUrlString = $mockReportsApplicationUrl
                    $mockDynamicReportServerApplicationUrlString = $mockReportServerApplicationUrl

                    $mockDynamicIsInitialized = $true
                }

                BeforeEach {
                    Mock -CommandName Get-WmiObject `
                        -MockWith $mockGetWmiObject_ConfigurationSetting_NamedInstance `
                        -ParameterFilter $mockGetWmiObject_ConfigurationSetting_ParameterFilter `
                        -Verifiable
                }

                $mockDynamicIsInitialized = $true

                It 'Should return the same values as passed as parameters' {
                    $resultGetTargetResource = Get-TargetResource @defaultParameters
                    $resultGetTargetResource.InstanceName | Should Be $mockNamedInstanceName
                    $resultGetTargetResource.RSSQLServer | Should Be $mockReportingServicesDatabaseServerName
                    $resultGetTargetResource.RSSQLInstanceName | Should Be $mockReportingServicesDatabaseNamedInstanceName
                    $resultGetTargetResource | Should BeOfType [System.Collections.Hashtable]
                }

                It 'Should return the the state as initialized' {
                    $resultGetTargetResource = Get-TargetResource @defaultParameters
                    $resultGetTargetResource.IsInitialized | Should Be $true
                    $resultGetTargetResource.ReportServerVirtualDirectory | Should Be $mockVirtualDirectoryReportServerName
                    $resultGetTargetResource.ReportsVirtualDirectory | Should Be $mockVirtualDirectoryReportManagerName
                    $resultGetTargetResource.ReportServerReservedUrl | Should Be $mockReportServerApplicationUrl
                    $resultGetTargetResource.ReportsReservedUrl | Should Be $mockReportsApplicationUrl
                }
            }

            Context 'When the system is not in the desired state' {
                BeforeAll {
                    $mockDynamicIsInitialized = $false
                }

                BeforeEach {
                    Mock -CommandName Get-WmiObject `
                        -MockWith $mockGetWmiObject_ConfigurationSetting_DefaultInstance `
                        -ParameterFilter $mockGetWmiObject_ConfigurationSetting_ParameterFilter `
                        -Verifiable

                    $testParameters = $defaultParameters.Clone()
                    $testParameters['InstanceName'] = $mockDefaultInstanceName
                }

                $mockDynamicIsInitialized = $false

                It 'Should return the same values as passed as parameters' {
                    $resultGetTargetResource = Get-TargetResource @testParameters
                    $resultGetTargetResource.InstanceName | Should Be $mockDefaultInstanceName
                    $resultGetTargetResource.RSSQLServer | Should Be $mockReportingServicesDatabaseServerName
                    $resultGetTargetResource.RSSQLInstanceName | Should Be $mockReportingServicesDatabaseDefaultInstanceName
                    $resultGetTargetResource | Should BeOfType [System.Collections.Hashtable]
                }

                It 'Should return the state as not initialized' {
                    $resultGetTargetResource = Get-TargetResource @testParameters
                    $resultGetTargetResource.IsInitialized | Should Be $false
                    $resultGetTargetResource.ReportServerVirtualDirectory | Should BeNullOrEmpty
                    $resultGetTargetResource.ReportsVirtualDirectory | Should BeNullOrEmpty
                    $resultGetTargetResource.ReportServerReservedUrl | Should BeNullOrEmpty
                    $resultGetTargetResource.ReportsReservedUrl | Should BeNullOrEmpty
                }

                # Regression test for issue #822.
                Context 'When Reporting Services has not been initialized (IsInitialized returns $null)' {
                    $mockDynamicIsInitialized = $null

                    It 'Should return the state as not initialized' {
                        $resultGetTargetResource = Get-TargetResource @testParameters
                        $resultGetTargetResource.IsInitialized | Should Be $false
                    }
                }

                # Regression test for issue #822.
                Context 'When Reporting Services has not been initialized (IsInitialized returns empty string)' {
                    $mockDynamicIsInitialized = ''

                    It 'Should return the state as not initialized' {
                        $resultGetTargetResource = Get-TargetResource @testParameters
                        $resultGetTargetResource.IsInitialized | Should Be $false
                    }
                }

                Context 'When there is no Reporting Services instance' {
                    BeforeEach {
                        Mock -CommandName Get-ItemProperty
                    }

                    It 'Should throw the correct error message' {
                        { Get-TargetResource @defaultParameters } | Should Throw 'SQL Reporting Services instance ''INSTANCE'' does not exist!'
                    }
                }
            }

            Assert-VerifiableMock
        }

        Describe "xSQLServerRSConfig\Set-TargetResource" -Tag 'Set' {
            BeforeAll {
                Mock -CommandName Import-SQLPSModule -Verifiable
                Mock -CommandName Invoke-Sqlcmd -Verifiable
                Mock -CommandName Get-ItemProperty -MockWith $mockGetItemProperty -Verifiable
                Mock -CommandName Restart-ReportingServicesService -Verifiable
            }

            Context 'When the system is not in the desired state' {
                Context 'When configuring a named instance that are not initialized' {
                    BeforeAll {
                        $mockDynamic_SqlBuildVersion = '13.0.4001.0'
                        $mockDynamicIsInitialized = $false

                        Mock -CommandName Test-TargetResource -MockWith {
                            return $true
                        }

                        $defaultParameters = @{
                            InstanceName      = $mockNamedInstanceName
                            RSSQLServer       = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName = $mockReportingServicesDatabaseNamedInstanceName
                        }
                    }

                    BeforeEach {
                        Mock -CommandName Get-WmiObject `
                            -MockWith $mockGetWmiObject_ConfigurationSetting_NamedInstance `
                            -ParameterFilter $mockGetWmiObject_ConfigurationSetting_ParameterFilter `
                            -Verifiable

                        Mock -CommandName Get-WmiObject `
                            -MockWith $mockGetWmiObject_Language `
                            -ParameterFilter $mockGetWmiObject_OperatingSystem_ParameterFilter `
                            -Verifiable

                        # Start each test with each method in correct state.
                        $script:mockIsMethodCalled_GenerateDatabaseCreationScript = $false
                        $script:mockIsMethodCalled_GenerateDatabaseRightsScript = $false
                        $script:mockIsMethodCalled_SetVirtualDirectory = $false
                        $script:mockIsMethodCalled_ReserveURL = $false
                        $script:mockIsMethodCalled_SetDatabaseConnection = $false
                        $script:mockIsMethodCalled_InitializeReportServer = $false
                    }

                    It 'Should configure Reporting Service without throwing an error' {
                        { Set-TargetResource @defaultParameters } | Should Not Throw

                        # Test so each mock of methods was called.
                        $script:mockIsMethodCalled_GenerateDatabaseRightsScript | Should Be $true
                        $script:mockIsMethodCalled_GenerateDatabaseCreationScript | Should Be $true
                        $script:mockIsMethodCalled_SetVirtualDirectory | Should Be $true
                        $script:mockIsMethodCalled_ReserveURL | Should Be $true
                        $script:mockIsMethodCalled_SetDatabaseConnection | Should Be $true
                        $script:mockIsMethodCalled_InitializeReportServer | Should Be $true

                        Assert-MockCalled -CommandName Get-WmiObject -Exactly -Times 2 -Scope It
                        Assert-MockCalled -CommandName Invoke-Sqlcmd -Exactly -Times 2 -Scope It
                        Assert-MockCalled -CommandName Restart-ReportingServicesService -Exactly -Times 1 -Scope It
                    }

                    Context 'When there is no Reporting Services instance after Set-TargetResource has been called' {
                        BeforeEach {
                            Mock -CommandName Get-ItemProperty -Verifiable
                            Mock -CommandName Test-TargetResource -Verifiable
                        }

                        It 'Should throw the correct error message' {
                            { Set-TargetResource @defaultParameters } | Should Throw 'Test-TargetResource returned false after calling set.'
                        }
                    }

                    Context 'When it is not possible to evaluate OSLanguage' {
                        BeforeEach {
                            Mock -CommandName Get-WmiObject -MockWith {
                                return $null
                            } -ParameterFilter $mockGetWmiObject_OperatingSystem_ParameterFilter -Verifiable                        }

                        It 'Should throw the correct error message' {
                            { Set-TargetResource @defaultParameters } | Should Throw 'Unable to find WMI object Win32_OperatingSystem.'
                        }
                    }
                }

                Context 'When configuring a named instance that are already initialized' {
                    BeforeAll {
                        $mockDynamic_SqlBuildVersion = '13.0.4001.0'
                        $mockDynamicIsInitialized = $true

                        Mock -CommandName Get-TargetResource -MockWith {
                            return @{
                                ReportServerReservedUrl = $mockReportServerApplicationUrl
                                ReportsReservedUrl      = $mockReportsApplicationUrl
                            }
                        }

                        Mock -CommandName Test-TargetResource -MockWith {
                            return $true
                        }

                        $testParameters = @{
                            InstanceName                 = $mockNamedInstanceName
                            RSSQLServer                  = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName            = $mockReportingServicesDatabaseNamedInstanceName
                            ReportServerVirtualDirectory = 'ReportServer_NewName'
                            ReportsVirtualDirectory      = 'Reports_NewName'
                            ReportServerReservedUrl      = 'https://+:4443'
                            ReportsReservedUrl           = 'https://+:4443'
                        }
                    }

                    BeforeEach {
                        Mock -CommandName Get-WmiObject `
                            -MockWith $mockGetWmiObject_ConfigurationSetting_NamedInstance `
                            -ParameterFilter $mockGetWmiObject_ConfigurationSetting_ParameterFilter `
                            -Verifiable

                        Mock -CommandName Get-WmiObject `
                            -MockWith $mockGetWmiObject_Language `
                            -ParameterFilter $mockGetWmiObject_OperatingSystem_ParameterFilter `
                            -Verifiable

                        # Start each test with each method in correct state.
                        $script:mockIsMethodCalled_GenerateDatabaseCreationScript = $false
                        $script:mockIsMethodCalled_GenerateDatabaseRightsScript = $false
                        $script:mockIsMethodCalled_SetVirtualDirectory = $false
                        $script:mockIsMethodCalled_ReserveURL = $false
                        $script:mockIsMethodCalled_SetDatabaseConnection = $false
                        $script:mockIsMethodCalled_InitializeReportServer = $false
                    }

                    It 'Should configure Reporting Service without throwing an error' {
                        { Set-TargetResource @testParameters } | Should Not Throw

                        # Test so each mock of methods was called.
                        $script:mockIsMethodCalled_GenerateDatabaseRightsScript | Should Be $false
                        $script:mockIsMethodCalled_GenerateDatabaseCreationScript | Should Be $false
                        $script:mockIsMethodCalled_SetVirtualDirectory | Should Be $true
                        $script:mockIsMethodCalled_ReserveURL | Should Be $true
                        $script:mockIsMethodCalled_SetDatabaseConnection | Should Be $false
                        $script:mockIsMethodCalled_InitializeReportServer | Should Be $false

                        Assert-MockCalled -CommandName Get-WmiObject -Exactly -Times 2 -Scope It
                        Assert-MockCalled -CommandName Invoke-Sqlcmd -Exactly -Times 0 -Scope It
                    }
                }

                Context 'When configuring a default instance that are not initialized' {
                    BeforeAll {
                        $mockDynamic_SqlBuildVersion = '12.0.4100.1'
                        $mockDynamicIsInitialized = $false

                        Mock -CommandName Test-TargetResource -MockWith {
                            return $true
                        } -Verifiable

                        $defaultParameters = @{
                            InstanceName      = $mockDefaultInstanceName
                            RSSQLServer       = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName = $mockReportingServicesDatabaseDefaultInstanceName
                        }
                    }

                    BeforeEach {
                        Mock -CommandName Get-WmiObject `
                            -MockWith $mockGetWmiObject_ConfigurationSetting_DefaultInstance `
                            -ParameterFilter $mockGetWmiObject_ConfigurationSetting_ParameterFilter `
                            -Verifiable

                        Mock -CommandName Get-WmiObject `
                            -MockWith $mockGetWmiObject_Language `
                            -ParameterFilter $mockGetWmiObject_OperatingSystem_ParameterFilter `
                            -Verifiable
                    }

                    It 'Should configure Reporting Service without throwing an error' {
                        { Set-TargetResource @defaultParameters } | Should Not Throw

                        # Test so each mock of methods was called.
                        $script:mockIsMethodCalled_GenerateDatabaseRightsScript | Should Be $true
                        $script:mockIsMethodCalled_GenerateDatabaseCreationScript | Should Be $true
                        $script:mockIsMethodCalled_SetVirtualDirectory | Should Be $true
                        $script:mockIsMethodCalled_ReserveURL | Should Be $true
                        $script:mockIsMethodCalled_SetDatabaseConnection | Should Be $true
                        $script:mockIsMethodCalled_InitializeReportServer | Should Be $true

                        Assert-MockCalled -CommandName Get-WmiObject -Exactly -Times 2 -Scope It
                        Assert-MockCalled -CommandName Invoke-Sqlcmd -Exactly -Times 2 -Scope It
                        Assert-MockCalled -CommandName Restart-ReportingServicesService -Exactly -Times 1 -Scope It
                    }
                }
            }

            Assert-VerifiableMock
        }

        Describe "xSQLServerRSConfig\Test-TargetResource" -Tag 'Test' {
            Context 'When the system is not in the desired state' {
                Context 'When Reporting Services are not initialized' {
                    BeforeAll {
                        Mock -CommandName Get-TargetResource -MockWith {
                            return @{
                                IsInitialized = $false
                            }
                        } -Verifiable

                        $testParameters = @{
                            InstanceName      = $mockNamedInstanceName
                            RSSQLServer       = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName = $mockReportingServicesDatabaseNamedInstanceName
                        }
                    }

                    It 'Should return state as not in desired state' {
                        $resultTestTargetResource = Test-TargetResource @testParameters
                        $resultTestTargetResource | Should Be $false
                    }
                }

                Context 'When Report Server virtual directory is different' {
                    BeforeAll {
                        Mock -CommandName Get-TargetResource -MockWith {
                            return @{
                                IsInitialized                = $true
                                ReportServerVirtualDirectory = $mockVirtualDirectoryReportServerName
                                ReportsVirtualDirectory      = $mockVirtualDirectoryReportsName
                            }
                        } -Verifiable

                        $testParameters = @{
                            InstanceName                 = $mockNamedInstanceName
                            RSSQLServer                  = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName            = $mockReportingServicesDatabaseNamedInstanceName
                            ReportsVirtualDirectory      = $mockVirtualDirectoryReportsName
                            ReportServerVirtualDirectory = 'ReportServer_NewName'
                        }
                    }

                    It 'Should return state as not in desired state' {
                        $resultTestTargetResource = Test-TargetResource @testParameters
                        $resultTestTargetResource | Should Be $false
                    }
                }

                Context 'When Report Server virtual directory is different' {
                    BeforeAll {
                        Mock -CommandName Get-TargetResource -MockWith {
                            return @{
                                IsInitialized                = $true
                                ReportServerVirtualDirectory = $mockVirtualDirectoryReportServerName
                                ReportsVirtualDirectory      = $mockVirtualDirectoryReportsName
                            }
                        } -Verifiable

                        $testParameters = @{
                            InstanceName                 = $mockNamedInstanceName
                            RSSQLServer                  = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName            = $mockReportingServicesDatabaseNamedInstanceName
                            ReportServerVirtualDirectory = $mockVirtualDirectoryReportServerName
                            ReportsVirtualDirectory      = 'Reports_NewName'
                        }
                    }

                    It 'Should return state as not in desired state' {
                        $resultTestTargetResource = Test-TargetResource @testParameters
                        $resultTestTargetResource | Should Be $false
                    }
                }

                Context 'When Report Server Report Server reserved URLs is different' {
                    BeforeAll {
                        Mock -CommandName Get-TargetResource -MockWith {
                            return @{
                                IsInitialized           = $true
                                ReportServerReservedUrl = $mockReportServerApplicationUrl
                            }
                        } -Verifiable

                        $testParameters = @{
                            InstanceName            = $mockNamedInstanceName
                            RSSQLServer             = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName       = $mockReportingServicesDatabaseNamedInstanceName
                            ReportServerReservedUrl = 'https://+:443'
                        }
                    }

                    It 'Should return state as not in desired state' {
                        $resultTestTargetResource = Test-TargetResource @testParameters
                        $resultTestTargetResource | Should Be $false
                    }
                }

                Context 'When Report Server Reports reserved URLs is different' {
                    BeforeAll {
                        Mock -CommandName Get-TargetResource -MockWith {
                            return @{
                                IsInitialized      = $true
                                ReportsReservedUrl = $mockReportServerApplicationUrl
                            }
                        } -Verifiable

                        $testParameters = @{
                            InstanceName       = $mockNamedInstanceName
                            RSSQLServer        = $mockReportingServicesDatabaseServerName
                            RSSQLInstanceName  = $mockReportingServicesDatabaseNamedInstanceName
                            ReportsReservedUrl = 'https://+:443'
                        }
                    }

                    It 'Should return state as not in desired state' {
                        $resultTestTargetResource = Test-TargetResource @testParameters
                        $resultTestTargetResource | Should Be $false
                    }
                }
            }

            Context 'When the system is in the desired state' {
                BeforeAll {
                    Mock -CommandName Get-TargetResource -MockWith {
                        return @{
                            IsInitialized = $true
                        }
                    } -Verifiable

                    $defaultParameters = @{
                        InstanceName      = $mockNamedInstanceName
                        RSSQLServer       = $mockReportingServicesDatabaseServerName
                        RSSQLInstanceName = $mockReportingServicesDatabaseNamedInstanceName
                    }
                }

                It 'Should return state as in desired state' {
                    $resultTestTargetResource = Test-TargetResource @defaultParameters
                    $resultTestTargetResource | Should Be $true
                }
            }

            Assert-VerifiableMock
        }
    }
}
finally
{
    Invoke-TestCleanup
}