// frontend/tests/setup.ts — vitest 전역 setup import "@testing-library/jest-dom/vitest"; import { expect, vi } from "vitest"; import { toHaveNoViolations } from "vitest-axe/dist/matchers"; expect.extend({ toHaveNoViolations }); // next/navigation 전역 목 — 라우팅 의존 컴포넌트(Mail/Tasks/Calendar Client)가 // useParams/useRouter 를 쓰므로, 라우터 컨텍스트 없는 단위 렌더에서도 동작하게 한다. vi.mock("next/navigation", () => ({ useRouter: () => ({ push: vi.fn(), replace: vi.fn(), prefetch: vi.fn(), back: vi.fn(), forward: vi.fn(), refresh: vi.fn(), }), useParams: () => ({}), usePathname: () => "/", useSearchParams: () => new URLSearchParams(), })); // jsdom 미구현 API 폴리필 (ResizeObserver — 여정 베지어 보드가 사용) if (!("ResizeObserver" in globalThis)) { (globalThis as unknown as { ResizeObserver: unknown }).ResizeObserver = class { observe() {} unobserve() {} disconnect() {} }; } // jsdom 미구현 API 폴리필 (next-themes 가 window.matchMedia 사용) if (!window.matchMedia) { window.matchMedia = vi.fn().mockImplementation((query: string) => ({ matches: false, media: query, onchange: null, addListener: vi.fn(), // deprecated removeListener: vi.fn(), // deprecated addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })); }