tests/Private/Stop-AWSInstance.Tests.ps1

BeforeAll {
    # Stub AWS EC2 stop command so Pester can create mocks when AWS.Tools is not installed
    if (-not (Get-Command Stop-EC2Instance -ErrorAction SilentlyContinue)) {
        $script:stubCreatedStopEC2 = $true
        function global:Stop-EC2Instance { param([string]$InstanceId, [string]$Region) }
    }

    Import-Module (Resolve-Path (Join-Path $PSScriptRoot '..\..\PSCumulus.psd1')).Path -Force
}

AfterAll {
    if ($script:stubCreatedStopEC2) {
        Remove-Item -Path Function:global:Stop-EC2Instance -ErrorAction SilentlyContinue
    }
}

Describe 'Stop-AWSInstance' {

    Context 'when AWS.Tools.EC2 is not installed' {
        It 'throws when Stop-EC2Instance is unavailable' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {
                    throw [System.Management.Automation.CommandNotFoundException]::new(
                        "Required command 'Stop-EC2Instance' was not found."
                    )
                }

                { Stop-AWSInstance -InstanceId 'i-0abc123' } | Should -Throw
            }
        }
    }

    Context 'when the instance is stopped' {
        It 'returns a CloudRecord' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $result = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'us-east-1'
                $result | Should -Not -BeNullOrEmpty
            }
        }

        It 'uses InstanceId as Name' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $result = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'us-east-1'
                $result.Name | Should -Be 'i-0abc123'
            }
        }

        It 'sets Provider to AWS' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $result = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'us-east-1'
                $result.Provider | Should -Be 'AWS'
            }
        }

        It 'sets Status to Stopping' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $result = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'us-east-1'
                $result.Status | Should -Be 'Stopping'
            }
        }

        It 'includes InstanceId in Metadata' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $result = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'us-east-1'
                $result.Metadata.InstanceId | Should -Be 'i-0abc123'
            }
        }

        It 'calls Stop-EC2Instance with Region when provided' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $null = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'eu-west-1'
                Should -Invoke Stop-EC2Instance -Times 1 -ParameterFilter { $Region -eq 'eu-west-1' }
            }
        }

        It 'returns PSCumulus.CloudRecord type' {
            InModuleScope PSCumulus {
                Mock Assert-CommandAvailable {}
                Mock Stop-EC2Instance { }

                $result = Stop-AWSInstance -InstanceId 'i-0abc123' -Region 'us-east-1'
                $result.PSObject.TypeNames | Should -Contain 'PSCumulus.CloudRecord'
            }
        }
    }
}