From 3c9e40ca718efd11ba5e7d15817e5c471982c7e9 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 12 May 2026 22:02:57 +0200 Subject: [PATCH] test(setup): disable SvelteKit hover prefetch in browser-mode runs Hover-prefetch fires real fetch requests for route loader chunks; those requests go through the same Playwright route handler that serves mocked modules. An in-flight prefetch landing after iframe teardown can hit the handler with a closed birpc channel, raising an unhandled rejection that exits the run with code 1 even when every individual test was green. Add `src/test-setup.ts` that sets `document.body.dataset.sveltekitPreloadData = 'off'` and wire it via `setupFiles` in both `vite.config.ts` (client project) and `vitest.client-coverage.config.ts` (Istanbul coverage config). Add `src/__meta__/browser-preload-disabled.svelte.test.ts` asserting the setup ran. Zero production impact. Issue #553 secondary trigger. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../browser-preload-disabled.svelte.test.ts | 16 ++++++++++++++++ frontend/src/test-setup.ts | 8 ++++++++ frontend/vite.config.ts | 1 + frontend/vitest.client-coverage.config.ts | 1 + 4 files changed, 26 insertions(+) create mode 100644 frontend/src/__meta__/browser-preload-disabled.svelte.test.ts create mode 100644 frontend/src/test-setup.ts diff --git a/frontend/src/__meta__/browser-preload-disabled.svelte.test.ts b/frontend/src/__meta__/browser-preload-disabled.svelte.test.ts new file mode 100644 index 00000000..60e79b2a --- /dev/null +++ b/frontend/src/__meta__/browser-preload-disabled.svelte.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; + +// Browser-mode tests must run with SvelteKit's hover-prefetch disabled. +// Hover-prefetch fires real `fetch` requests for the target route's loader +// chunks; those go through the same Playwright route handler that serves +// mocked modules. Even after `cleanup()` tears down the iframe, an in-flight +// prefetch can still hit the handler — and if the worker's birpc channel has +// closed by then, the handler raises an unhandled rejection. ADR-012 / #553. +// +// This test enforces that the test-setup file ran and switched preload-data +// off on `document.body` before any spec started rendering. +describe('browser test setup', () => { + it('disables SvelteKit hover prefetch on document.body', () => { + expect(document.body.dataset.sveltekitPreloadData).toBe('off'); + }); +}); diff --git a/frontend/src/test-setup.ts b/frontend/src/test-setup.ts new file mode 100644 index 00000000..b7317f9c --- /dev/null +++ b/frontend/src/test-setup.ts @@ -0,0 +1,8 @@ +// Disable SvelteKit hover-prefetch in browser-mode tests. ADR-012 / #553. +// +// Hover-prefetch fires real fetch requests for route loader chunks; those +// requests go through the same Playwright route handler that serves mocked +// modules. An in-flight prefetch landing after iframe teardown can hit the +// route handler with a closed birpc channel, raising an unhandled rejection +// that exits the run with code 1 even when every individual test was green. +document.body.dataset.sveltekitPreloadData = 'off'; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index ebf88051..cdde2860 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -77,6 +77,7 @@ export default defineConfig({ screenshotDirectory: 'test-results/screenshots', screenshotFailures: true }, + setupFiles: ['./src/test-setup.ts'], include: ['src/**/*.svelte.{test,spec}.{js,ts}'], exclude: ['src/lib/server/**'] } diff --git a/frontend/vitest.client-coverage.config.ts b/frontend/vitest.client-coverage.config.ts index c1435ceb..d6ada2f5 100644 --- a/frontend/vitest.client-coverage.config.ts +++ b/frontend/vitest.client-coverage.config.ts @@ -32,6 +32,7 @@ export default defineConfig({ screenshotDirectory: 'test-results/screenshots', screenshotFailures: true }, + setupFiles: ['./src/test-setup.ts'], include: ['src/**/*.svelte.{test,spec}.{js,ts}'], exclude: ['src/lib/server/**'], coverage: {