import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' import { defineConfig, devices } from '@playwright/test' const frontendRoot = join(dirname(fileURLToPath(import.meta.url)), '..') const baseURL = process.env.E2E_BASE_URL ?? 'http://localhost:5190' const backendPort = Number(process.env.E2E_BACKEND_PORT ?? 3010) const frontendPort = Number(process.env.E2E_FRONTEND_PORT ?? 5190) export default defineConfig({ testDir: '.', testMatch: '**/*.spec.ts', timeout: 120_000, fullyParallel: false, forbidOnly: Boolean(process.env.CI), retries: process.env.CI ? 1 : 0, workers: 1, reporter: [['list'], ['html', { open: 'never', outputFolder: 'playwright-report' }]], globalTeardown: './global-teardown.ts', use: { baseURL, trace: 'retain-on-failure', screenshot: 'only-on-failure', video: 'off', locale: 'fa-IR', }, projects: [ { name: 'mobile', use: { ...devices['Pixel 7'], ...(process.env.PLAYWRIGHT_CHROME_CHANNEL ? { channel: process.env.PLAYWRIGHT_CHROME_CHANNEL as 'chrome' } : {}), }, }, { name: 'desktop', use: { ...devices['Desktop Chrome'], viewport: { width: 1280, height: 800 }, ...(process.env.PLAYWRIGHT_CHROME_CHANNEL ? { channel: process.env.PLAYWRIGHT_CHROME_CHANNEL as 'chrome' } : {}), }, }, ], webServer: [ { command: 'node scripts/e2e-backend.mjs', cwd: frontendRoot, url: `http://127.0.0.1:${backendPort}/health`, timeout: 120_000, reuseExistingServer: false, }, { command: `npx vite --port ${frontendPort} --strictPort`, cwd: frontendRoot, port: frontendPort, timeout: 120_000, reuseExistingServer: false, env: { ...process.env, VITE_DEV_PORT: String(frontendPort), VITE_DEV_API_TARGET: `http://127.0.0.1:${backendPort}`, VITE_E2E: '1', }, }, ], })