// Vitest setup file — runs once per test file, before any test. // // Two responsibilities: // // 1. Register @testing-library/jest-dom's custom matchers so tests // can use `expect(node).toBeInTheDocument()`, `toHaveTextContent()`, // `toHaveAttribute()`, etc. Without this import, those matchers // throw "expected jest-dom matcher" at assertion time. // // 2. Run RTL's `cleanup()` after every test. RTL renders into a // shared DOM container; without explicit cleanup, components // from one test stick around for the next, producing // false-positive "found multiple instances" errors and // memory-grow bugs in long suites. Vitest with `globals: true` // exposes `afterEach` so the import below works without // naming it on the import side. // // What's NOT here (intentionally) // ───────────────────────────────── // • localStorage clearing. jsdom gives each test file a fresh // localStorage, and our tests that touch localStorage (history // debug flag) explicitly set+clear their own keys per test. // A blanket `localStorage.clear()` in afterEach would mask // setup bugs in tests that depend on a clean key. // // • Konva mocking. We don't yet have tests that mount React-Konva // components — those will need Stage/Layer stubs and will live // in a follow-up batch once we know the test setup story for // canvas-dependent code. For pure utility and hook tests // covered in this initial batch, Konva isn't loaded. // // • Timer mocking globals. Individual tests that need // `vi.useFakeTimers()` (debounce tests for updateElement, the // auto-dismiss toast timer, etc.) call it themselves and pair // with `vi.useRealTimers()` in their own afterEach. Keeping // it test-local rather than global makes the timing intent // visible at the test site. import '@testing-library/jest-dom/vitest'; import { afterEach } from 'vitest'; import { cleanup } from '@testing-library/react'; afterEach(() => { cleanup(); });