Private/CuiTests/Test-CuiData001.ps1

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

function Test-CuiData001 {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$BaseUrl,
        [Parameter()][int]$TimeoutSec = 15
    )

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

    # Check 1: GET /api/data/available → { available: true }
    $r = Invoke-RemoteCheck -BaseUrl $BaseUrl -Path '/api/data/available' -TimeoutSec $TimeoutSec -ExpectedField 'available'
    $Available = $r.Success -and $r.Body.PSObject.Properties['available'] -and $r.Body.available -eq $true
    $Checks.Add((New-CuiCheckResult -Check 'Data available' -Pass $Available `
        -Detail $(if ($Available) { 'available=true' } else { "Failed: $($r.Error)" }) -Ms $r.ResponseMs))

    # Check 2: GET /health → verify github.rateLimit is present and remaining > 0
    $hr = Invoke-RemoteCheck -BaseUrl $BaseUrl -Path '/health' -TimeoutSec $TimeoutSec -ExpectedField 'status'
    $RateLimitOk = $false
    if ($hr.Success -and $hr.Body -and $hr.Body.PSObject.Properties['github']) {
        $gh = $hr.Body.github
        if ($gh.PSObject.Properties['rateLimit']) {
            $rl = $gh.rateLimit
            if ($rl.PSObject.Properties['remaining']) {
                $RateLimitOk = [int]$rl.remaining -gt 0
            }
        }
    }
    $Checks.Add((New-CuiCheckResult -Check 'GitHub rate limit remaining > 0' -Pass $RateLimitOk `
        -Detail $(if ($RateLimitOk) { "remaining=$($rl.remaining)" } elseif ($hr.Success) { 'Rate limit info not found in /health' } else { "Failed: $($hr.Error)" }) -Ms $hr.ResponseMs))

    # Check 3: All four POV GETs return non-empty (validated via TAX-001 overlap)
    $AllPovOk = $true
    $PovDetail = ''
    foreach ($Pov in @('accelerationist', 'safetyist', 'skeptic', 'situations')) {
        $pr = Invoke-RemoteCheck -BaseUrl $BaseUrl -Path "/api/taxonomy/$Pov" -TimeoutSec $TimeoutSec -ExpectedField 'nodes'
        $NodeCount = 0
        if ($pr.Success -and $pr.Body.PSObject.Properties['nodes']) {
            $NodeCount = @($pr.Body.nodes).Count
        }
        if ($NodeCount -eq 0) {
            $AllPovOk = $false
            $PovDetail = "$Pov has 0 nodes"
            break
        }
    }
    if ($AllPovOk) { $PovDetail = 'All 4 POVs loaded' }
    $Checks.Add((New-CuiCheckResult -Check 'All POV files populated' -Pass $AllPovOk `
        -Detail $PovDetail))

    $Sw.Stop()
    New-CuiTestResult -CuiId 'CUI-DATA-001' -Domain 'Data' -Priority 'P0' `
        -DurationMs $Sw.ElapsedMilliseconds -Details $Checks.ToArray()
}