# Ephemeral trial stack smoke test — does not use production volumes or .env.docker. param( [int]$Port = 18080 ) $ErrorActionPreference = 'Stop' $frontendRoot = Split-Path -Parent $PSScriptRoot $project = "cgltrial$(Get-Random)" $secret = ('trial-{0}' -f ('x' * 40)) $cors = "http://127.0.0.1:$Port" $envFile = Join-Path $env:TEMP "cgl-trial-$project.env" @" JWT_SECRET=$secret CORS_ORIGIN=$cors VITE_API_URL=/api FRONTEND_PORT=$Port "@ | Set-Content -Path $envFile -Encoding utf8 Push-Location $frontendRoot try { docker compose -p $project --env-file $envFile config | Out-Null docker compose -p $project --env-file $envFile build docker compose -p $project --env-file $envFile up -d $deadline = (Get-Date).AddMinutes(3) do { Start-Sleep -Seconds 3 try { $h = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/health/ready" -UseBasicParsing if ($h.StatusCode -eq 200) { break } } catch { } } while ((Get-Date) -lt $deadline) $ready = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/health/ready" -UseBasicParsing if ($ready.StatusCode -ne 200) { throw 'readiness failed' } $user = "trial_$([guid]::NewGuid().ToString('N').Substring(0,8))" $body = @{ username = $user; password = 'pass1234'; name = 'Trial' } | ConvertTo-Json $reg = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/api/auth/register" -Method POST -Body $body -ContentType 'application/json; charset=utf-8' -UseBasicParsing $token = ($reg.Content | ConvertFrom-Json).token $me = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/api/me" -Headers @{ Authorization = "Bearer $token" } -UseBasicParsing if ($me.StatusCode -ne 200) { throw 'GET /api/me failed' } $spa = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/map" -UseBasicParsing if ($spa.Content -notmatch 'html') { throw 'SPA route failed' } $backendPorts = docker compose -p $project ps --format json | ConvertFrom-Json foreach ($svc in $backendPorts) { if ($svc.Service -eq 'backend' -and $svc.Publishers) { throw 'backend must not publish host ports' } } Write-Host 'docker-trial-smoke: OK' } finally { docker compose -p $project --env-file $envFile down -v --remove-orphans 2>$null Remove-Item $envFile -Force -ErrorAction SilentlyContinue Pop-Location }