import path from 'node:path'; import { defineConfig, devices } from '@playwright/test'; import { config } from 'dotenv'; // Load .env.test so webServer processes and tests use the test database if (!process.env.CI) { config({ path: path.resolve(__dirname, '.env.test'), override: true }); } // Server ports — configurable via env to avoid conflicts with dev containers. // Defaults match .env.test (3011/3010); GitHub Actions uses 3001/3000. const API_PORT = process.env.API_PORT ?? '3001'; const WEB_PORT = process.env.WEB_PORT ?? '3000'; /** * Playwright E2E configuration for Goodgo Platform. * * Projects: * - "api" — tests against the NestJS API (port 3011 local CI / 3001 GH Actions) * - "web" — tests against the Next.js frontend (port 3010 local CI / 3000 GH Actions) * * Database isolation: * - globalSetup runs migrations + seed on the test DB * - globalTeardown cleans up test-generated data after all tests */ export default defineConfig({ testDir: './e2e', globalSetup: './e2e/global-setup.ts', globalTeardown: './e2e/global-teardown.ts', fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : undefined, reporter: process.env.CI ? [['html', { open: 'never' }], ['github']] : [['html', { open: 'on-failure' }]], use: { trace: 'on-first-retry', screenshot: 'only-on-failure', }, projects: [ // API E2E tests — no browser needed, uses APIRequestContext { name: 'api', testDir: './e2e/api', use: { baseURL: process.env.API_BASE_URL ?? `http://localhost:${API_PORT}/api/v1/`, }, }, // Web E2E tests — Chromium browser { name: 'web', testDir: './e2e/web', use: { ...devices['Desktop Chrome'], baseURL: process.env.WEB_BASE_URL ?? `http://localhost:${WEB_PORT}`, }, }, ], webServer: [ { command: `PORT=${API_PORT} pnpm --filter @goodgo/api run dev`, url: `http://localhost:${API_PORT}/api/v1/docs`, reuseExistingServer: !process.env.CI, timeout: 60_000, env: { ...process.env as Record, NODE_ENV: 'test', PORT: API_PORT, DATABASE_URL: process.env.DATABASE_URL ?? '', }, }, { command: `pnpm exec next dev --port ${WEB_PORT}`, cwd: './apps/web', url: `http://localhost:${WEB_PORT}`, reuseExistingServer: !process.env.CI, timeout: 30_000, env: { ...process.env as Record, PORT: WEB_PORT, NODE_ENV: 'test', NEXT_PUBLIC_API_URL: `http://localhost:${API_PORT}/api/v1`, }, }, ], });