tests/Private/Get-GCPNetworkData.Tests.ps1

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

Describe 'Get-GCPNetworkData' {

    BeforeAll {
        $script:activeAccount = [pscustomobject]@{ account = 'user@example.com'; status = 'ACTIVE' }

        $script:mockNetwork = [pscustomobject]@{
            name                  = 'prod-network'
            autoCreateSubnetworks = $false
        }

        $script:mockAutoNetwork = [pscustomobject]@{
            name                  = 'default'
            autoCreateSubnetworks = $true
        }
    }

    Context 'successful retrieval' {
        It 'returns a CloudRecord for each network' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $results = @(Get-GCPNetworkData -Project 'my-project')
                $results.Count | Should -Be 1
            }
        }

        It 'maps network name correctly' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.Name | Should -Be 'prod-network'
            }
        }

        It 'sets Provider to GCP' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.Provider | Should -Be 'GCP'
            }
        }

        It 'sets Region to global' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.Region | Should -Be 'global'
            }
        }

        It 'sets Status to Available' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.Status | Should -Be 'Available'
            }
        }

        It 'sets SubnetworkMode to custom for manual subnet networks' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.Metadata.SubnetworkMode | Should -Be 'custom'
            }
        }

        It 'sets SubnetworkMode to auto for auto subnet networks' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; AutoNetwork = $script:mockAutoNetwork } {
                param($Account, $AutoNetwork)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($AutoNetwork) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.Metadata.SubnetworkMode | Should -Be 'auto'
            }
        }

        It 'returns PSCumulus.CloudRecord type' {
            InModuleScope PSCumulus -Parameters @{ Account = $script:activeAccount; Network = $script:mockNetwork } {
                param($Account, $Network)
                Mock Assert-GCloudAuthenticated { $Account }
                Mock Get-GCloudProject { 'my-project' }
                Mock Invoke-GCloudJson { @($Network) }

                $result = Get-GCPNetworkData -Project 'my-project'
                $result.PSObject.TypeNames | Should -Contain 'PSCumulus.CloudRecord'
            }
        }
    }

    Context 'authentication' {
        It 'throws when not authenticated' {
            InModuleScope PSCumulus {
                Mock Assert-GCloudAuthenticated {
                    throw [System.InvalidOperationException]::new('No active gcloud account found.')
                }

                { Get-GCPNetworkData -Project 'my-project' } | Should -Throw
            }
        }
    }
}