101 lines
2.4 KiB
TypeScript
101 lines
2.4 KiB
TypeScript
/**
|
|
* Vitest Setup File
|
|
*
|
|
* Global test setup including:
|
|
* - DOM testing utilities
|
|
* - Mock localStorage
|
|
* - React testing environment
|
|
*/
|
|
|
|
import '@testing-library/jest-dom/vitest';
|
|
import * as React from 'react';
|
|
|
|
import { cleanup } from '@testing-library/react';
|
|
import { afterEach, beforeAll, beforeEach, vi } from 'vitest';
|
|
|
|
// Ensure React is available globally for jsdom
|
|
beforeAll(() => {
|
|
globalThis.React = React;
|
|
});
|
|
|
|
// Cleanup after each test
|
|
afterEach(() => {
|
|
cleanup();
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
// Mock localStorage
|
|
const createLocalStorageMock = () => {
|
|
const store: Record<string, string> = {};
|
|
return {
|
|
getItem: vi.fn((key: string) => store[key] || null),
|
|
setItem: vi.fn((key: string, value: string) => {
|
|
store[key] = value;
|
|
}),
|
|
removeItem: vi.fn((key: string) => {
|
|
delete store[key];
|
|
}),
|
|
clear: vi.fn(() => {
|
|
Object.keys(store).forEach((key) => delete store[key]);
|
|
}),
|
|
key: vi.fn((index: number) => Object.keys(store)[index] || null),
|
|
get length() {
|
|
return Object.keys(store).length;
|
|
},
|
|
};
|
|
};
|
|
|
|
beforeAll(() => {
|
|
const localStorageMock = createLocalStorageMock();
|
|
Object.defineProperty(window, 'localStorage', {
|
|
value: localStorageMock,
|
|
writable: true,
|
|
});
|
|
});
|
|
|
|
// Reset localStorage mock before each test
|
|
beforeEach(() => {
|
|
vi.mocked(localStorage.getItem).mockClear();
|
|
vi.mocked(localStorage.setItem).mockClear();
|
|
vi.mocked(localStorage.removeItem).mockClear();
|
|
vi.mocked(localStorage.clear).mockClear();
|
|
});
|
|
|
|
// Mock ResizeObserver
|
|
beforeAll(() => {
|
|
global.ResizeObserver = vi.fn().mockImplementation(() => ({
|
|
observe: vi.fn(),
|
|
unobserve: vi.fn(),
|
|
disconnect: vi.fn(),
|
|
}));
|
|
});
|
|
|
|
// Mock matchMedia
|
|
beforeAll(() => {
|
|
Object.defineProperty(window, 'matchMedia', {
|
|
writable: true,
|
|
value: vi.fn().mockImplementation((query: string) => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: vi.fn(),
|
|
removeListener: vi.fn(),
|
|
addEventListener: vi.fn(),
|
|
removeEventListener: vi.fn(),
|
|
dispatchEvent: vi.fn(),
|
|
})),
|
|
});
|
|
});
|
|
|
|
// Mock IntersectionObserver
|
|
beforeAll(() => {
|
|
global.IntersectionObserver = vi.fn().mockImplementation(() => ({
|
|
observe: vi.fn(),
|
|
unobserve: vi.fn(),
|
|
disconnect: vi.fn(),
|
|
root: null,
|
|
rootMargin: '',
|
|
thresholds: [],
|
|
takeRecords: vi.fn().mockReturnValue([]),
|
|
}));
|
|
});
|