// @vitest-environment happy-dom import React, { act } from "react"; import { createRoot, type Root } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { VideoThumbnail } from "./VideoThumbnail"; Object.defineProperty(globalThis, "IS_REACT_ACT_ENVIRONMENT", { configurable: true, value: true, }); // Fire "intersecting" immediately on observe so the extraction effect runs. class MockIntersectionObserver { private cb: IntersectionObserverCallback; constructor(cb: IntersectionObserverCallback) { this.cb = cb; } observe() { this.cb( [{ isIntersecting: true } as IntersectionObserverEntry], this as unknown as IntersectionObserver, ); } disconnect() {} unobserve() {} takeRecords(): IntersectionObserverEntry[] { return []; } } class MockResizeObserver { observe() {} disconnect() {} unobserve() {} } const originalIO = globalThis.IntersectionObserver; const originalRO = globalThis.ResizeObserver; let host: HTMLDivElement; let root: Root | null = null; let createdVideos: HTMLVideoElement[]; beforeEach(() => { globalThis.IntersectionObserver = MockIntersectionObserver as unknown as typeof IntersectionObserver; globalThis.ResizeObserver = MockResizeObserver as unknown as typeof ResizeObserver; createdVideos = []; const origCreate = document.createElement.bind(document); vi.spyOn(document, "createElement").mockImplementation((tag: string) => { const el = origCreate(tag); if (tag === "video") createdVideos.push(el as HTMLVideoElement); return el; }); // happy-dom's