tests/Public/Find-CloudResource.Tests.ps1

Describe 'Find-CloudResource' {
    BeforeAll {
        $ModulePath = $PSScriptRoot | Split-Path -Parent | Split-Path -Parent | Join-Path -ChildPath 'PSCumulus.psd1'
        Import-Module $ModulePath -Force
    }

    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' {
        BeforeEach {
            InModuleScope PSCumulus {
                $script:PSCumulusContext.Providers['Azure'] = @{
                    Account       = 'test@example.com'
                    ResourceGroup = 'test-rg'
                    Connected     = $true
                }
                $script:PSCumulusContext.ActiveProvider = 'Azure'
            }
        }

        It 'Should call Get-CloudInstance when Kind includes Instance' {
            InModuleScope PSCumulus {
                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-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-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
            }
        }
    }
}