ps/Modules/Alkami.DevOps.Common/Public/Get-HostnamesByEnvironmentName.tests.ps1

165 lines
6.6 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
. $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' )
}
}
}