diff --git a/frontend/src/lib/document/EnrichmentBlock.svelte b/frontend/src/lib/document/EnrichmentBlock.svelte
index a4327cf3..77a9e96a 100644
--- a/frontend/src/lib/document/EnrichmentBlock.svelte
+++ b/frontend/src/lib/document/EnrichmentBlock.svelte
@@ -1,5 +1,5 @@
diff --git a/frontend/src/lib/document/EnrichmentBlock.svelte.spec.ts b/frontend/src/lib/document/EnrichmentBlock.svelte.spec.ts
index ac5167d1..35039cb2 100644
--- a/frontend/src/lib/document/EnrichmentBlock.svelte.spec.ts
+++ b/frontend/src/lib/document/EnrichmentBlock.svelte.spec.ts
@@ -2,19 +2,23 @@ import { describe, it, expect, afterEach, vi } from 'vitest';
import { cleanup, render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
-// The store must live in a separate module because vi.mock factories are
-// hoisted and cannot reference top-level variables defined in this file.
-import { navigatingStore } from './__mocks__/navigatingStore';
import EnrichmentBlock from './EnrichmentBlock.svelte';
-vi.mock('$app/stores', async () => {
- const mod = await import('./__mocks__/navigatingStore');
- return { navigating: mod.navigatingStore };
-});
+// Hoist the mutable navigation reference so vi.mock's factory (also hoisted)
+// can read it via a getter. Sync factory, no dynamic import: ADR-012 invariant.
+const { mockNavigating } = vi.hoisted(() => ({
+ mockNavigating: { type: null as string | null }
+}));
+
+vi.mock('$app/state', () => ({
+ get navigating() {
+ return mockNavigating;
+ }
+}));
afterEach(() => {
cleanup();
- navigatingStore.set(null);
+ mockNavigating.type = null;
});
type Doc = { id: string; title: string; uploadedAt: string };
@@ -65,8 +69,8 @@ describe('EnrichmentBlock', () => {
await expect.element(page.getByTestId('dashboard-needs-metadata')).toBeInTheDocument();
});
- it('renders the skeleton when $navigating is active and topDocs is empty', async () => {
- navigatingStore.set({ type: 'link' });
+ it('renders the skeleton when navigation is active and topDocs is empty', async () => {
+ mockNavigating.type = 'link';
render(EnrichmentBlock, {
topDocs: [],
totalCount: 0,
@@ -76,8 +80,8 @@ describe('EnrichmentBlock', () => {
await expect.element(page.getByTestId('enrichment-block-skeleton')).toBeInTheDocument();
});
- it('does not render the skeleton when topDocs is non-empty even during $navigating', async () => {
- navigatingStore.set({ type: 'link' });
+ it('does not render the skeleton when topDocs is non-empty even during navigation', async () => {
+ mockNavigating.type = 'link';
render(EnrichmentBlock, {
topDocs: [doc('d1')],
totalCount: 1,
diff --git a/frontend/src/lib/document/__mocks__/navigatingStore.ts b/frontend/src/lib/document/__mocks__/navigatingStore.ts
deleted file mode 100644
index 932122e4..00000000
--- a/frontend/src/lib/document/__mocks__/navigatingStore.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { writable } from 'svelte/store';
-
-export const navigatingStore = writable(null);