Files
story/scripts/test-integration.ps1
T
2026-08-29 21:56:51 +08:00

85 lines
3.2 KiB
PowerShell

param(
[string[]]$Packages = @(
'./internal/deviceauth',
'./internal/saas',
'./internal/orchestration',
'./internal/extraction',
'./internal/privacy',
'./internal/media',
'./internal/retrieval'
),
[switch]$KeepDatabase
)
$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true
$projectRoot = Split-Path -Parent $PSScriptRoot
Set-Location -LiteralPath $projectRoot
$databaseName = 'voice_platform_test_' + ([guid]::NewGuid().ToString('N'))
if ($databaseName -notmatch '^voice_platform_test_[0-9a-f]{32}$') {
throw "Refusing to use unexpected integration database name: $databaseName"
}
function Invoke-PostgresAdmin {
param([Parameter(Mandatory = $true)][string]$Sql)
docker compose exec -T postgres psql -v ON_ERROR_STOP=1 -U voice -d postgres -c $Sql
if ($LASTEXITCODE -ne 0) {
throw "PostgreSQL administration command failed with exit code $LASTEXITCODE."
}
}
try {
$postgresID = docker compose ps -q postgres
if (-not $postgresID) {
Write-Host 'Starting the local PostgreSQL service...'
docker compose up -d --wait postgres
if ($LASTEXITCODE -ne 0) {
throw "Starting PostgreSQL failed with exit code $LASTEXITCODE."
}
}
Write-Host "Creating isolated integration database $databaseName"
Invoke-PostgresAdmin -Sql "CREATE DATABASE `"$databaseName`" OWNER voice;"
$containerDatabaseURL = "postgres://voice:voice_dev_only@postgres:5432/$databaseName`?sslmode=disable"
docker compose run --rm --no-deps migrate `
-path=/migrations `
"-database=$containerDatabaseURL" `
up
if ($LASTEXITCODE -ne 0) {
throw "Database migration failed with exit code $LASTEXITCODE."
}
docker compose run --rm --no-deps `
-e PGPASSWORD=voice_dev_only `
seed psql -h postgres -U voice -d $databaseName -v ON_ERROR_STOP=1 -f /fixtures/local_seed.sql
if ($LASTEXITCODE -ne 0) {
throw "Database seed failed with exit code $LASTEXITCODE."
}
$previousTestDatabaseURL = $env:TEST_DATABASE_URL
$env:TEST_DATABASE_URL = "postgres://voice:voice_dev_only@127.0.0.1:55432/$databaseName`?sslmode=disable"
try {
Write-Host "Running database-backed packages against $databaseName"
go test -count=1 -p 1 @Packages
if ($LASTEXITCODE -ne 0) {
throw "Database integration tests failed with exit code $LASTEXITCODE."
}
} finally {
if ($null -eq $previousTestDatabaseURL) {
Remove-Item Env:TEST_DATABASE_URL -ErrorAction SilentlyContinue
} else {
$env:TEST_DATABASE_URL = $previousTestDatabaseURL
}
}
} finally {
if ($KeepDatabase) {
Write-Warning "Keeping isolated integration database for inspection: $databaseName"
} elseif ($databaseName -match '^voice_platform_test_[0-9a-f]{32}$') {
Write-Host "Dropping isolated integration database $databaseName"
Invoke-PostgresAdmin -Sql "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='$databaseName' AND pid <> pg_backend_pid();"
Invoke-PostgresAdmin -Sql "DROP DATABASE IF EXISTS `"$databaseName`";"
}
}