import { defineConfig, devices } from '@playwright/test'; /** * Cross-browser + mobile viewport matrix for E2E quality gate. * * - `chromium` runs ALL numbered specs (01-07) including transactional tests * that mutate on-chain state. * - Other projects depend on `chromium` finishing first (chain state must exist) * and only run read-only / UI-rendering specs (03, 06, 07). */ // Read-only specs safe to run in every browser/viewport after chain state exists. const CROSS_BROWSER_SPECS = '0[367]-*.spec.ts'; export default defineConfig({ testDir: './tests/e2e', testMatch: process.env.CI ? '[0-9]*.spec.ts' : '**/*.spec.ts', fullyParallel: false, timeout: 10 * 60 * 1000, expect: { timeout: 30_000, }, retries: process.env.CI ? 1 : 0, workers: process.env.CI ? 1 : undefined, use: { headless: true, actionTimeout: 0, launchOptions: { args: ['--disable-dev-shm-usage', '--no-sandbox'], }, }, projects: [ /* ── Desktop browsers ─────────────────────────────────── */ { name: 'chromium', use: { ...devices['Desktop Chrome'], viewport: { width: 1280, height: 720 }, screen: { width: 1280, height: 720 }, }, }, { name: 'firefox', use: { ...devices['Desktop Firefox'], viewport: { width: 1280, height: 720 }, screen: { width: 1280, height: 720 }, }, dependencies: ['chromium'], testMatch: CROSS_BROWSER_SPECS, }, { name: 'webkit', use: { ...devices['Desktop Safari'], viewport: { width: 1280, height: 720 }, screen: { width: 1280, height: 720 }, }, dependencies: ['chromium'], testMatch: CROSS_BROWSER_SPECS, }, /* ── Mobile viewports ─────────────────────────────────── */ { name: 'iphone', use: { ...devices['iPhone 14'], }, dependencies: ['chromium'], testMatch: CROSS_BROWSER_SPECS, }, { name: 'android', use: { ...devices['Pixel 7'], }, dependencies: ['chromium'], testMatch: CROSS_BROWSER_SPECS, }, ], });