mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-06-22 04:11:55 +10:00
6a01207b6b
Adds ~1000 tests to bring the previously-untested packages and apps under coverage: - packages/utils — string, color, date, file, level, locale, sanitize, field, html, network-icons, rate-limit, url, url-security, monorepo, resume/patch, resume/docx/link-utils, style helpers (~97% on the testable utility files) - packages/ui — 28 component test files plus the use-controlled-state, use-mobile, use-confirm, use-prompt hooks (95% statements) - packages/pdf — shared template helpers (filtering, columns, picture, metrics, section-links, page-size, rich-text-html, section-title) - packages/schema — resumeDataSchema, page, templates, default - packages/fonts — expanded coverage on font helpers - packages/ai — resume sanitize and extraction template - packages/api — resume-access-policy - apps/web — error-message, locale, theme, pwa, dialogs/store, and the resume/move-item / section-actions / make-section-item helpers Adds jsdom polyfills (ResizeObserver, IntersectionObserver, scrollIntoView, matchMedia) and an explicit React Testing Library cleanup hook to vitest.setup.ts so portal- and overlay-based components work without per-test setup.
54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import "@testing-library/jest-dom/vitest";
|
|
import { cleanup } from "@testing-library/react";
|
|
import { afterEach, vi } from "vitest";
|
|
|
|
// React Testing Library auto-cleanup hooks into afterEach as a global, but Vitest
|
|
// only exposes `afterEach` globally when `test.globals: true` is set. We register
|
|
// the cleanup explicitly so component tests do not leak DOM between runs.
|
|
afterEach(() => {
|
|
cleanup();
|
|
});
|
|
|
|
// jsdom polyfills for browser APIs that some libraries (cmdk, base-ui)
|
|
// rely on but jsdom does not implement.
|
|
if (typeof globalThis.ResizeObserver === "undefined") {
|
|
globalThis.ResizeObserver = class ResizeObserver {
|
|
observe() {}
|
|
unobserve() {}
|
|
disconnect() {}
|
|
} as unknown as typeof ResizeObserver;
|
|
}
|
|
|
|
if (typeof globalThis.IntersectionObserver === "undefined") {
|
|
globalThis.IntersectionObserver = class IntersectionObserver {
|
|
root = null;
|
|
rootMargin = "";
|
|
thresholds: ReadonlyArray<number> = [];
|
|
observe() {}
|
|
unobserve() {}
|
|
disconnect() {}
|
|
takeRecords() {
|
|
return [];
|
|
}
|
|
} as unknown as typeof IntersectionObserver;
|
|
}
|
|
|
|
// scrollIntoView is used by cmdk and other libs; jsdom does not implement it.
|
|
if (typeof Element !== "undefined" && !Element.prototype.scrollIntoView) {
|
|
Element.prototype.scrollIntoView = function scrollIntoView() {};
|
|
}
|
|
|
|
// matchMedia is used by next-themes and other UI libs; jsdom does not provide it.
|
|
if (typeof window !== "undefined" && !window.matchMedia) {
|
|
window.matchMedia = vi.fn().mockImplementation((query: string) => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addEventListener: () => {},
|
|
removeEventListener: () => {},
|
|
addListener: () => {},
|
|
removeListener: () => {},
|
|
dispatchEvent: () => false,
|
|
}));
|
|
}
|