param( [string]$ApiUrl = "http://localhost:8000", [string]$WebUrl = "http://localhost:3000", [string]$Neo4jUrl = "http://localhost:7474", [string]$QdrantUrl = "http://localhost:6333", [string]$ObjectStorageUrl = "http://localhost:9000", [string]$ProjectName = "", [switch]$IncludeProjectSetupSmoke, [string]$BrowserPath = "" ) $ErrorActionPreference = "Stop" function Test-Http($Name, $Url) { $response = Invoke-WebRequest -UseBasicParsing -Uri $Url -TimeoutSec 10 if ($response.StatusCode -lt 200 -or $response.StatusCode -ge 300) { throw "$Name failed: HTTP $($response.StatusCode)" } Write-Host "[ok] $Name $Url" } Test-Http "api health" "$ApiUrl/api/health" Test-Http "web health" "$WebUrl/health" $compose = @("compose") if ($ProjectName) { $compose += @("-p", $ProjectName) } $compose += @("-f", "infra/docker/docker-compose.test.yml") docker @compose exec -T postgres pg_isready -U sfera -d sfera | Out-Host Write-Host "[ok] postgres health" Test-Http "neo4j health" "$Neo4jUrl" Test-Http "qdrant health" "$QdrantUrl/readyz" docker @compose exec -T redis redis-cli ping | Out-Host Write-Host "[ok] redis health" Test-Http "object-storage health" "$ObjectStorageUrl/minio/health/live" if ($IncludeProjectSetupSmoke) { $webDir = Join-Path (Get-Location).ProviderPath "frontend\sfera-web" Write-Host "[run] project setup runtime smoke $WebUrl" $previousWebUrl = $env:SFERA_WEB_URL $previousBrowserPath = $env:SFERA_BROWSER_PATH try { $env:SFERA_WEB_URL = $WebUrl if ($BrowserPath) { $env:SFERA_BROWSER_PATH = $BrowserPath } cmd /c "pushd `"$webDir`" && npm run smoke:project-setup" if ($LASTEXITCODE -ne 0) { throw "project setup runtime smoke failed with exit code $LASTEXITCODE" } Write-Host "[ok] project setup runtime smoke" } finally { if ((Get-Location).Path -eq $webDir) { Pop-Location } $env:SFERA_WEB_URL = $previousWebUrl $env:SFERA_BROWSER_PATH = $previousBrowserPath } }