diff --git a/src/test/setup.ts b/src/test/setup.ts index 97877956..f2b26ff5 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -1,11 +1,44 @@ import "@testing-library/jest-dom/vitest"; import { cleanup } from "@testing-library/react"; -import { afterEach } from "vitest"; +import { afterEach, vi } from "vitest"; afterEach(() => { cleanup(); }); +function localStorageIsUsable(): boolean { + try { + const probe = "__vitest_ls_probe__"; + globalThis.localStorage.setItem(probe, "1"); + const ok = globalThis.localStorage.getItem(probe) === "1"; + globalThis.localStorage.removeItem(probe); + return ok; + } catch { + return false; + } +} + +// Node 25+ / some harnesses lack a stable localStorage — provide an in-memory mock when needed. +if (!localStorageIsUsable()) { + const store = new Map(); + vi.stubGlobal("localStorage", { + getItem: (key: string) => store.get(key) ?? null, + setItem: (key: string, value: string) => { + store.set(key, String(value)); + }, + removeItem: (key: string) => { + store.delete(key); + }, + clear: () => { + store.clear(); + }, + get length() { + return store.size; + }, + key: (index: number) => [...store.keys()][index] ?? null, + }); +} + Object.defineProperty(window, "matchMedia", { writable: true, value: (query: string) => ({