92 lines
2.8 KiB
PowerShell
92 lines
2.8 KiB
PowerShell
$ErrorActionPreference = 'Stop'
|
|
|
|
$projectRoot = Split-Path -Parent $PSScriptRoot
|
|
$backendJob = $null
|
|
$viteJob = $null
|
|
|
|
function Assert-ExitCode {
|
|
param([string]$Step)
|
|
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "$Step failed with exit code $LASTEXITCODE"
|
|
}
|
|
}
|
|
|
|
function Wait-HttpReady {
|
|
param([string]$Url)
|
|
|
|
for ($attempt = 0; $attempt -lt 60; $attempt++) {
|
|
try {
|
|
[void](Invoke-WebRequest -Uri $Url -UseBasicParsing -TimeoutSec 2)
|
|
return
|
|
}
|
|
catch {
|
|
Start-Sleep -Milliseconds 200
|
|
}
|
|
}
|
|
throw "Service did not become ready: $Url"
|
|
}
|
|
|
|
Push-Location $projectRoot
|
|
try {
|
|
foreach ($port in 3000, 5173) {
|
|
if (Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue) {
|
|
throw "Port $port is already in use"
|
|
}
|
|
}
|
|
|
|
cargo build --manifest-path backend\Cargo.toml
|
|
Assert-ExitCode 'Rust build'
|
|
|
|
$e2eData = [System.IO.Path]::GetFullPath((Join-Path $projectRoot '.e2e-data'))
|
|
$expectedE2eData = [System.IO.Path]::GetFullPath($projectRoot).TrimEnd('\') + '\.e2e-data'
|
|
if ($e2eData -ne $expectedE2eData) {
|
|
throw "Refusing to clean unexpected end-to-end data path: $e2eData"
|
|
}
|
|
if (Test-Path -LiteralPath $e2eData) {
|
|
Remove-Item -LiteralPath $e2eData -Recurse -Force
|
|
}
|
|
[void](New-Item -ItemType Directory -Path $e2eData -Force)
|
|
$env:TASK_PILOT_DATABASE_URL = 'sqlite://.e2e-data/task_pilot.db'
|
|
$env:TASK_PILOT_LOG_DIR = '.e2e-data/logs'
|
|
$env:TASKPILOT_E2E_EXTERNAL = '1'
|
|
|
|
$backendBinary = Join-Path $projectRoot 'backend\target\debug\task-pilot-backend.exe'
|
|
$nodeBinary = (Get-Command node).Source
|
|
$frontendRoot = Join-Path $projectRoot 'frontend'
|
|
|
|
$backendJob = Start-Job -ScriptBlock {
|
|
param($root, $binary)
|
|
Set-Location $root
|
|
& $binary
|
|
} -ArgumentList $projectRoot, $backendBinary
|
|
Wait-HttpReady 'http://127.0.0.1:3000/api/v1/health'
|
|
|
|
$viteJob = Start-Job -ScriptBlock {
|
|
param($root, $node)
|
|
Set-Location $root
|
|
& $node 'node_modules/vite/bin/vite.js' '--host' '127.0.0.1'
|
|
} -ArgumentList $frontendRoot, $nodeBinary
|
|
Wait-HttpReady 'http://127.0.0.1:5173'
|
|
|
|
pnpm --dir frontend exec playwright test
|
|
Assert-ExitCode 'Playwright tests'
|
|
}
|
|
finally {
|
|
foreach ($job in @($viteJob, $backendJob)) {
|
|
if ($job) {
|
|
Stop-Job -Job $job -ErrorAction SilentlyContinue
|
|
Remove-Job -Job $job -Force -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
|
|
foreach ($port in 3000, 5173) {
|
|
$connection = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue
|
|
if ($connection) {
|
|
Stop-Process -Id $connection.OwningProcess -Force -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
|
|
Pop-Location
|
|
}
|