Files
pleno-vue/tests/unit/setup.js
T

113 lines
2.1 KiB
JavaScript

import { afterEach, beforeEach, vi } from "vitest";
import { enableAutoUnmount } from "@vue/test-utils";
enableAutoUnmount(afterEach);
class TestResizeObserver {
observe() {}
unobserve() {}
disconnect() {}
}
class TestIntersectionObserver {
observe() {}
unobserve() {}
disconnect() {}
takeRecords() {
return [];
}
}
function createMatchMedia(query) {
return {
matches: false,
media: query,
onchange: null,
addListener() {},
removeListener() {},
addEventListener() {},
removeEventListener() {},
dispatchEvent() {
return false;
},
};
}
function ensureBrowserMocks() {
if (!globalThis.ResizeObserver) {
globalThis.ResizeObserver = TestResizeObserver;
}
if (!globalThis.IntersectionObserver) {
globalThis.IntersectionObserver = TestIntersectionObserver;
}
if (globalThis.window) {
if (!window.matchMedia) {
Object.defineProperty(window, "matchMedia", {
configurable: true,
writable: true,
value: createMatchMedia,
});
}
if (!window.scrollTo) {
Object.defineProperty(window, "scrollTo", {
configurable: true,
writable: true,
value() {},
});
}
}
if (globalThis.URL) {
if (!URL.createObjectURL) {
Object.defineProperty(URL, "createObjectURL", {
configurable: true,
writable: true,
value: vi.fn(() => "blob:vitest-object-url"),
});
}
if (!URL.revokeObjectURL) {
Object.defineProperty(URL, "revokeObjectURL", {
configurable: true,
writable: true,
value: vi.fn(),
});
}
}
}
function clearStorage(storage) {
try {
storage?.clear();
} catch {
// Some jsdom URL modes can make storage unavailable.
}
}
beforeEach(() => {
ensureBrowserMocks();
});
afterEach(async () => {
await Promise.resolve();
await Promise.resolve();
vi.useRealTimers();
vi.clearAllMocks();
vi.unstubAllGlobals();
if (globalThis.document?.body) {
document.body.innerHTML = "";
}
if (globalThis.window) {
clearStorage(window.localStorage);
clearStorage(window.sessionStorage);
}
ensureBrowserMocks();
});