Files
hope-events/playwright.config.ts
T
joshuaandClaude Opus 5.5 48660732fe Run background jobs on a pg-boss queue; add e2e tests, CI and deploy script
Timed jobs move from in-process timers to a job registry run by pg-boss:
once per schedule across processes, retries, run history, cron schedules
in the church timezone, and an admin Background jobs page with Run now.
Playwright end-to-end tests run against their own seeded database. A
Gitea Actions workflow runs backend tests, frontend checks and the e2e
tests, and deploys v* tags with scripts/deploy.sh once secrets are set.
Also fixes the at-the-door check-in count for multi-day tickets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:49:46 +02:00

71 lines
2.4 KiB
TypeScript

import { defineConfig, devices } from "@playwright/test";
// eslint-disable-next-line @typescript-eslint/no-require-imports
const { e2eDatabaseUrl } = require("./e2e/support/db-url");
// End-to-end tests: their own backend (port 5100) and frontend (port 3100) against a
// separate database that is recreated and seeded on every run (e2e/support/prepare-db.js).
// Run with `npm run test:e2e`. In CI (CI=true) the frontend is built and started instead
// of run in dev mode.
const API_PORT = 5100;
const WEB_PORT = 3100;
const ci = !!process.env.CI;
const databaseUrl = e2eDatabaseUrl();
export default defineConfig({
testDir: "./e2e",
testMatch: "**/*.spec.ts",
// One shared database, so tests run one after another.
workers: 1,
fullyParallel: false,
retries: ci ? 1 : 0,
timeout: 120_000,
expect: { timeout: 20_000 },
reporter: ci ? [["list"], ["html", { open: "never", outputFolder: "e2e/report" }]] : "list",
outputDir: "e2e/test-results",
use: {
baseURL: `http://localhost:${WEB_PORT}`,
trace: "retain-on-failure",
screenshot: "only-on-failure",
// Dev-mode pages compile on first visit.
navigationTimeout: 90_000,
},
projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }],
webServer: [
{
command: "node ../e2e/support/prepare-db.js && node src/index.js",
cwd: "backend",
url: `http://localhost:${API_PORT}/api/settings/needs-setup`,
timeout: 180_000,
reuseExistingServer: false,
stdout: "ignore",
stderr: "pipe",
env: {
PORT: String(API_PORT),
DATABASE_URL: databaseUrl,
E2E_DATABASE_URL: databaseUrl,
FRONTEND_URL: `http://localhost:${WEB_PORT}`,
APP_BASE_URL: `http://localhost:${WEB_PORT}`,
JOBS_ENABLED: "false",
SCHEDULED_EMAILS_ENABLED: "false",
// The kiosk test signs a supervisor in with a password (no 2FA code by email).
TWO_FACTOR_REQUIRED_ROLES: "false",
},
},
{
command: ci ? `npm run build && npx next start -p ${WEB_PORT}` : `npx next dev -p ${WEB_PORT}`,
cwd: "frontend",
url: `http://localhost:${WEB_PORT}`,
timeout: 600_000,
reuseExistingServer: false,
stdout: "ignore",
stderr: "pipe",
env: {
NEXT_PUBLIC_API_URL: `http://localhost:${API_PORT}`,
API_URL: `http://localhost:${API_PORT}`,
NEXT_DIST_DIR: ci ? ".next" : ".next-e2e",
NEXT_TELEMETRY_DISABLED: "1",
},
},
],
});