Tests/Unit/SBHost.Tests.ps1

#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\'))
}

# Deviating from test template to accomodate copying DSC class resources for tests
if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResources'))) )
{
    Copy-Item -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCClassResources')`
        -Destination (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResources') -Container -Recurse
}

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

# Deviating from test template to accomodate copying DSC class resources for tests
Get-Module -All | Where-Object{$_.Name -eq 'SBHost'} | Remove-Module -Force -ErrorAction SilentlyContinue
$TestEnvironment = Initialize-TestEnvironment `
    -DSCModuleName 'ServiceBusForWindowsServerDsc' `
    -DSCResourceName 'SBHost' `
    -TestType Unit

#endregion HEADER

function Invoke-TestSetup {
    $serviceBusCmdletModule = Join-Path -Path $PSScriptRoot -ChildPath "Stubs\ServiceBus\2.0.40512.2\Microsoft.ServiceBus.Commands.psm1" -Resolve
    Import-Module -Name $serviceBusCmdletModule -Scope 'Global' -Force
    Import-Module -Name (Join-Path -Path $moduleRoot -ChildPath "Modules\SB.Util\SB.Util.psm1") -Scope 'Global' -Force
}

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

# Begin Testing
try
{
    Invoke-TestSetup

    InModuleScope 'SBHost' {
        # Arrange
        $testSBHost = [SBHost]::new()
        $testSBHost.EnableFirewallRules = $true
        $testSBHost.Ensure = [Ensure]::Present
        $testSBHost.ExternalBrokerPort = 1024
        $testSBHost.ExternalBrokerUrl = 'externalbroker.azurewebsites.net'
        $runAsPasswordCredentialParams = @{
            TypeName = 'System.Management.Automation.PSCredential'
            ArgumentList = @(
                "servicebus@contoso",
                (ConvertTo-SecureString -String "password" -AsPlainText -Force)
            )
        }
        $testSBHost.RunAsPassword = New-Object @runAsPasswordCredentialParams
        $testSBHost.SBFarmDBConnectionStringDataSource = "SQLSERVER.contoso.com"
        $testSBHost.Started = $true

        Mock Add-SBHost {}
        Mock Remove-SBHost {}
        Mock Start-SBHost {}
        Mock Stop-SBHost {}
        Mock Update-SBHost {}
        Mock Get-CimInstance {
            [CmdletBinding()]
            param
            (
                [Parameter(Mandatory)]
                [string]
                $ClassName
            )
            return @{
                Domain = 'contoso.com'
            }
        }
        $env:COMPUTERNAME = "servicebus03"

        $hostName = "$env:COMPUTERNAME.$((Get-CimInstance -ClassName WIN32_ComputerSystem).Domain)"

        Describe 'SBHost' {
            Context "Current host is not joined to farm and should be joined and started" {
                #Arrange
                Mock Get-SBFarm {
                    return @{
                        FarmType                      = 'SB'
                        SBFarmDBConnectionString      = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBManagementDB;Integrated Security=True;Encrypt=False'
                        ClusterConnectionEndpointPort = 9000
                        ClientConnectionEndpointPort  = 9001
                        LeaseDriverEndpointPort       = 9002
                        ServiceConnectionEndpointPort = 9003
                        RunAsAccount                  = 'servicebus@contoso'
                        AdminGroup                    = 'BUILTIN\Administrators'
                        GatewayDBConnectionString     = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBGatewayDB;Integrated Security=True;Encrypt=False'
                        HttpsPort                     = 9355
                        TcpPort                       = 9354
                        MessageBrokerPort             = 9356
                        AmqpsPort                     = 5671
                        AmqpPort                      = 5672
                        FarmCertificate               = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        EncryptionCertificate         = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        Hosts                         = @(
                            @{
                                Name               = 'servicebus01.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = 'servicebus02.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            }
                        )
                        RPHttpsPort                   = 9359
                        RPHttpsUrl                    = 'https://servicebus.contoso.com:9359/'
                        FarmDNS                       = 'servicebus.contoso.com'
                        AdminApiUserName              = 'adminUser'
                        TenantApiUserName             = 'tenantUser'
                        BrokerExternalUrls            = $null
                    }
                }
                Mock Get-SBFarmStatus {
                    return @(
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        }
                    )
                }

                It "returns result with Ensure value as Absent from the Get method" {
                    # Act
                    $currentValues = $testSBHost.Get()

                    # Assert
                    $currentValues.Ensure | Should BeExactly 'Absent'
                }

                It "returns false from the Test method" {
                    # Act | Assert
                    $testSBHost.Test() | Should Be $false
                }

                It "calls Add-SBHost cmdlet in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Add-SBHost
                }

                It "calls Start-SBHost cmdlet in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Start-SBHost
                }
            }

            Context "Current host is joined to the farm but should be removed" {
                Mock Get-SBFarm {
                    return @{
                        FarmType                      = 'SB'
                        SBFarmDBConnectionString      = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBManagementDB;Integrated Security=True;Encrypt=False'
                        ClusterConnectionEndpointPort = 9000
                        ClientConnectionEndpointPort  = 9001
                        LeaseDriverEndpointPort       = 9002
                        ServiceConnectionEndpointPort = 9003
                        RunAsAccount                  = 'servicebus@contoso'
                        AdminGroup                    = 'BUILTIN\Administrators'
                        GatewayDBConnectionString     = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBGatewayDB;Integrated Security=True;Encrypt=False'
                        HttpsPort                     = 9355
                        TcpPort                       = 9354
                        MessageBrokerPort             = 9356
                        AmqpsPort                     = 5671
                        AmqpPort                      = 5672
                        FarmCertificate               = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        EncryptionCertificate         = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        Hosts                         = @(
                            @{
                                Name               = 'servicebus01.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = 'servicebus02.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = $hostName
                                ConfigurationState = 'HostConfigurationCompleted'
                            }
                        )
                        RPHttpsPort                   = 9359
                        RPHttpsUrl                    = 'https://servicebus.contoso.com:9359/'
                        FarmDNS                       = 'servicebus.contoso.com'
                        AdminApiUserName              = 'adminUser'
                        TenantApiUserName             = 'tenantUser'
                        BrokerExternalUrls            = $null
                    }
                }
                Mock Get-SBFarmStatus {
                    return @(
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        }
                    )
                }

                $testSBHost.Ensure = 'Absent'

                It "returns current values from the Get method" {
                    # Act | Assert
                    $testSBHost.Get() | Should Not BeNullOrEmpty
                }

                It "returns false from the Test method" {
                    # Act | Assert
                    $testSBHost.Test() | Should Be $false
                }

                It "calls Stop-SBHost in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Stop-SBHost
                }

                It "calls Remove-SBHost in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Remove-SBHost
                }

                # Cleanup
                $testSBHost.Ensure = 'Present'
            }

            Context "Current host is joined to farm but is stopped and should be started" {
                Mock Get-SBFarm {
                    return @{
                        FarmType                      = 'SB'
                        SBFarmDBConnectionString      = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBManagementDB;Integrated Security=True;Encrypt=False'
                        ClusterConnectionEndpointPort = 9000
                        ClientConnectionEndpointPort  = 9001
                        LeaseDriverEndpointPort       = 9002
                        ServiceConnectionEndpointPort = 9003
                        RunAsAccount                  = 'servicebus@contoso'
                        AdminGroup                    = 'BUILTIN\Administrators'
                        GatewayDBConnectionString     = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBGatewayDB;Integrated Security=True;Encrypt=False'
                        HttpsPort                     = 9355
                        TcpPort                       = 9354
                        MessageBrokerPort             = 9356
                        AmqpsPort                     = 5671
                        AmqpPort                      = 5672
                        FarmCertificate               = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        EncryptionCertificate         = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        Hosts                         = @(
                            @{
                                Name               = 'servicebus01.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = 'servicebus02.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = $hostName
                                ConfigurationState = 'HostConfigurationCompleted'
                            }
                        )
                        RPHttpsPort                   = 9359
                        RPHttpsUrl                    = 'https://servicebus.contoso.com:9359/'
                        FarmDNS                       = 'servicebus.contoso.com'
                        AdminApiUserName              = 'adminUser'
                        TenantApiUserName             = 'tenantUser'
                        BrokerExternalUrls            = $null
                    }
                }
                Mock Get-SBFarmStatus {
                    return @(
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Gateway"
                            Status      = "Stopped"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Stopped"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Stopped"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus VSS"
                            Status      = "Stopped"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "FabricHostSvc"
                            Status      = "Stopped"
                        }
                    )
                }

                It "returns current values from the Get method" {
                    # Act | Assert
                    $testSBHost.Get() | Should Not BeNullOrEmpty
                }

                It "returns false from the Test method" {
                    # Act | Assert
                    $testSBHost.Test() | Should Be $false
                }

                It "calls Update-SBHost in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Update-SBHost
                }

                It "calls Start-SBHost in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Start-SBHost
                }
            }

            Context "Current host is joined to farm but is started and should be stopped" {
                Mock Get-SBFarm {
                    return @{
                        FarmType                      = 'SB'
                        SBFarmDBConnectionString      = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBManagementDB;Integrated Security=True;Encrypt=False'
                        ClusterConnectionEndpointPort = 9000
                        ClientConnectionEndpointPort  = 9001
                        LeaseDriverEndpointPort       = 9002
                        ServiceConnectionEndpointPort = 9003
                        RunAsAccount                  = 'servicebus@contoso'
                        AdminGroup                    = 'BUILTIN\Administrators'
                        GatewayDBConnectionString     = 'Data Source=SQLSERVER.contoso.com;Initial Catalog=SBGatewayDB;Integrated Security=True;Encrypt=False'
                        HttpsPort                     = 9355
                        TcpPort                       = 9354
                        MessageBrokerPort             = 9356
                        AmqpsPort                     = 5671
                        AmqpPort                      = 5672
                        FarmCertificate               = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        EncryptionCertificate         = @{
                            Thumbprint  = '62C99D4B5711E2482A5A1AECE6F8D05231D5678D'
                            IsGenerated = 'False'
                        }
                        Hosts                         = @(
                            @{
                                Name               = 'servicebus01.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = 'servicebus02.contoso.com'
                                ConfigurationState = 'HostConfigurationCompleted'
                            },
                            @{
                                Name               = $hostName
                                ConfigurationState = 'HostConfigurationCompleted'
                            }
                        )
                        RPHttpsPort                   = 9359
                        RPHttpsUrl                    = 'https://servicebus.contoso.com:9359/'
                        FarmDNS                       = 'servicebus.contoso.com'
                        AdminApiUserName              = 'adminUser'
                        TenantApiUserName             = 'tenantUser'
                        BrokerExternalUrls            = $null
                    }
                }
                Mock Get-SBFarmStatus {
                    return @(
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 1
                            HostName    = 'servicebus01.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 2
                            HostName    = 'servicebus02.contoso.com'
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Gateway"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Message Broker"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus Resource Provider"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "Service Bus VSS"
                            Status      = "Running"
                        },
                        @{
                            HostId      = 3
                            HostName    = $hostName
                            ServiceName = "FabricHostSvc"
                            Status      = "Running"
                        }
                    )
                }

                $testSBHost.Started = $false

                It "returns current values from the Get method" {
                    # Act | Assert
                    $testSBHost.Get() | Should Not BeNullOrEmpty
                }

                It "returns false from the Test method" {
                    # Act | Assert
                    $testSBHost.Test() | Should Be $false
                }

                It "calls Stop-SBHost in the Set method" {
                    # Act
                    $testSBHost.Set()

                    # Assert
                    Assert-MockCalled -CommandName Stop-SBHost
                }

                # Cleanup
                $testSBHost.Started = $true
            }
        }
    }
}
finally
{
    Invoke-TestCleanup
}