import { defineConfig, devices } from '@playwright/test'; const runtimeBaseURL = process.env.PLAYWRIGHT_BASE_URL; const useRuntimeServices = Boolean(runtimeBaseURL); const junitOutputFile = process.env.PLAYWRIGHT_JUNIT_OUTPUT_FILE ?? 'playwright-results.xml'; const outputDir = process.env.PLAYWRIGHT_OUTPUT_DIR ?? 'playwright-artifacts'; export default defineConfig({ testDir: './tests/e2e', timeout: process.env.CI ? 60 * 1000 : 30 * 1000, // Longer timeout in CI expect: { timeout: process.env.CI ? 10000 : 5000, // Longer expect timeout in CI }, fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : undefined, reporter: process.env.CI ? [['list'], ['junit', { outputFile: junitOutputFile }]] : 'html', outputDir, use: { baseURL: runtimeBaseURL ?? 'http://localhost:5173', trace: 'on-first-retry', headless: process.env.CI ? true : false, // CI-specific browser optimizations actionTimeout: process.env.CI ? 15000 : 0, navigationTimeout: process.env.CI ? 45000 : 30000, // Longer for network instability // Network resilience settings ...(process.env.CI && { // Retry failed requests automatically extraHTTPHeaders: { 'Cache-Control': 'no-cache', }, // Ignore HTTPS errors in CI (self-signed certs, etc.) ignoreHTTPSErrors: true, // Wait longer for network operations timeout: 60000, }), }, projects: process.env.CI ? [ // CI Environment: Only run Chromium for reliability in Docker { name: 'chromium', use: { ...devices['Desktop Chrome'], headless: true, launchOptions: { args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-background-timer-throttling', '--disable-backgrounding-occluded-windows', '--disable-renderer-backgrounding', // Keep CI browser args minimal and deterministic. '--disable-extensions', '--disable-plugins', '--aggressive-cache-discard', ], }, }, }, ] : [ // Local Development: Run all browsers { name: 'chromium', use: { ...devices['Desktop Chrome'], }, }, { name: 'firefox', use: { ...devices['Desktop Firefox'], }, }, { name: 'webkit', use: { ...devices['Desktop Safari'], }, }, ], ...(useRuntimeServices ? {} : { webServer: { command: 'yarn dev --host 0.0.0.0 --port 5173 --strictPort', url: 'http://localhost:5173', reuseExistingServer: !process.env.CI, timeout: process.env.CI ? 180 * 1000 : 120 * 1000, // Longer startup timeout in CI stderr: 'pipe', stdout: 'pipe', }, }), });