import { defineConfig, devices } from "@playwright/test"; import path from "node:path"; /** * Parcours de bout en bout du dashboard admin. * * Le serveur de test (apps/admin/test/e2e/server.mjs) reproduit la topologie de * production — statique servi + `/admin/*` proxifié vers la VRAIE application * Fastify — avec un faux pool à la place de Postgres. Démarrage ~1 s, aucun * conteneur, conformément au principe suivi par le reste de la suite. * * Performance : les scénarios tournent en parallèle et partagent une session * enregistrée une fois par le projet `setup`. Ils ne se marchent pas dessus car * aucun ne reprogramme le faux pool : les variations de données passent par * `page.route`, qui est propre à chaque onglet. */ const PORT = Number(process.env.E2E_PORT || 4319); const STORAGE_STATE = path.join(process.cwd(), "node_modules/.cache/playwright/admin-auth.json"); export default defineConfig({ testDir: "apps/admin/test/e2e", fullyParallel: true, workers: process.env.CI ? 2 : 4, forbidOnly: !!process.env.CI, retries: 0, reporter: [["list", { printSteps: false }]], timeout: 15000, expect: { timeout: 5000 }, outputDir: "node_modules/.cache/playwright/results", use: { baseURL: `http://127.0.0.1:${PORT}`, trace: "retain-on-failure", screenshot: "only-on-failure", video: "off", }, projects: [ { name: "setup", testMatch: /auth\.setup\.js/ }, { name: "chromium", testMatch: /.*\.spec\.js/, use: { ...devices["Desktop Chrome"], storageState: STORAGE_STATE }, dependencies: ["setup"], }, ], webServer: { command: "node apps/admin/test/e2e/server.mjs", url: `http://127.0.0.1:${PORT}/`, env: { E2E_STANDALONE: "1", E2E_PORT: String(PORT) }, reuseExistingServer: !process.env.CI, timeout: 30000, stdout: "ignore", stderr: "pipe", }, });