- Auto-expiry: expired events auto-end on GET /events via task manager - Height: _estimate_markdown_height adapted to unit=8px scale with padding detection - CRITICAL-1: removed dead import remove_chart_from_position (QA finding) - CRITICAL-2: added chart alive check in ensure_banner_chart (QA finding) - CRITICAL-3: fixed test assertions update_markdown_chart → update_banner_on_dashboard - @POST contract: fixed return range [2,12] → [19,200] - Tests: 8 new tests (auto-expiry + layout height)
69 lines
2.5 KiB
JavaScript
69 lines
2.5 KiB
JavaScript
// #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
|