tests/Public/Find-CloudResource.Tests.ps1

Describe 'Find-CloudResource' {
    BeforeAll {
        if (-not (Get-Command Get-AzResourceGroup -ErrorAction SilentlyContinue)) {
            function global:Get-AzResourceGroup { }
        }

        $ModulePath = $PSScriptRoot | Split-Path -Parent | Split-Path -Parent | Join-Path -ChildPath 'PSCumulus.psd1'
        Import-Module $ModulePath -Force
    }

    BeforeEach {
        InModuleScope PSCumulus {
            if (-not (Get-Command Get-AzResourceGroup -ErrorAction SilentlyContinue)) {
                function Get-AzResourceGroup { }
            }

            $script:PSCumulusContext.Providers['Azure'] = @{
                Account        = 'test@example.com'
                SubscriptionId = 'sub-123'
                Connected      = $true
            }
            $script:PSCumulusContext.ActiveProvider = 'Azure'
        }
    }

    Context 'Parameter validation' {
        It 'Should have -Name parameter as mandatory' {
            { Find-CloudResource -Name 'test' -ErrorAction Stop } | Should -Not -Throw
        }

        It 'Should accept -Provider parameter' {
            { Find-CloudResource -Name 'test' -Provider Azure -ErrorAction Stop } | Should -Not -Throw
        }

        It 'Should accept -Kind parameter' {
            { Find-CloudResource -Name 'test' -Kind Instance -ErrorAction Stop } | Should -Not -Throw
        }
    }

    Context 'Provider dispatch' {
        It 'Should call Get-CloudInstance when Kind includes Instance' {
            InModuleScope PSCumulus {
                Mock Get-AzResourceGroup -MockWith {
                    [PSCustomObject]@{ ResourceGroupName = 'test-rg' }
                }

                Mock Get-CloudInstance -MockWith {
                    [PSCustomObject]@{
                        PSTypeName = 'PSCumulus.AzureCloudRecord'
                        Name       = 'test-vm'
                        Provider   = 'Azure'
                        Kind       = 'Instance'
                    }
                }

                $result = Find-CloudResource -Name 'test-vm' -Kind Instance
                $result | Should -Not -BeNullOrEmpty
            }
        }
    }

    Context 'Output shape' {
        It 'Should return objects with Kind property' {
            InModuleScope PSCumulus {
                Mock Get-AzResourceGroup -MockWith {
                    [PSCustomObject]@{ ResourceGroupName = 'test-rg' }
                }

                Mock Get-CloudInstance -MockWith {
                    [PSCustomObject]@{
                        PSTypeName = 'PSCumulus.AzureCloudRecord'
                        Name       = 'test-vm'
                        Provider   = 'Azure'
                    }
                }

                $result = Find-CloudResource -Name 'test-vm' -Kind Instance
                $result.Kind | Should -Be 'Instance'
            }
        }

        It 'Should filter results by Name wildcard' {
            InModuleScope PSCumulus {
                Mock Get-AzResourceGroup -MockWith {
                    [PSCustomObject]@{ ResourceGroupName = 'test-rg' }
                }

                Mock Get-CloudInstance -MockWith {
                    [PSCustomObject]@{
                        PSTypeName = 'PSCumulus.AzureCloudRecord'
                        Name       = 'test-vm'
                        Provider   = 'Azure'
                    }
                }

                $result = Find-CloudResource -Name 'test-*' -Kind Instance
                $result.Count | Should -BeGreaterOrEqual 0
            }
        }
    }

    Context 'Multi-provider behavior' {
        It 'Should skip providers without active session context' {
            InModuleScope PSCumulus {
                $script:PSCumulusContext.Providers['Azure'] = $null
                $script:PSCumulusContext.Providers['AWS'] = $null
                $script:PSCumulusContext.Providers['GCP'] = $null

                $result = Find-CloudResource -Name 'test'
                $result | Should -BeNullOrEmpty
            }
        }

        It 'Should skip Azure when Get-AzResourceGroup returns no RGs and emit verbose' {
            InModuleScope PSCumulus {
                Mock Get-AzResourceGroup -MockWith { @() }
                Mock Get-CloudInstance -MockWith {
                    [PSCustomObject]@{
                        PSTypeName = 'PSCumulus.AzureCloudRecord'
                        Name       = 'test-vm'
                        Provider   = 'Azure'
                    }
                }

                $output = Find-CloudResource -Name 'test-vm' -Provider Azure -Kind Instance -Verbose 4>&1
                $records = @($output | Where-Object { $_ -isnot [System.Management.Automation.VerboseRecord] })
                $verbose = @($output | Where-Object { $_ -is [System.Management.Automation.VerboseRecord] })

                $records | Should -BeNullOrEmpty
                $verbose.Message | Should -Contain 'Find-CloudResource: no resource groups returned for Azure subscription sub-123; skipping.'
                Assert-MockCalled Get-CloudInstance -Times 0 -Exactly
            }
        }
    }
}