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) <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-05-12 22:02:57 +02:00
parent 9f1b8b4215
commit 3c9e40ca71
4 changed files with 26 additions and 0 deletions

View File

@@ -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');
});
});

View File

@@ -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';

View File

@@ -77,6 +77,7 @@ export default defineConfig({
screenshotDirectory: 'test-results/screenshots', screenshotDirectory: 'test-results/screenshots',
screenshotFailures: true screenshotFailures: true
}, },
setupFiles: ['./src/test-setup.ts'],
include: ['src/**/*.svelte.{test,spec}.{js,ts}'], include: ['src/**/*.svelte.{test,spec}.{js,ts}'],
exclude: ['src/lib/server/**'] exclude: ['src/lib/server/**']
} }

View File

@@ -32,6 +32,7 @@ export default defineConfig({
screenshotDirectory: 'test-results/screenshots', screenshotDirectory: 'test-results/screenshots',
screenshotFailures: true screenshotFailures: true
}, },
setupFiles: ['./src/test-setup.ts'],
include: ['src/**/*.svelte.{test,spec}.{js,ts}'], include: ['src/**/*.svelte.{test,spec}.{js,ts}'],
exclude: ['src/lib/server/**'], exclude: ['src/lib/server/**'],
coverage: { coverage: {