fix(#553): close [birpc] rpc is closed race — sync-factory invariant + duplicate-ID guard + PR #10267 backport #555

Merged
marcel merged 13 commits from feat/issue-553-birpc-async-mock-factory into main 2026-05-13 12:55:49 +02:00
4 changed files with 26 additions and 0 deletions
Showing only changes of commit 3c9e40ca71 - Show all commits

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',
screenshotFailures: true
},
setupFiles: ['./src/test-setup.ts'],
include: ['src/**/*.svelte.{test,spec}.{js,ts}'],
exclude: ['src/lib/server/**']
}

View File

@@ -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: {