Tests/EAI/EAIQueryRecord.Tests.ps1

BeforeAll {
    if ($Module) {
        $script:DevModuleName = Import-Module $Module -Force -PassThru | Select-Object -ExpandProperty Name
    }
    else {
        $devModule = Join-Path $PSScriptRoot '..' '..' 'Dev.Logic.Monitor.psd1'
        $script:DevModuleName = Import-Module $devModule -Force -PassThru | Select-Object -ExpandProperty Name
    }
}

Describe 'Get-EAIQueryRecord' {
    BeforeEach {
        Disconnect-EAIAccount
        Connect-EAIAccount -EdwinOrg 'myorg' -ClientId 'client' -ClientSecret 'secret' -SkipCredValidation
        InModuleScope -ModuleName $script:DevModuleName {
            $Script:EAIAuth.AccessToken = 'test-token' | ConvertTo-SecureString -AsPlainText -Force
            $Script:EAIAuth.TokenExpiresAt = (Get-Date).ToUniversalTime().AddHours(1)
        }
    }

    It 'Requires an authenticated Edwin session' {
        Disconnect-EAIAccount
        InModuleScope -ModuleName $script:DevModuleName {
            { Get-EAIQueryRecord -RecordType events -RecordId 'abc' -ErrorAction Stop } | Should -Throw
        }
    }

    It 'Gets a record with an encoded path for IDs containing slashes' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod {
                return [PSCustomObject]@{
                    meta    = [PSCustomObject]@{ recordType = 'events'; count = 1 }
                    results = @([PSCustomObject]@{ _id = 'eventId/12345abc' })
                }
            }

            $record = Get-EAIQueryRecord -RecordType events -RecordId 'eventId/12345abc'

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -eq 'https://myorg.dexda.ai/ui/query/record/events/eventId%2F12345abc' -and
                $Method -eq 'GET'
            }

            $record.PSTypeNames | Should -Contain 'Edwin.Event'
            $record._id | Should -Be 'eventId/12345abc'
        }
    }

    It 'Returns the full response envelope with -AsResponse' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod {
                return [PSCustomObject]@{
                    meta    = [PSCustomObject]@{ recordType = 'events'; count = 1 }
                    results = @([PSCustomObject]@{ _id = 'abc' })
                }
            }

            $response = Get-EAIQueryRecord -RecordType events -RecordId 'abc' -AsResponse

            $response.PSTypeNames | Should -Contain 'Edwin.Query.Response'
            $response.results[0]._id | Should -Be 'abc'
        }
    }

    It 'Rejects an empty RecordId' {
        InModuleScope -ModuleName $script:DevModuleName {
            { Get-EAIQueryRecord -RecordType events -RecordId ' ' } | Should -Throw '*RecordId is required*'
        }
    }
}