47 lines
1.8 KiB
TypeScript
47 lines
1.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { createElement } from "react";
|
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
import { readFileSync } from "node:fs";
|
|
import { getSessionMuted, isAutoplayBlocked, setSessionMuted } from "@/lib/autoplay";
|
|
import { VideoPlayer } from "@/components/VideoPlayer";
|
|
|
|
describe("session mute choice", () => {
|
|
it("starts muted and keeps the person's choice", () => {
|
|
expect(getSessionMuted()).toBe(true);
|
|
setSessionMuted(false);
|
|
expect(getSessionMuted()).toBe(false);
|
|
setSessionMuted(true);
|
|
expect(getSessionMuted()).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("autoplay refusal", () => {
|
|
it("only counts the browser's NotAllowedError", () => {
|
|
expect(isAutoplayBlocked({ name: "NotAllowedError" })).toBe(true);
|
|
expect(isAutoplayBlocked({ name: "AbortError" })).toBe(false);
|
|
expect(isAutoplayBlocked(null)).toBe(false);
|
|
expect(isAutoplayBlocked("NotAllowedError")).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("VideoPlayer", () => {
|
|
it("is inline and not muted unless asked (desktop unchanged)", () => {
|
|
const html = renderToStaticMarkup(createElement(VideoPlayer, { mp4Url: "https://cdn/v.mp4", poster: null, label: "v" }));
|
|
expect(html).toContain("playsInline");
|
|
expect(html).toContain("controls");
|
|
expect(html).not.toContain("muted");
|
|
});
|
|
it("renders muted inline video for the mobile autoplay", () => {
|
|
const html = renderToStaticMarkup(createElement(VideoPlayer, { mp4Url: "https://cdn/v.mp4", poster: null, label: "v", controls: false, muted: true }));
|
|
expect(html).toContain("muted");
|
|
expect(html).not.toContain("controls");
|
|
});
|
|
});
|
|
|
|
describe("mobile autoplay styles", () => {
|
|
it("has a frosted mute button", () => {
|
|
const css = readFileSync("src/styles/mobile.css", "utf8");
|
|
expect(css).toMatch(/\.slide-mute \{[^}]*backdrop-filter/);
|
|
});
|
|
});
|