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

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

Describe 'ConvertTo-OpenApiSecurityScheme' {
    BeforeAll {
        $script:convert = InModuleScope tcs.openapi {
            {
                param([string]$Json)
                $context = Get-OpenApiNormalizationContext -Root $null -SourceVersion '3.0.3'
                $scheme = ConvertTo-OpenApiSecurityScheme -Context $context -Name 'auth' -Node (ConvertFrom-OpenApiJson -Text $Json) -Pointer '/components/securitySchemes/auth'
                [pscustomobject]@{ Scheme = $scheme; Findings = $context.Findings.ToArray() }
            }
        }
    }

    It 'maps apiKey to In and ParameterName' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            $result = & $Convert '{"type":"apiKey","name":"X-Key","in":"header"}'
            $result.Scheme.PSObject.TypeNames | Should -Contain 'Tcs.OpenApi.SecurityScheme'
            $result.Scheme.Name | Should -Be 'auth'
            $result.Scheme.Type | Should -Be 'apiKey'
            $result.Scheme.In | Should -Be 'header'
            $result.Scheme.ParameterName | Should -Be 'X-Key'
            $result.Findings.Count | Should -Be 0
        }
    }

    It 'lower-cases http schemes and keeps the bearer format' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            $result = & $Convert '{"type":"http","scheme":"Bearer","bearerFormat":"JWT"}'
            $result.Scheme.Scheme | Should -BeExactly 'bearer'
            $result.Scheme.BearerFormat | Should -Be 'JWT'
            $result.Findings.Count | Should -Be 0
            (& $Convert '{"type":"http","scheme":"basic"}').Findings.Count | Should -Be 0
        }
    }

    It 'maps oauth2 flows' {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert } {
            param($Convert)
            $result = & $Convert '{"type":"oauth2","flows":{"clientCredentials":{"tokenUrl":"https://t","scopes":{"a":"A"}},"authorizationCode":{"authorizationUrl":"https://a","tokenUrl":"https://t","refreshUrl":"https://r","scopes":{}}}}'
            $result.Scheme.Flows['clientCredentials'].TokenUrl | Should -Be 'https://t'
            $result.Scheme.Flows['clientCredentials'].Scopes['a'] | Should -Be 'A'
            $result.Scheme.Flows['authorizationCode'].RefreshUrl | Should -Be 'https://r'
            $result.Findings.Count | Should -Be 0
        }
    }

    It 'reports <Json> as OA030' -TestCases @(
        @{ Json = '{"type":"openIdConnect","openIdConnectUrl":"https://o"}' }
        @{ Json = '{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://a","scopes":{}}}}' }
        @{ Json = '{"type":"http","scheme":"digest"}' }
        @{ Json = '{"type":"mutualTLS"}' }
    ) {
        InModuleScope tcs.openapi -Parameters @{ Convert = $script:convert; Json = $Json } {
            param($Convert, $Json)
            $result = & $Convert $Json
            $result.Findings[0].Code | Should -Be 'OA030'
            $result.Findings[0].Severity | Should -Be 'Warning'
            $result.Findings[0].Pointer | Should -BeExactly '/components/securitySchemes/auth'
            $result.Scheme | Should -Not -BeNullOrEmpty
        }
    }
}