Private/Runtime/Tests/New-OpenApiMultipartContent.Tests.ps1

BeforeAll {
    $env:TCS_CONFIG_ROOT = Join-Path -Path $TestDrive -ChildPath 'config'
    $env:TCS_SKIP_UPDATE_CHECK = '1'
    $env:TCS_TELEMETRY_OPTOUT = '1'
    $ModuleRoot = Split-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -Parent
    Import-Module -Name (Join-Path -Path $ModuleRoot -ChildPath 'tcs.openapi.psd1') -Force
    # Windows PowerShell 5.1 does not load System.Net.Http by default
    Add-Type -AssemblyName 'System.Net.Http'
}

AfterAll {
    Remove-Module -Name tcs.openapi -Force -ErrorAction SilentlyContinue
}

Describe 'New-OpenApiMultipartContent' {
    It 'creates one part per value with the right part types' {
        InModuleScope -ModuleName tcs.openapi {
            $path = Join-Path -Path $TestDrive -ChildPath 'f.txt'
            [System.IO.File]::WriteAllText($path, 'file')
            $body = [ordered]@{ text = 'v'; list = @(1, 2); file = Get-Item -LiteralPath $path; bytes = [byte[]](1); json = @{ a = 1 } }
            $content = New-OpenApiMultipartContent -Body $body
            $parts = @($content.GetEnumerator())
            $parts.Count | Should -Be 6
            $parts[0].Headers.ContentType.MediaType | Should -Be 'text/plain'
            $parts[3].Headers.ContentDisposition.FileName.Trim('"') | Should -Be 'f.txt'
            $parts[4].Headers.ContentDisposition.FileName.Trim('"') | Should -Be 'bytes'
            $parts[5].Headers.ContentType.MediaType | Should -Be 'application/json'
            $content.Dispose()
        }
    }

    It 'uses the boundary given in the content type' {
        InModuleScope -ModuleName tcs.openapi {
            $mediaType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse('multipart/form-data; boundary=abc123')
            $content = New-OpenApiMultipartContent -Body @{ a = 'b' } -MediaType $mediaType
            $content.Headers.ContentType.ToString() | Should -Match 'boundary="?abc123"?'
        }
    }

    It 'rejects a body that is not a hashtable' {
        InModuleScope -ModuleName tcs.openapi {
            { New-OpenApiMultipartContent -Body 'text' } | Should -Throw -ExceptionType ([System.ArgumentException])
        }
    }
}