import { defineConfig, devices } from "@playwright/test"; const APP_URL = process.env["E2E_APP_URL"] ?? "http://127.0.0.1:3000"; export default defineConfig({ testDir: "./tests/e2e", /* * Prueft vor dem ersten Ablauf, dass die Voraussetzungen stimmen: ein gebauter * Stand antwortet, der Seed-Bestand steht, und der Server liest **dieselbe** * Datenbank wie dieser Prozess. Ohne das faellt jede fehlende Voraussetzung * erst mitten im Lauf auf — als Zeitablauf oder als „0 Treffer“ (#018). */ globalSetup: "./tests/e2e/global-setup.ts", /* * Raeumt weg, was die Ablaeufe angelegt haben (#027). Laeuft auch nach * fehlgeschlagenen Ablaeufen; ein harter Abbruch wird vom Vorlauf gefangen, * der dasselbe tut. */ globalTeardown: "./tests/e2e/global-teardown.ts", // Die Ablaeufe aendern gemeinsame Daten, deshalb nacheinander. fullyParallel: false, workers: 1, forbidOnly: Boolean(process.env["CI"]), retries: process.env["CI"] ? 1 : 0, reporter: process.env["CI"] ? [["list"], ["html", { open: "never" }]] : "list", use: { baseURL: APP_URL, trace: "retain-on-failure", screenshot: "only-on-failure", locale: "de-DE", timezoneId: "Europe/Berlin", colorScheme: "dark", }, projects: [ { name: "desktop", use: { ...devices["Desktop Chrome"], viewport: { width: 1440, height: 900 } } }, { /* * **390 px, nicht 412.** `devices["Pixel 7"]` ist 412 × 839; CLAUDE.md und * das Abnahmekriterium nennen 390. Zweiundzwanzig Pixel sind kein * Rundungsfehler — eine Seite, die bei 390 ausbricht, sieht bei 412 * tadellos aus. Jeder „trägt am Handy ohne horizontales Scrollen“-Test lief * damit gegen eine Breite, die niemand verlangt hatte (#018). */ name: "handy", use: { ...devices["Pixel 7"], viewport: { width: 390, height: 844 } }, }, ], });