fischer-agentkit/src/agentkit/server/frontend/e2e/global-setup.ts

62 lines
2.0 KiB
TypeScript

/**
* Playwright global setup — runs once before all test files.
*
* Responsibilities:
* 1. Wait for the backend health endpoint to respond (the webServer config
* already polls the URL, but we double-check here for robustness).
* 2. Invoke the Python script that creates / updates the E2E test admin user
* in the auth SQLite DB.
*/
import { execFileSync } from 'node:child_process'
import { existsSync } from 'node:fs'
import { dirname, resolve } from 'node:path'
import { fileURLToPath } from 'node:url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const BACKEND_HEALTH_URL = `http://127.0.0.1:${process.env.BACKEND_PORT ?? '18001'}/api/v1/health`
const SETUP_SCRIPT = resolve(__dirname, 'setup-test-user.py')
/** Poll a URL until it returns 200 or the timeout expires. */
async function waitForUrl(url: string, timeoutMs = 60_000): Promise<void> {
const deadline = Date.now() + timeoutMs
while (Date.now() < deadline) {
try {
const resp = await fetch(url)
if (resp.ok) return
} catch {
// server not ready yet
}
await new Promise((r) => setTimeout(r, 1000))
}
throw new Error(`Timed out waiting for ${url}`)
}
export default async function globalSetup(): Promise<void> {
// 1. Verify backend is up (webServer should have started it already).
await waitForUrl(BACKEND_HEALTH_URL, 60_000)
console.log('[global-setup] Backend health check passed')
// 2. Create / update the test admin user.
if (!existsSync(SETUP_SCRIPT)) {
throw new Error(`Setup script not found: ${SETUP_SCRIPT}`)
}
const pythonBin = process.env.E2E_PYTHON ?? 'python3'
try {
execFileSync(pythonBin, [SETUP_SCRIPT], {
stdio: 'inherit',
timeout: 30_000,
})
} catch (err) {
throw new Error(
`Failed to create test user via ${pythonBin} ${SETUP_SCRIPT}: ${
err instanceof Error ? err.message : String(err)
}`
)
}
console.log('[global-setup] Test user ready')
}