Files
ThothII/frontend/e2e/fixtures/fake-pi.mjs
T
marcopanandClaude Sonnet 4.6 1171181f9a test(frontend): Playwright e2e F1 vs backend+fake-pi (hermetic)
Adds a real-browser Playwright e2e of the full F1 disambiguation loop,
driven against the real backend + fake binaries (no VPN, no real Pi, no Python).

- frontend/e2e/fixtures/fake-tht.mjs: stubs tht CLI (session new/list/show)
- frontend/e2e/fixtures/fake-pi.mjs: wraps harness fake-pi-rpc with f1_disambiguation.json
- frontend/playwright.config.ts: two webServer entries (backend:8799, frontend:5199)
- frontend/e2e/f1.spec.ts: open app → create session → wait for SelectWidget → respond

Bug fixes discovered during e2e:
- useSessionStream: add addEventListener for named SSE events (backend sends
  'event: ui_request' etc.; onmessage only fires for unnamed 'event: message')
- FakeEventSource: add no-op addEventListener/removeEventListener stubs
- backend SSE route: add CORS headers manually in writeHead() since
  reply.raw bypasses the @fastify/cors onSend hook
- backend: install and register @fastify/cors for all non-SSE routes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 13:27:00 +02:00

21 lines
966 B
JavaScript
Executable File

#!/usr/bin/env node
// fake-pi.mjs — hermetic PI_BIN stub for e2e tests.
// Ignores all argv (the backend passes --mode rpc --approve) and
// exec()s the scripted fake-pi-rpc.mjs with the F1 disambiguation scenario.
import { fileURLToPath } from "node:url";
import { dirname, resolve } from "node:path";
import { execFileSync } from "node:child_process";
const __dir = dirname(fileURLToPath(import.meta.url));
const fakePiRpc = resolve(__dir, "../../..", "harness/tests/fake_pi/fake_pi_rpc.mjs");
const scenario = resolve(__dir, "../../..", "harness/tests/fake_pi/scripts/f1_disambiguation.json");
// exec replaces the current process so the backend's child handle stays valid.
// On Node.js we use spawnSync with stdio inherit to approximate exec().
const { spawnSync } = await import("node:child_process");
const result = spawnSync(process.execPath, [fakePiRpc, scenario], {
stdio: "inherit",
env: { ...process.env },
});
process.exit(result.status ?? 0);