import { act, render, waitFor } from "@testing-library/react"; import { OfferVideo } from "./OfferVideo"; /** * O vídeo da peça 3D toca quando aparece (o IntersectionObserver do jest.setup avisa logo depois de observar) e fica * parado no pôster com movimento reduzido ou "Economizar dados". */ const realMatchMedia = window.matchMedia; let play: jest.SpyInstance; let pause: jest.SpyInstance; beforeEach(() => { play = jest .spyOn(HTMLMediaElement.prototype, "play") .mockResolvedValue(undefined); pause = jest .spyOn(HTMLMediaElement.prototype, "pause") .mockImplementation(() => {}); }); afterEach(() => { jest.useRealTimers(); jest.restoreAllMocks(); window.matchMedia = realMatchMedia; Reflect.deleteProperty(navigator, "connection"); }); it("path: in view -> plays, muted and in a loop", async () => { const { container } = render(); await waitFor(() => expect(play).toHaveBeenCalled()); const video = container.querySelector("video") as HTMLVideoElement; expect(video.muted).toBe(true); expect(video.loop).toBe(true); }); it("path: reduced motion -> never plays, stays on the poster", () => { jest.useFakeTimers(); window.matchMedia = jest.fn().mockImplementation((query: string) => ({ matches: query === "(prefers-reduced-motion: reduce)", media: query, addEventListener: jest.fn(), removeEventListener: jest.fn(), })); const { container } = render(); // o aviso de "à vista" do IntersectionObserver chega num setTimeout act(() => jest.runAllTimers()); expect(pause).toHaveBeenCalled(); expect(play).not.toHaveBeenCalled(); expect(container.querySelector("video")).toHaveAttribute( "poster", "/3d/peca-sistema.webp", ); }); it("path: save data -> never plays", () => { jest.useFakeTimers(); Object.defineProperty(navigator, "connection", { configurable: true, value: { saveData: true }, }); render(); act(() => jest.runAllTimers()); expect(pause).toHaveBeenCalled(); expect(play).not.toHaveBeenCalled(); });