import { defineConfig, devices } from '@playwright/test' /** * Playwright config — tests end-to-end Rubis. * * Stratégie : * - On lance API + SPA en mode `test_e2e` via webServer (Playwright les * spawn et attend leur readiness avant de jouer les tests). * - DB cible : `rubis_test_e2e` — séparée de la DB dev. Reset entre * chaque test via POST /__test__/reset (cf. tests/helpers/api.ts). * - Stripe : mocké au niveau API via __setStripeForTests + endpoint * /__test__/stripe/* (cf. test_e2e_controller). Aucune connexion Stripe. * - Mail : SMTP local Mailpit (1025) — par défaut MAIL_DRIVER=smtp. * * Variables d'env critiques pour l'API : * - NODE_ENV=test_e2e ← active les routes /__test__/ + bypass * - PG_DB_NAME=rubis_test_e2e * - APP_KEY=… ← obligatoire (générer si manque) * - WEB_URL=http://localhost:5173 * - STRIPE_SECRET_KEY=sk_test_e2e ← bidon (jamais utilisé, mock injecté) * - STRIPE_WEBHOOK_SECRET=whsec_e2e ← bidon * * Pour lancer en local : * pnpm e2e:setup # crée + migre la DB rubis_test_e2e * pnpm e2e # lance Playwright (spawn API + SPA via webServer) * pnpm e2e:ui # mode UI interactif * * En CI : * pnpm e2e:setup && pnpm e2e */ export default defineConfig({ testDir: './tests', fullyParallel: false, // tests séquentiels — chaque test reset la DB forbidOnly: !!process.env.CI, retries: process.env.CI ? 1 : 0, workers: 1, // ne pas paralléliser : un seul reset DB à la fois reporter: process.env.CI ? 'github' : 'list', timeout: 30_000, expect: { timeout: 5_000, }, use: { baseURL: process.env.E2E_WEB_URL ?? 'http://localhost:5173', trace: 'on-first-retry', screenshot: 'only-on-failure', video: process.env.CI ? 'retain-on-failure' : 'off', locale: 'fr-FR', timezoneId: 'Europe/Paris', }, projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'] }, }, ], /** * Spawn API + SPA. Playwright attend que `url` répond avant de lancer * les tests. Si tu fais tourner ton propre stack en parallèle, set * `E2E_SKIP_WEBSERVER=1` pour désactiver. */ webServer: process.env.E2E_SKIP_WEBSERVER ? undefined : [ { // API Adonis — IMPORTANT : `reuseExistingServer: false` pour // éviter de tomber sur une instance dev (NODE_ENV=development) // qui n'aurait pas les routes /__test__/* (gated par test_e2e). // Si tu as `pnpm dev` qui tourne en parallèle sur 3333, stoppe-le // avant — Playwright va throw "EADDRINUSE" sinon. command: 'pnpm --filter @rubis/api dev', url: 'http://localhost:3333/api/v1/health', reuseExistingServer: false, timeout: 60_000, env: { NODE_ENV: 'test_e2e', PG_DB_NAME: process.env.E2E_PG_DB_NAME ?? 'rubis_test_e2e', STRIPE_SECRET_KEY: 'sk_test_e2e_dummy', STRIPE_WEBHOOK_SECRET: 'whsec_e2e_dummy', WEB_URL: 'http://localhost:5173', LANDING_URL: 'http://localhost:5174', }, }, { // SPA Vite — même rationale. command: 'pnpm --filter @rubis/web dev', url: 'http://localhost:5173', reuseExistingServer: false, timeout: 60_000, }, ], })