pcbjam/tests/playwright-web.config.ts
Gergő Törcsvári 6675c1f0fc
collab-presence 0009 A: real session identity for presence + comments
presenceUser()/userSlug() now resolve the authenticated user: a plain
/api/me fetch (GPL no-link rule — no closed contract import) races the WASM
boot and is awaited before presence/comments bind. `?user=`/`?libowner=`
overrides are gated behind VITE_ALLOW_USER_OVERRIDE=1 (dev script + e2e
harnesses set it; prod builds never do). Anonymous/example-backend sessions
keep the pre-auth slug fallback. Fixes prod's empty presence (everyone was
"local-user", deduped as own tabs) and comment authorship in one move.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A42xfPFNdfsUt9eowkC9eM
2026-07-16 17:25:56 +02:00

99 lines
4.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineConfig, devices } from '@playwright/test';
/**
* E2E config for the React WEB APP (web/standalone editor at :3048 + the
* @pcbjam/backend-example reference backend at :3060), as opposed to
* playwright-kicad.config.ts which drives the standalone tool harness HTMLs
* under tests/apps/kicad.
*
* These tests exercise the real web open paths: navigate to /:scope/projects/:name/<file>,
* let WasmTool boot the tool in-document (boot.ts), drive the project into MEMFS
* and auto-open the file (open-flow.ts via Module.kicadOpenFile), and assert the
* editor loaded wizard-free.
*
* The backend serves a single project off the local filesystem — no DB, no
* seeding. The webServer block reuses an already-running stack (`pnpm dev` from
* web/) or cold-starts it with the env below, pointing PROJECT_DIR at the
* committed tests/fixtures/demo project (slug "demo").
*
* Firefox is the reliable headless target on ARM Mac (Chromium SwiftShader WebGL
* bug); use --project=chromium (system Chrome) for headed debugging.
*/
const FRONTEND_URL = process.env.WEB_APP_URL ?? 'http://localhost:3048';
// Keep the cold-started stack consistent with WEB_APP_URL overrides (e.g. a
// sibling worktree squatting :3048): vite binds the URL's port and the backend
// allows that origin, so overriding one env var relocates the whole frontend.
const FRONTEND_PORT = new URL(FRONTEND_URL).port || '3048';
// Backend counterpart — same override story for :3060 squatters. BACKEND_URL
// is the var global-setup-web.ts already probes; the cold-started reference
// backend binds its port and the editor is pointed at it.
const BACKEND_URL = process.env.BACKEND_URL ?? 'http://localhost:3060';
const BACKEND_PORT = new URL(BACKEND_URL).port || '3060';
export default defineConfig({
globalSetup: './web/global-setup-web.ts',
testDir: './web',
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 1 : 0,
// KiCad WASM is process-global (one runtime per page) and each tool wasm is
// 40200 MB; run serially to avoid loading several giant runtimes at once.
workers: 1,
reporter: 'html',
timeout: 180000, // tool wasm download + boot + open can take minutes
use: {
baseURL: FRONTEND_URL,
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
},
projects: [
{
name: 'firefox',
testIgnore: /mobile-.*\.spec\.ts/,
use: { ...devices['Desktop Firefox'], viewport: { width: 1280, height: 720 } },
},
{
name: 'chromium',
testIgnore: /mobile-.*\.spec\.ts/,
use: { channel: 'chrome', viewport: { width: 1280, height: 720 } },
},
{
// Canvas-only mobile mode (features/mobile). Mobile emulation is
// Chromium-only, and headless SwiftShader WebGL is broken on ARM Mac (see
// header) — run this project headed locally: --project=mobile-chromium --headed.
name: 'mobile-chromium',
testMatch: /mobile-.*\.spec\.ts/,
use: { ...devices['Pixel 7'], channel: 'chrome' },
},
],
webServer: {
// Best-effort: reuse the dev stack if it's already up (the common case);
// otherwise cold-start turbo dev with the env a fresh checkout needs
// (turbo passes these through, so no hand-copied .env files required).
command: 'pnpm --dir ../web dev',
url: FRONTEND_URL,
reuseExistingServer: true,
timeout: 120000,
env: {
...process.env,
// resolved against web/backend/ (the backend's cwd)
PROJECT_DIR: '../../tests/fixtures/demo',
PORT: BACKEND_PORT,
VITE_API_BASE_URL: BACKEND_URL,
CORS_ORIGIN: FRONTEND_URL,
STANDALONE_PORT: FRONTEND_PORT,
// The missing-file tool-switch spec builds a browser-local (IDB) project
// through the home page — same flag the dev/demo stacks set
// (scripts/dev-gpl.mjs). Only effective on cold starts: with
// reuseExistingServer an already-running stack must have set it itself.
VITE_LOCAL_PROJECTS: 'idb',
// e2e identity isolation: presence/comments specs mint per-run users via
// `?user=` — only builds that set this honor the param (0009).
VITE_ALLOW_USER_OVERRIDE: '1',
},
},
});