teqo-backup/playwright.config.ts
Francisco Ignácio Fontoura Solla 52c402c049 Fix the three leader-flow bugs the e2e suite pinned + RSC prop contracts
E2E-driven fixes (the suite now passes 9/9; two journeys remain
latency-flaky on cold dev compiles and pass on retry):

- leader home crashed with Forbidden since the remodel:
  loadLeaderContactsPageData loaded municipality options through the
  staff-scoped loader (leaders are denied municipality reads); their scope
  now derives from the engaged leadership's linked municipalities
- leaders saw 'Contato — —' instead of their supporters' names:
  getAccessibleContactIds now mirrors canReadSupporter for leaders
  (contacts of supporters they created)
- leader nav had two items with the same /campanha href (duplicate React
  keys); the leader home IS the contact tool — one entry
- RSC serialization contracts: CampaignListPagination is a server component
  again (hrefForPage stays server-side; CampaignTransitionAnchor client leaf
  intercepts clicks with serializable props); CampaignSearchForm takes
  basePath instead of a function prop
- hasAnyEstimate moved from the 'use client' PledgeEstimateForm to
  voteEstimate.ts — server components may not call client-module exports
- playwright.config honors TEQO_TEST_DATABASE_URL (parity with
  vitest.setup.ts) and uses a fixed .next/e2e dist dir so Next stops
  appending per-PID entries to tsconfig include; report artifacts
  eslint-ignored
2026-07-24 00:38:40 -03:00

97 lines
3.6 KiB
TypeScript

import { defineConfig, devices } from '@playwright/test'
import { config as loadEnv } from 'dotenv'
import { assertTestDatabase } from './tests/helpers/assertTestDatabase'
/**
* e2e tests boot a real dev server that seeds/deletes records, so they must run
* against the isolated test database — never .env / .env.local (production).
* `override: true` guarantees the test DB wins over anything in the shell.
*/
loadEnv({ path: '.env.test', override: true })
// Optional local override when the default Docker port is occupied (e.g. mapped
// to 5433) — same escape hatch vitest.setup.ts documents.
if (process.env.TEQO_TEST_DATABASE_URL) {
process.env.DATABASE_URL = process.env.TEQO_TEST_DATABASE_URL
}
assertTestDatabase(process.env.DATABASE_URL)
const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? 'http://localhost:3000'
const webServerPort = new URL(baseURL).port || (baseURL.startsWith('https:') ? '443' : '80')
const workersOverride = process.env.PLAYWRIGHT_WORKERS
const workers = workersOverride === undefined ? 2 : Number(workersOverride)
if (!Number.isInteger(workers) || workers < 2) {
throw new Error('PLAYWRIGHT_WORKERS must be an integer of at least 2.')
}
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: './tests/e2e',
fullyParallel: true,
workers,
/* 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,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: 'html',
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL,
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
},
projects: [
{
name: 'setup',
testMatch: /setup\.e2e\.spec\.ts/,
use: { ...devices['Desktop Chrome'], channel: 'chromium' },
},
{
name: 'campaign',
testMatch: /campaign.*\.e2e\.spec\.ts/,
dependencies: ['setup'],
use: { ...devices['Desktop Chrome'], channel: 'chromium' },
},
{
name: 'frontend',
testMatch: /frontend\.e2e\.spec\.ts/,
dependencies: ['campaign'],
use: { ...devices['Desktop Chrome'], channel: 'chromium' },
},
{
name: 'admin',
testMatch: /admin\.e2e\.spec\.ts/,
dependencies: ['frontend'],
fullyParallel: false,
use: { ...devices['Desktop Chrome'], channel: 'chromium' },
},
],
webServer: {
command: 'pnpm dev',
/*
* Never reuse a dev server a developer may already have running against the
* production database — always start a fresh one bound to the test DB.
*/
reuseExistingServer: false,
url: baseURL,
/* Force the isolated test database into the server process. */
env: {
DATABASE_URL: process.env.DATABASE_URL as string,
PORT: webServerPort,
// Fixed dist dir: Next dev appends `<distDir>/types/**/*.ts` to
// tsconfig.json's include with an EXACT-string check, so per-process
// names polluted tsconfig with one entry per run. A prior Playwright
// process tearing down late can, rarely, delete files of the next run's
// server — if a boot flakes, rerun (dev-only trade-off).
NEXT_DIST_DIR: '.next/e2e',
PAYLOAD_SECRET: process.env.PAYLOAD_SECRET ?? 'test-only-secret-not-used-in-production',
NEXT_PUBLIC_SITE_URL: process.env.NEXT_PUBLIC_SITE_URL ?? baseURL,
},
},
})