tests/Public/Disconnect-Cloud.Tests.ps1

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

Describe 'Disconnect-Cloud' {

    Context 'parameter validation' {
        It 'requires Provider' {
            (Get-Command Disconnect-Cloud).Parameters['Provider'].Attributes.Mandatory |
                Should -Contain $true
        }
    }

    Context 'Azure routing' {
        It 'clears the Azure context when Subscription matches' {
            InModuleScope PSCumulus {
                $script:PSCumulusContext.ActiveProvider = 'Azure'
                $script:PSCumulusContext.Providers.Azure = @{
                    Account        = 'adil@contoso.com'
                    TenantId       = 'tenant-1'
                    Subscription   = 'sub-1'
                    SubscriptionId = 'sub-1'
                    Scope          = 'sub-1'
                    Region         = $null
                    ConnectedAt    = (Get-Date).AddMinutes(-5)
                }
                $script:PSCumulusContext.Providers.AWS = @{
                    Account     = '123456789012'
                    AccountId   = '123456789012'
                    Scope       = 'default'
                    Region      = 'us-east-1'
                    ConnectedAt = Get-Date
                }
                $script:PSCumulusContext.Providers.GCP = $null

                $result = Disconnect-Cloud -Provider Azure -Subscription 'sub-1'

                $script:PSCumulusContext.Providers.Azure | Should -BeNullOrEmpty
                $result.Connected | Should -Be $false
                Get-CurrentCloudProvider | Should -Be 'AWS'
            }
        }
    }

    Context 'AWS routing' {
        It 'clears the AWS context when AccountId matches' {
            InModuleScope PSCumulus {
                $script:PSCumulusContext.ActiveProvider = 'AWS'
                $script:PSCumulusContext.Providers.Azure = @{
                    Account        = 'adil@contoso.com'
                    TenantId       = 'tenant-1'
                    Subscription   = 'sub-1'
                    SubscriptionId = 'sub-1'
                    Scope          = 'sub-1'
                    ConnectedAt    = (Get-Date).AddMinutes(-10)
                }
                $script:PSCumulusContext.Providers.AWS = @{
                    Account     = '123456789012'
                    AccountId   = '123456789012'
                    ProfileName  = 'default'
                    Scope       = 'default'
                    Region      = 'us-east-1'
                    ConnectedAt = Get-Date
                }
                $script:PSCumulusContext.Providers.GCP = $null

                $result = Disconnect-Cloud -Provider AWS -AccountId '123456789012'

                $script:PSCumulusContext.Providers.AWS | Should -BeNullOrEmpty
                $result.Connected | Should -Be $false
                Get-CurrentCloudProvider | Should -Be 'Azure'
            }
        }
    }

    Context 'GCP routing' {
        It 'rejects mismatched project filters' {
            InModuleScope PSCumulus {
                $script:PSCumulusContext.ActiveProvider = 'GCP'
                $script:PSCumulusContext.Providers.Azure = $null
                $script:PSCumulusContext.Providers.AWS = $null
                $script:PSCumulusContext.Providers.GCP = @{
                    Account     = 'adil@example.com'
                    Project     = 'proj-a'
                    Scope       = 'proj-a'
                    ConnectedAt = (Get-Date)
                }

                { Disconnect-Cloud -Provider GCP -Project 'proj-b' } | Should -Throw
            }
        }

        It 'supports GCP account-scoped disconnects' {
            InModuleScope PSCumulus {
                $script:PSCumulusContext.ActiveProvider = 'GCP'
                $script:PSCumulusContext.Providers.Azure = $null
                $script:PSCumulusContext.Providers.AWS = $null
                $script:PSCumulusContext.Providers.GCP = @{
                    Account     = 'adil@example.com'
                    Project     = 'proj-a'
                    Scope       = 'proj-a'
                    ConnectedAt = (Get-Date)
                }

                $result = Disconnect-Cloud -Provider GCP -AccountEmail 'adil@example.com'
                $result.Connected | Should -Be $false
                $script:PSCumulusContext.Providers.GCP | Should -BeNullOrEmpty
            }
        }
    }
}