Private/Document/Tests/ConvertTo-OpenApiResponseList.Tests.ps1

BeforeAll {
    Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '../../../tcs.openapi.psd1') -Force
}

Describe 'ConvertTo-OpenApiResponseList' {
    BeforeAll {
        $script:convert = InModuleScope tcs.openapi {
            {
                param([string]$Json)
                $root = ConvertFrom-OpenApiJson -Text '{
                    "components": {
                        "responses": { "NotFound": { "description": "Not found", "content": { "application/json": { "schema": { "type": "object" } } } } },
                        "headers": { "Rate": { "description": "Rate", "required": true, "schema": { "type": "integer" } } }
                    }
                }'

                $context = Get-OpenApiNormalizationContext -Root $root
                $list = ConvertTo-OpenApiResponseList -Context $context -Responses (ConvertFrom-OpenApiJson -Text $Json) -Pointer '/r'
                [pscustomobject]@{ List = $list; Findings = $context.Findings.ToArray() }
            }
        }
    }

    It 'returns responses in document order with the documented shape' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            $list = (& $Convert '{"200":{"description":"ok","content":{"application/json":{"schema":{"type":"string"}}}},"default":{"description":"error"}}').List
            @($list.StatusCode) | Should -Be @('200', 'default')
            @($list[0].PSObject.Properties.Name) | Should -Be @('StatusCode', 'Description', 'Content', 'Headers')
            $list[0].Content[0].Schema.Type | Should -Be 'string'
            $list[1].Content.Count | Should -Be 0
            $list[1].Headers.Count | Should -Be 0
        }
    }

    It 'upper-cases range codes' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            (& $Convert '{"2xx":{"description":"ok"},"5XX":{"description":"err"}}').List.StatusCode | Should -Be @('2XX', '5XX')
        }
    }

    It 'resolves response and header refs' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            $list = (& $Convert '{"404":{"$ref":"#/components/responses/NotFound"},"200":{"description":"ok","headers":{"X-Rate":{"$ref":"#/components/headers/Rate"},"X-Inline":{"description":"i","schema":{"type":"string"}}}}}').List
            $list[0].Description | Should -Be 'Not found'
            $list[0].Content[0].Schema.Type | Should -Be 'object'
            $list[1].Headers['X-Rate'].Description | Should -Be 'Rate'
            $list[1].Headers['X-Rate'].Required | Should -BeTrue
            $list[1].Headers['X-Rate'].Schema.Type | Should -Be 'integer'
            $list[1].Headers['X-Inline'].Schema.Type | Should -Be 'string'
        }
    }

    It 'skips unresolvable responses with a finding' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            $result = & $Convert '{"404":{"$ref":"#/components/responses/Nope"},"200":{"description":"ok"}}'
            $result.List.Count | Should -Be 1
            $result.Findings[0].Code | Should -Be 'OA021'
        }
    }

    It 'returns an empty array when there are no responses' {
        InModuleScope tcs.openapi {
            $context = Get-OpenApiNormalizationContext -Root $null
            $list = ConvertTo-OpenApiResponseList -Context $context -Responses $null -Pointer ''
            , $list | Should -BeOfType [object[]]
            $list.Count | Should -Be 0
        }
    }
}