From 25b23843c97c9aec6c588527a187b8dfac7021be Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 3 Jun 2026 07:52:37 +0200 Subject: [PATCH] fix(test): load shared mocks via vi.hoisted, not a static import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- frontend/src/lib/activity/ChronikFuerDichBox.svelte.spec.ts | 2 +- frontend/src/lib/activity/ChronikFuerDichBox.svelte.test.ts | 2 +- frontend/src/lib/notification/NotificationBell.svelte.spec.ts | 3 ++- .../src/lib/notification/NotificationDropdown.svelte.test.ts | 2 +- frontend/src/lib/shared/hooks/useUnsavedWarning.svelte.test.ts | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/activity/ChronikFuerDichBox.svelte.spec.ts b/frontend/src/lib/activity/ChronikFuerDichBox.svelte.spec.ts index 41f1f277..c5c26cf7 100644 --- a/frontend/src/lib/activity/ChronikFuerDichBox.svelte.spec.ts +++ b/frontend/src/lib/activity/ChronikFuerDichBox.svelte.spec.ts @@ -4,7 +4,7 @@ import { page, userEvent } from 'vitest/browser'; import ChronikFuerDichBox from './ChronikFuerDichBox.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 })); diff --git a/frontend/src/lib/activity/ChronikFuerDichBox.svelte.test.ts b/frontend/src/lib/activity/ChronikFuerDichBox.svelte.test.ts index 022f598c..f9386848 100644 --- a/frontend/src/lib/activity/ChronikFuerDichBox.svelte.test.ts +++ b/frontend/src/lib/activity/ChronikFuerDichBox.svelte.test.ts @@ -3,7 +3,7 @@ import { cleanup, render } from 'vitest-browser-svelte'; import { page } from 'vitest/browser'; import ChronikFuerDichBox from './ChronikFuerDichBox.svelte'; 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 })); diff --git a/frontend/src/lib/notification/NotificationBell.svelte.spec.ts b/frontend/src/lib/notification/NotificationBell.svelte.spec.ts index 256ee342..d325bb58 100644 --- a/frontend/src/lib/notification/NotificationBell.svelte.spec.ts +++ b/frontend/src/lib/notification/NotificationBell.svelte.spec.ts @@ -2,9 +2,10 @@ import { afterEach, beforeEach, describe, it, expect, vi } from 'vitest'; import { cleanup, render } from 'vitest-browser-svelte'; import { m } from '$lib/paraglide/messages.js'; import type { NotificationItem } from '$lib/notification/notifications'; -import * as formsMock from '$mocks/$app/forms'; 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/forms', () => ({ ...formsMock })); diff --git a/frontend/src/lib/notification/NotificationDropdown.svelte.test.ts b/frontend/src/lib/notification/NotificationDropdown.svelte.test.ts index 7c302562..0ca8e79b 100644 --- a/frontend/src/lib/notification/NotificationDropdown.svelte.test.ts +++ b/frontend/src/lib/notification/NotificationDropdown.svelte.test.ts @@ -3,7 +3,7 @@ import { cleanup, render } from 'vitest-browser-svelte'; import { page } from 'vitest/browser'; import { goto } from '$app/navigation'; 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() })); diff --git a/frontend/src/lib/shared/hooks/useUnsavedWarning.svelte.test.ts b/frontend/src/lib/shared/hooks/useUnsavedWarning.svelte.test.ts index 48cc1f08..2926d6e3 100644 --- a/frontend/src/lib/shared/hooks/useUnsavedWarning.svelte.test.ts +++ b/frontend/src/lib/shared/hooks/useUnsavedWarning.svelte.test.ts @@ -1,5 +1,5 @@ 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 }));