From aea37250f4e7602e5ca8d8cc8c113a5c666d7f31 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 21 May 2026 18:19:45 +0200 Subject: [PATCH] test(mocks): wire DocumentRow spec to shared __mocks__/$app/navigation Smallest possible first step of issue #560. Adds a shared __mocks__/$app/navigation.ts exporting every nav function as vi.fn(), and switches one consumer (DocumentRow.svelte.spec.ts) from a per-spec factory to vi.mock('\$app/navigation') (no factory) to verify Vitest's __mocks__/ redirect resolves for SvelteKit virtual modules in browser-mode tests. CI is the gate: if the migrated spec passes alongside the 35 unchanged factory call sites, the same redirect pattern is applied across the remaining $app/navigation, $app/state, $app/forms and paraglide factories. Per ADR-012, eliminating factory mocks shrinks the birpc teardown-race surface; this commit is the first concrete cut. Refs #560. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/__mocks__/$app/navigation.ts | 20 +++++++++++++++++++ .../lib/document/DocumentRow.svelte.spec.ts | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 frontend/src/__mocks__/$app/navigation.ts diff --git a/frontend/src/__mocks__/$app/navigation.ts b/frontend/src/__mocks__/$app/navigation.ts new file mode 100644 index 00000000..53a07bf4 --- /dev/null +++ b/frontend/src/__mocks__/$app/navigation.ts @@ -0,0 +1,20 @@ +// Shared mock for SvelteKit's $app/navigation virtual module. +// Activated by calling `vi.mock('$app/navigation')` (no factory) in a spec. +// Per ADR-012: eliminating per-spec factory bodies removes 36 birpc-race surface +// points; the unified mock keeps every nav export available as a vi.fn(). +// +// IMPORTANT: consuming specs MUST call `vi.clearAllMocks()` (or per-mock +// `mockClear()`) in `afterEach` — otherwise call counts leak between tests. +import { vi } from 'vitest'; + +export const goto = vi.fn(async () => {}); +export const invalidate = vi.fn(async () => {}); +export const invalidateAll = vi.fn(async () => {}); +export const beforeNavigate = vi.fn(); +export const afterNavigate = vi.fn(); +export const preloadCode = vi.fn(async () => {}); +export const preloadData = vi.fn(async () => {}); +export const pushState = vi.fn(); +export const replaceState = vi.fn(); +export const disableScrollHandling = vi.fn(); +export const onNavigate = vi.fn(() => () => {}); diff --git a/frontend/src/lib/document/DocumentRow.svelte.spec.ts b/frontend/src/lib/document/DocumentRow.svelte.spec.ts index 19b3c66a..03bbe84d 100644 --- a/frontend/src/lib/document/DocumentRow.svelte.spec.ts +++ b/frontend/src/lib/document/DocumentRow.svelte.spec.ts @@ -6,7 +6,7 @@ import DocumentRow from './DocumentRow.svelte'; import { bulkSelectionStore } from '$lib/document/bulkSelection.svelte'; import type { components } from '$lib/generated/api'; -vi.mock('$app/navigation', () => ({ goto: vi.fn() })); +vi.mock('$app/navigation'); afterEach(() => { cleanup();