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>
37 lines
1.3 KiB
JavaScript
Executable File
37 lines
1.3 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
// fake-tht.mjs — hermetic THT_BIN stub for e2e tests.
|
|
// Parses argv and emits the minimal JSON the backend expects.
|
|
// The backend's ThtRunner prepends: thtBin -c <config> <subcommand> [args...]
|
|
// So we skip the first two args after node (-c <configPath>).
|
|
|
|
const argv = process.argv.slice(2); // drop "node" + script path
|
|
|
|
// Strip leading "-c <value>" pair (ThtRunner always prepends this).
|
|
let args = argv;
|
|
if (args[0] === "-c") {
|
|
args = args.slice(2);
|
|
}
|
|
|
|
// args now starts with the subcommand group, e.g. ["session","new","...","--json"]
|
|
const sub = args.slice(0, 2).join(" ");
|
|
|
|
if (sub === "session new") {
|
|
// session new <question> [--provider p] [--model m] [--thinking t] [--name n] --json
|
|
process.stdout.write(JSON.stringify({ id: "e2e-1" }) + "\n");
|
|
} else if (sub === "session list") {
|
|
process.stdout.write(JSON.stringify([]) + "\n");
|
|
} else if (sub === "session show") {
|
|
const id = args[2] ?? "e2e-1";
|
|
process.stdout.write(
|
|
JSON.stringify({ id, status: "open", provider: null, model: null, thinking: null }) + "\n",
|
|
);
|
|
} else if (sub === "sql preview") {
|
|
process.stdout.write(
|
|
JSON.stringify({ columns: [], rows: [], execution_ms: 0, truncated: false }) + "\n",
|
|
);
|
|
} else {
|
|
// Unknown subcommand — exit 0 with empty JSON so the backend doesn't crash.
|
|
process.stdout.write("{}\n");
|
|
}
|
|
process.exit(0);
|