import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ testDir: './src/__tests__/e2e', timeout: 30000, expect: { timeout: 5000 }, // Run tests sequentially to avoid database conflicts with SQLite fullyParallel: false, // Fail the build on CI if you accidentally left test.only in the source code. forbidOnly: !!process.env.CI, // Retry on CI only. retries: process.env.CI ? 2 : 0, // Always run with 1 worker to avoid database conflicts with SQLite workers: 1, // Reporter to use reporter: 'html', // Global setup and teardown globalSetup: require.resolve('./src/__tests__/e2e/global.setup'), // Use base URL for relative navigation use: { baseURL: 'http://localhost:3000', // Collect trace when retrying the failed test. trace: 'on-first-retry', // Capture screenshot only on failure screenshot: 'only-on-failure', }, // Configure projects projects: [ // Setup project - runs before all other projects { name: 'setup', testMatch: /global\.setup\.ts/, }, // Main Chromium project with regular user authentication { name: 'chromium', use: { ...devices['Desktop Chrome'], // Use prepared auth state for regular user tests storageState: 'playwright/.auth/user.json', }, dependencies: ['setup'], }, // Admin user project { name: 'chromium-admin', use: { ...devices['Desktop Chrome'], // Use prepared auth state for admin tests storageState: 'playwright/.auth/admin.json', }, dependencies: ['setup'], }, // Unauthenticated project - for tests that don't require login { name: 'chromium-unauth', use: { ...devices['Desktop Chrome'], // No authentication state storageState: undefined, }, dependencies: ['setup'], }, ], // Run your local dev server before starting the tests webServer: { command: 'DATABASE_URL="postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev" npm run dev', url: 'http://localhost:3000', timeout: 120000, reuseExistingServer: !process.env.CI, }, });