// ============================================================ // Test setup: globals, jsdom polyfills, localStorage mock // ============================================================ import { beforeAll, beforeEach, vi } from 'vitest' import '@testing-library/jest-dom/vitest' // ── localStorage mock (jsdom provides one but we ensure clean state) ────── beforeEach(() => { localStorage.clear() }) // ── Ant Design / rc-util requires 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(), })), }) // Ant Design's scrollTo polyfill window.scrollTo = vi.fn() // React 19 + jsdom: ensure getComputedStyle returns something useful const originalGetComputedStyle = window.getComputedStyle window.getComputedStyle = (elt: Element, pseudoElt?: string | null) => { try { return originalGetComputedStyle(elt, pseudoElt) } catch { return {} as CSSStyleDeclaration } } // Ant Design ProTable / rc-virtual-list require ResizeObserver global.ResizeObserver = class ResizeObserver { observe() {} unobserve() {} disconnect() {} } })