tests/Private/Get-AWSNetworkData.Tests.ps1

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

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

AfterAll {
    if ($script:stubCreatedGetEC2Vpc) {
        Remove-Item -Path Function:global:Get-EC2Vpc -ErrorAction SilentlyContinue
    }
}

Describe 'Get-AWSNetworkData' {

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

                { Get-AWSNetworkData -Region 'us-east-1' } | Should -Throw
            }
        }
    }

    Context 'when VPCs are returned' {
        BeforeAll {
            $script:mockVpc = [pscustomobject]@{
                VpcId     = 'vpc-0abc123'
                CidrBlock = '10.0.0.0/16'
                IsDefault = $false
                State     = [pscustomobject]@{ Value = 'available' }
                Tags      = @([pscustomobject]@{ Key = 'Name'; Value = 'prod-vpc' })
            }
            $script:noNameVpc = [pscustomobject]@{
                VpcId     = 'vpc-0def456'
                CidrBlock = '172.16.0.0/12'
                IsDefault = $true
                State     = [pscustomobject]@{ Value = 'available' }
                Tags      = @()
            }
        }

        It 'returns a CloudRecord for each VPC' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $results = @(Get-AWSNetworkData -Region 'us-east-1')
                $results.Count | Should -Be 1
            }
        }

        It 'uses Name tag as Name' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.Name | Should -Be 'prod-vpc'
            }
        }

        It 'falls back to VpcId when no Name tag exists' {
            InModuleScope PSCumulus -Parameters @{ NoNameVpc = $script:noNameVpc } {
                param($NoNameVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($NoNameVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.Name | Should -Be 'vpc-0def456'
            }
        }

        It 'sets Provider to AWS' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.Provider | Should -Be 'AWS'
            }
        }

        It 'maps State to Status' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.Status | Should -Be 'available'
            }
        }

        It 'maps CidrBlock to Size' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.Size | Should -Be '10.0.0.0/16'
            }
        }

        It 'includes VpcId in Metadata' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.Metadata.VpcId | Should -Be 'vpc-0abc123'
            }
        }

        It 'returns PSCumulus.CloudRecord type' {
            InModuleScope PSCumulus -Parameters @{ MockVpc = $script:mockVpc } {
                param($MockVpc)
                Mock Assert-CommandAvailable {}
                Mock Get-EC2Vpc { @($MockVpc) }

                $result = Get-AWSNetworkData -Region 'us-east-1'
                $result.PSObject.TypeNames | Should -Contain 'PSCumulus.CloudRecord'
            }
        }
    }
}