Private/CuiTests/Test-CuiAdm004.ps1

# Copyright (c) 2026 Jeffrey Snover. All rights reserved.
# Licensed under the MIT License. See LICENSE file in the project root.

function Test-CuiAdm004 {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$BaseUrl,
        [Parameter()][int]$TimeoutSec = 15,
        [Parameter()][hashtable]$AuthHeaders = @{}
    )

    Set-StrictMode -Version Latest
    $Sw = [System.Diagnostics.Stopwatch]::StartNew()
    $Checks = [System.Collections.Generic.List[PSObject]]::new()
    $BaseUrl = $BaseUrl.TrimEnd('/')

    # Check 1: POST /api/flight-recorder/dump — submit a test flight recorder dump
    $DumpSw = [System.Diagnostics.Stopwatch]::StartNew()
    $DumpOk = $false
    try {
        $DumpBody = @{
            events = @(
                @{ type = 'cui.test'; message = 'CUI test flight recorder probe'; timestamp = (Get-Date -Format 'o') }
            )
            metadata = @{ source = 'cui-test' }
        } | ConvertTo-Json -Depth 4 -Compress
        $DumpResp = Invoke-WebRequest -Uri "$BaseUrl/api/flight-recorder/dump" -Method POST `
            -Body $DumpBody -ContentType 'application/json' -TimeoutSec $TimeoutSec `
            -UseBasicParsing -ErrorAction Stop -Headers $AuthHeaders
        $DumpOk = $DumpResp.StatusCode -eq 200
    } catch { }
    $DumpSw.Stop()
    $Checks.Add((New-CuiCheckResult -Check 'Submit flight recorder dump' -Pass $DumpOk `
        -Detail $(if ($DumpOk) { 'Dump accepted' } else { 'Dump failed' }) -Ms $DumpSw.ElapsedMilliseconds))

    # Check 2: GET /api/flight-recorder/list — list available dumps
    $lr = Invoke-RemoteCheck -BaseUrl $BaseUrl -Path '/api/flight-recorder/list' -TimeoutSec $TimeoutSec
    $ListOk = $lr.Success -and ($null -ne $lr.Body)
    $Checks.Add((New-CuiCheckResult -Check 'List flight recorder dumps' -Pass $ListOk `
        -Detail $(if ($ListOk) { 'Dump list loaded' } else { "Failed: $($lr.Error)" }) -Ms $lr.ResponseMs))

    # Check 3: Validate list structure (should be array or have files property)
    $StructureOk = $false
    if ($ListOk) {
        if ($lr.Body -is [System.Array]) {
            $StructureOk = $true
        } elseif ($lr.Body.PSObject.Properties['files']) {
            $StructureOk = $true
        }
    }
    $Checks.Add((New-CuiCheckResult -Check 'Dump list structure valid' -Pass $StructureOk `
        -Detail $(if ($StructureOk) { 'Valid list structure' } elseif ($ListOk) { 'Unexpected structure' } else { 'No data to validate' })))

    $Sw.Stop()
    New-CuiTestResult -CuiId 'CUI-ADM-004' -Domain 'Admin' -Priority 'P2' `
        -DurationMs $Sw.ElapsedMilliseconds -Details $Checks.ToArray()
}