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();
});