Files
ss-tools/frontend/e2e/fixtures/global-setup.js
busya 31680a1bc9 fix(maintenance): auto-expiry + adaptive markdown height + tests
- 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)
2026-05-25 08:36:33 +03:00

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