58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import '@testing-library/jest-dom';
|
|
import { vi } from 'vitest';
|
|
|
|
// Node.js 22 has a built-in `localStorage` that lacks standard Web Storage API
|
|
// methods (getItem, setItem, etc.) unless `--localstorage-file` is provided.
|
|
// This conflicts with jsdom's proper localStorage, so we override the global.
|
|
const localStorageMap = new Map<string, string>();
|
|
const localStorageMock: Storage = {
|
|
getItem: (key: string) => localStorageMap.get(key) ?? null,
|
|
setItem: (key: string, value: string) => { localStorageMap.set(key, value); },
|
|
removeItem: (key: string) => { localStorageMap.delete(key); },
|
|
clear: () => { localStorageMap.clear(); },
|
|
get length() { return localStorageMap.size; },
|
|
key: (index: number) => [...localStorageMap.keys()][index] ?? null,
|
|
};
|
|
Object.defineProperty(globalThis, 'localStorage', {
|
|
value: localStorageMock,
|
|
writable: true,
|
|
configurable: true,
|
|
});
|
|
|
|
// Mock window.matchMedia
|
|
Object.defineProperty(window, 'matchMedia', {
|
|
writable: true,
|
|
value: vi.fn().mockImplementation((query) => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: vi.fn(), // deprecated
|
|
removeListener: vi.fn(), // deprecated
|
|
addEventListener: vi.fn(),
|
|
removeEventListener: vi.fn(),
|
|
dispatchEvent: vi.fn(),
|
|
})),
|
|
});
|
|
|
|
// Mock window.scrollTo
|
|
Object.defineProperty(window, 'scrollTo', {
|
|
writable: true,
|
|
value: vi.fn(),
|
|
});
|
|
|
|
// Mock IntersectionObserver
|
|
global.IntersectionObserver = vi.fn().mockImplementation((_callback) => ({
|
|
observe: vi.fn(),
|
|
unobserve: vi.fn(),
|
|
disconnect: vi.fn(),
|
|
root: null,
|
|
rootMargin: '',
|
|
thresholds: [],
|
|
}));
|
|
|
|
// Mock ResizeObserver
|
|
global.ResizeObserver = vi.fn().mockImplementation((_callback) => ({
|
|
observe: vi.fn(),
|
|
unobserve: vi.fn(),
|
|
disconnect: vi.fn(),
|
|
})); |