- tsconfig (allowJs, strict .ts), npm run build -> dist/, typecheck, dev via tsx, ts-jest. - src/index.js is now a launcher (dist build when it matches, else tsx); server moved to app.js. - /api/v2: defineRoute with zod -> request validation, response stripping, OpenAPI 3.1 at /docs/v2; one error shape and one paged-list shape. First endpoints: events, event, me, my registrations. - deploy.sh/install.sh build the backend; rollback to older releases skips the build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ls1vMdg2GYqbnKZmPaX1ot
76 lines
2.7 KiB
TypeScript
76 lines
2.7 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: [
|
|
{
|
|
// tsx runs the TypeScript straight from src/ (never a stale dist/ build).
|
|
command: "node ../e2e/support/prepare-db.js && npx tsx src/index.js",
|
|
cwd: "backend",
|
|
url: `http://localhost:${API_PORT}/api/settings/needs-setup`,
|
|
timeout: 180_000,
|
|
reuseExistingServer: !ci,
|
|
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",
|
|
// The test site has no licence; without this it would be read-only.
|
|
LICENCE_CHECK_DISABLED: "true",
|
|
SCHEDULED_EMAILS_ENABLED: "false",
|
|
// The kiosk test signs a supervisor in with a password (no 2FA code by email).
|
|
TWO_FACTOR_REQUIRED_ROLES: "false",
|
|
// webhooks.spec.ts runs its own receiver on localhost.
|
|
WEBHOOKS_ALLOW_PRIVATE: "true",
|
|
},
|
|
},
|
|
{
|
|
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: !ci,
|
|
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",
|
|
},
|
|
},
|
|
],
|
|
});
|