import { request } from '@playwright/test'; import { CONFIG } from './helpers'; /** * Global Setup — Crée les comptes de test et vérifie la santé des services. * S'exécute une seule fois avant toute la suite. * * NOTE: globalSetup exporte une fonction async, pas des appels à test(). */ export default async function globalSetup() { const ctx = await request.newContext({ baseURL: CONFIG.baseURL }); // ── Créer les comptes de test ────────────────────────────────── const users = [CONFIG.users.listener, CONFIG.users.creator, CONFIG.users.admin]; for (const user of users) { try { const response = await ctx.post('/api/v1/auth/register', { data: { email: user.email, password: user.password, username: user.username, password_confirmation: user.password, }, }); if (response.ok()) { console.log(` ✓ Compte créé: ${user.email}`); } else if (response.status() === 409 || response.status() === 422) { console.log(` ⊘ Compte existant: ${user.email}`); } else { const body = await response.text().catch(() => ''); console.warn(` ⚠ Échec création ${user.email}: ${response.status()} ${body.slice(0, 120)}`); } } catch (e) { console.warn(` ⚠ API indisponible pour ${user.email}: ${e}`); } } // ── Vérification santé des services ──────────────────────────── try { const health = await ctx.get('/api/v1/health'); console.log(` Backend API: ${health.ok() ? '✓ OK' : '✗ DOWN'} (${health.status()})`); } catch { console.error(' ✗ Backend API inaccessible'); } // ── Vérification que le rate limiting est désactivé ──────────── // Le backend doit être démarré avec APP_ENV=test ou DISABLE_RATE_LIMIT_FOR_TESTS=true // Utiliser `make dev-e2e` pour démarrer correctement. // // Historique : avant 2026-04-23, ce bloc se contentait d'un console.error // encadré quand la probe détectait un 429. Les tests continuaient quand // même, ce qui masquait un lockout progressif des seed users sur // loginViaAPI (ex. 02-navigation.spec.ts:77 flake). Maintenant on // hard-fail : si le backend n'est pas en mode test, on abort tout de suite. let rateLimitActive = false; try { for (let i = 0; i < 10; i++) { const r = await ctx.post('/api/v1/auth/login', { data: { email: 'rate-limit-probe@test.invalid', password: 'x' }, }); if (r.status() === 429) { rateLimitActive = true; break; } } } catch { // Probe failure (API down, network) : on laisse filer, le health check // ci-dessus aura déjà signalé le problème. } if (rateLimitActive) { throw new Error( 'E2E aborted: rate limiting is ACTIVE on the backend. ' + 'Stop the current backend and restart with `make dev-e2e` ' + '(sets APP_ENV=test + DISABLE_RATE_LIMIT_FOR_TESTS=true). ' + 'Full env set : tests/e2e/playwright.config.ts webServer.env.', ); } console.log(' Rate limiting: ✓ disabled (test mode)'); try { const health = await ctx.get(`${CONFIG.streamURL}/health`); console.log(` Stream Server: ${health.ok() ? '✓ OK' : '✗ DOWN'} (${health.status()})`); } catch { console.error(' ✗ Stream Server inaccessible (non bloquant)'); } await ctx.dispose(); }