Private/CuiTests/Test-CuiTax003.ps1

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

function Test-CuiTax003 {
    [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: Taxonomy loads (search is client-side — need data to search)
    $r = Invoke-RemoteCheck -BaseUrl $BaseUrl -Path '/api/taxonomy/accelerationist' -TimeoutSec $TimeoutSec -ExpectedField 'nodes'
    $HasNodes = $r.Success -and $r.Body.PSObject.Properties['nodes'] -and @($r.Body.nodes).Count -gt 0
    $Checks.Add((New-CuiCheckResult -Check 'Taxonomy data loads' -Pass $HasNodes `
        -Detail $(if ($HasNodes) { "$(@($r.Body.nodes).Count) nodes" } else { "Failed: $($r.Error)" }) -Ms $r.ResponseMs))

    # Check 2: Nodes have searchable fields (label, description)
    $SearchableOk = $false
    if ($HasNodes) {
        $Node = $r.Body.nodes[0]
        $SearchableOk = $Node.PSObject.Properties['label'] -and
                        $Node.PSObject.Properties['description'] -and
                        $Node.label.Length -gt 0
    }
    $Checks.Add((New-CuiCheckResult -Check 'Nodes have searchable fields' -Pass $SearchableOk `
        -Detail $(if ($SearchableOk) { "label='$($Node.label.Substring(0, [Math]::Min(40, $Node.label.Length)))'" } else { 'Missing label or description' })))

    # Check 3: Multiple POVs available for cross-POV search
    $PovCount = 0
    foreach ($Pov in @('accelerationist', 'safetyist', 'skeptic', 'situations')) {
        $pr = Invoke-RemoteCheck -BaseUrl $BaseUrl -Path "/api/taxonomy/$Pov" -TimeoutSec $TimeoutSec -ExpectedField 'nodes'
        if ($pr.Success -and $pr.Body.PSObject.Properties['nodes'] -and @($pr.Body.nodes).Count -gt 0) {
            $PovCount++
        }
    }
    $AllPovOk = $PovCount -eq 4
    $Checks.Add((New-CuiCheckResult -Check 'Cross-POV search data available' -Pass $AllPovOk `
        -Detail "$PovCount/4 POVs loaded"))

    $Sw.Stop()
    New-CuiTestResult -CuiId 'CUI-TAX-003' -Domain 'Taxonomy' -Priority 'P1' `
        -DurationMs $Sw.ElapsedMilliseconds -Details $Checks.ToArray()
}