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:
@@ -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');
|
||||
});
|
||||
});
|
||||
8
frontend/src/test-setup.ts
Normal file
8
frontend/src/test-setup.ts
Normal 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';
|
||||
@@ -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/**']
|
||||
}
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user