// #region GlobalSetup [C:2] [TYPE Script] [SEMANTICS e2e, setup, healthcheck] // @BRIEF Pre-flight check before any E2E tests run. // @PRE Backend and frontend must be reachable. // @POST Exits with 1 if either service is down, else sets ENV vars. import { chromium } from '@playwright/test'; const BACKEND_URL = process.env.BACKEND_URL || 'http://127.0.0.1:8101'; const FRONTEND_URL = process.env.FRONTEND_URL || 'http://127.0.0.1:8102'; async function globalSetup() { console.log(`[E2E] Pre-flight check — Backend: ${BACKEND_URL}, Frontend: ${FRONTEND_URL}`); // 1. Check backend health (accept 401/403 as "server is alive but needs auth") try { const healthRes = await fetch(`${BACKEND_URL}/api/health/summary`); if (healthRes.ok) { console.log('[E2E] Backend is healthy ✅'); } else if (healthRes.status === 401 || healthRes.status === 403) { console.log(`[E2E] Backend is alive (HTTP ${healthRes.status} — auth required) ✅`); } else { throw new Error(`Backend health check failed: ${healthRes.status}`); } } catch (err) { console.error(`[E2E] Backend unreachable: ${err.message}`); console.error('[E2E] Make sure the stack is running: docker compose up -d'); process.exit(1); } // 2. Check frontend responds try { const frontRes = await fetch(FRONTEND_URL); if (!frontRes.ok && frontRes.status !== 302) { console.warn(`[E2E] Frontend responded with ${frontRes.status}, continuing anyway`); } else { console.log('[E2E] Frontend is reachable ✅'); } } catch (err) { console.error(`[E2E] Frontend unreachable: ${err.message}`); process.exit(1); } // 3. Verify auth works (can get token) try { const loginRes = await fetch(`${BACKEND_URL}/api/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `username=${encodeURIComponent(process.env.E2E_USERNAME || 'admin')}&password=${encodeURIComponent(process.env.E2E_PASSWORD || 'admin123')}`, }); if (!loginRes.ok) { throw new Error(`Login failed: ${loginRes.status}`); } const loginData = await loginRes.json(); if (!loginData.access_token) { throw new Error('No access_token in login response'); } process.env.E2E_TOKEN = loginData.access_token; console.log('[E2E] Auth token obtained ✅'); } catch (err) { console.error(`[E2E] Auth check failed: ${err.message}`); process.exit(1); } console.log('[E2E] Pre-flight complete — all systems go 🚀'); } export default globalSetup; // #endregion GlobalSetup