fix(test): load shared mocks via vi.hoisted, not a static import

CI caught that vi.mock('$app/forms', () => ({ ...formsMock })) with a
static `import * as formsMock` fails: vitest hoists vi.mock above the
import, so the factory references an uninitialised binding
("no top level variables inside"). Load the shared mock module via
`const formsMock = await vi.hoisted(() => import('$mocks/...'))` instead —
the factory may reference a vi.hoisted binding, and the dynamic import runs
at collection time (not in the lazily-invoked factory), so it stays clear
of ADR-012's birpc race and the no-async-mock-factories guard. Applies to
all 5 shared-mock consumers ($app/forms x4, $app/navigation x1). Part of #560.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-06-03 07:52:37 +02:00
committed by marcel
parent ad067d2e0e
commit 25b23843c9
5 changed files with 6 additions and 5 deletions

View File

@@ -4,7 +4,7 @@ import { page, userEvent } from 'vitest/browser';
import ChronikFuerDichBox from './ChronikFuerDichBox.svelte'; import ChronikFuerDichBox from './ChronikFuerDichBox.svelte';
import type { NotificationItem } from '$lib/notification/notifications.svelte'; import type { NotificationItem } from '$lib/notification/notifications.svelte';
import * as formsMock from '$mocks/$app/forms'; const formsMock = await vi.hoisted(() => import('$mocks/$app/forms'));
vi.mock('$app/forms', () => ({ ...formsMock })); vi.mock('$app/forms', () => ({ ...formsMock }));

View File

@@ -3,7 +3,7 @@ import { cleanup, render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser'; import { page } from 'vitest/browser';
import ChronikFuerDichBox from './ChronikFuerDichBox.svelte'; import ChronikFuerDichBox from './ChronikFuerDichBox.svelte';
import type { NotificationItem } from '$lib/notification/notifications'; import type { NotificationItem } from '$lib/notification/notifications';
import * as formsMock from '$mocks/$app/forms'; const formsMock = await vi.hoisted(() => import('$mocks/$app/forms'));
vi.mock('$app/forms', () => ({ ...formsMock })); vi.mock('$app/forms', () => ({ ...formsMock }));

View File

@@ -2,9 +2,10 @@ import { afterEach, beforeEach, describe, it, expect, vi } from 'vitest';
import { cleanup, render } from 'vitest-browser-svelte'; import { cleanup, render } from 'vitest-browser-svelte';
import { m } from '$lib/paraglide/messages.js'; import { m } from '$lib/paraglide/messages.js';
import type { NotificationItem } from '$lib/notification/notifications'; import type { NotificationItem } from '$lib/notification/notifications';
import * as formsMock from '$mocks/$app/forms';
import NotificationFixture from './notification.test-fixture.svelte'; import NotificationFixture from './notification.test-fixture.svelte';
const formsMock = await vi.hoisted(() => import('$mocks/$app/forms'));
vi.mock('$app/navigation', () => ({ goto: vi.fn(), beforeNavigate: vi.fn() })); vi.mock('$app/navigation', () => ({ goto: vi.fn(), beforeNavigate: vi.fn() }));
vi.mock('$app/forms', () => ({ ...formsMock })); vi.mock('$app/forms', () => ({ ...formsMock }));

View File

@@ -3,7 +3,7 @@ import { cleanup, render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser'; import { page } from 'vitest/browser';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import NotificationDropdown from './NotificationDropdown.svelte'; import NotificationDropdown from './NotificationDropdown.svelte';
import * as formsMock from '$mocks/$app/forms'; const formsMock = await vi.hoisted(() => import('$mocks/$app/forms'));
vi.mock('$app/navigation', () => ({ goto: vi.fn() })); vi.mock('$app/navigation', () => ({ goto: vi.fn() }));

View File

@@ -1,5 +1,5 @@
import { describe, it, expect, vi } from 'vitest'; import { describe, it, expect, vi } from 'vitest';
import * as navMock from '$mocks/$app/navigation'; const navMock = await vi.hoisted(() => import('$mocks/$app/navigation'));
vi.mock('$app/navigation', () => ({ ...navMock })); vi.mock('$app/navigation', () => ({ ...navMock }));