import { defineConfig, devices } from "@playwright/test"; import { FIXTURE_PUBLIC_KEY_RAW_BASE64 } from "./tests/e2e/fixtures/gateway-key"; export default defineConfig({ testDir: "tests/e2e", fullyParallel: true, forbidOnly: !!process.env.CI, // host-mode CI runner shares CPU/IO with the long-lived dev stack, // gitea, and the user's host Caddy. The default 6 workers + 1 // retry produced ~7 flakies + 1 hard fail per ui-test run; cap at // 4 workers (still parallel) and allow 4 retries to ride out // transient timing hiccups without inflating wall time. workers: 4, retries: process.env.CI ? 4 : 0, reporter: [["list"], ["html", { open: "never" }]], use: { baseURL: "http://localhost:5173", trace: "retain-on-failure", screenshot: "only-on-failure", }, projects: [ { name: "chromium-desktop", use: { ...devices["Desktop Chrome"] } }, { name: "webkit-desktop", use: { ...devices["Desktop Safari"] } }, // devices["iPhone 13"] picks WebKit by default; the project name // here claims a Chromium engine on a mobile viewport, so the // browser is explicitly overridden. WebKit on a desktop viewport // is already covered by webkit-desktop. { name: "chromium-mobile-iphone-13", use: { ...devices["iPhone 13"], browserName: "chromium" }, }, { name: "chromium-mobile-pixel-5", use: { ...devices["Pixel 5"] } }, ], webServer: { command: "pnpm run dev", url: "http://localhost:5173", reuseExistingServer: !process.env.CI, timeout: 120_000, env: { // The Phase 7 Playwright spec mocks the gateway and signs // every response with the deterministic fixture key in // `tests/e2e/fixtures/gateway-key.ts`. The dev server picks // up the matching public key here so the in-page // `GalaxyClient` accepts the forged signatures. VITE_GATEWAY_RESPONSE_PUBLIC_KEY: FIXTURE_PUBLIC_KEY_RAW_BASE64, }, }, });