. $PSScriptRoot\..\..\Load-PesterModules.ps1 $here = Split-Path -Parent $MyInvocation.MyCommand.Path $sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.tests\.', '.' $functionPath = Join-Path -Path $here -ChildPath $sut Write-Host "Overriding SUT: $functionPath" Import-Module $functionPath -Force $moduleForMock = "" Describe "Get-HostnamesByEnvironmentName" { # Load up AWSPowerShell for Mocking if Available $awsPowerShellLoaded = $false if ($null -ne (Get-Module -ListAvailable AWSPowerShell)) { Import-AWSModule # EC2 $awsPowerShellLoaded = $true } else { Write-Warning "AWSPowerShell Module *NOT* installed. Some tests will not execute." } Context "Parameter Validation" { It "Null Environment Name Should Throw" { { Get-HostnamesByEnvironmentName -EnvironmentName $null } | Should Throw } It "Empty Environment Name Should Throw" { { Get-HostnamesByEnvironmentName -EnvironmentName '' } | Should Throw } } Context "Get-Environment Is Called When EnvironmentType Parameter Is Null" { Mock -CommandName Get-Environment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-DesignationTagNameByEnvironment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { return @() } $result = ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType $null ) It "Get-Environment Is Called One Time" { Assert-MockCalled Get-Environment -Times 1 -Exactly -Scope Context -ModuleName $moduleForMock } } Context "Get-Environment Is Called When EnvironmentType Parameter Is Empty" { Mock -CommandName Get-Environment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-DesignationTagNameByEnvironment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { return @() } $result = ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType '' ) It "Get-Environment Is Called One Time" { Assert-MockCalled Get-Environment -Times 1 -Exactly -Scope Context -ModuleName $moduleForMock } } Context "Get-Environment Is Not Called When EnvironmentType Parameter Is Provided" { Mock -CommandName Get-Environment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-DesignationTagNameByEnvironment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { return @() } $result = ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType 'Prod' ) It "Get-Environment Is Not Called" { Assert-MockCalled Get-Environment -Times 0 -Exactly -Scope Context -ModuleName $moduleForMock } } Context "Returns Empty Array When No Instances Are Found" { Mock -CommandName Get-Environment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-DesignationTagNameByEnvironment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { return @() } It "Is Empty" { ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType 'Prod' ) | Should -BeExactly @() } } Context "Sorted Result Does Not Include Null Or Empty Entries" { Mock -CommandName Get-Environment -ModuleName $moduleForMock -MockWith { return 'Prod' } Mock -CommandName Get-DesignationTagNameByEnvironment -ModuleName $moduleForMock -MockWith { return 'Prod' } It "Does Not Include Null" { if (!($awsPowerShellLoaded)) { Set-ItResult -Inconclusive -Because "AWSPowerShell Not Installed" continue; } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { $testInstance = (New-Object Amazon.EC2.Model.Instance) $testInstance.InstanceId = 'Test' $nullInstance = (New-Object Amazon.EC2.Model.Instance) $nullInstance.InstanceId = $null return @( $testInstance, $nullInstance ) } Mock -CommandName Get-InstanceHostname -ModuleName $moduleForMock -MockWith { return $Instance.InstanceId.ToUpperInvariant() } ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType 'Prod' ) | Should -BeExactly @( 'TEST' ) } It "Does Not Include Empty String" { if (!($awsPowerShellLoaded)) { Set-ItResult -Inconclusive -Because "AWSPowerShell Not Installed" continue; } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { $testInstance = (New-Object Amazon.EC2.Model.Instance) $testInstance.InstanceId = 'Test' $emptyInstance = (New-Object Amazon.EC2.Model.Instance) $emptyInstance.InstanceId = '' return @( $testInstance, $emptyInstance ) } Mock -CommandName Get-InstanceHostname -ModuleName $moduleForMock -MockWith { return $Instance.InstanceId.ToUpperInvariant() } ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType 'Prod' ) | Should -BeExactly @( 'TEST' ) } It "Is Sorted" { if (!($awsPowerShellLoaded)) { Set-ItResult -Inconclusive -Because "AWSPowerShell Not Installed" continue; } Mock -CommandName Get-InstancesByTag -ModuleName $moduleForMock -MockWith { $bInstance = (New-Object Amazon.EC2.Model.Instance) $bInstance.InstanceId = 'B' $aInstance = (New-Object Amazon.EC2.Model.Instance) $aInstance.InstanceId = 'A' return @( $bInstance, $aInstance ) } Mock -CommandName Get-InstanceHostname -ModuleName $moduleForMock -MockWith { return $Instance.InstanceId.ToUpperInvariant() } ( Get-HostnamesByEnvironmentName -EnvironmentName 'Test' -EnvironmentType 'Prod' ) | Should -BeExactly @( 'A', 'B' ) } } }