Ctrl K
ComunidadGuías…

test/scripts/screenshots-capture-clock.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { expect } from "@std/expect";
import { afterEach, describe, it as test } from "@std/testing/bdd";
import { installLayerCaptureClock } from "#scripts/screenshots/capture.ts";
import { createGlobalStash } from "#test-utils/happy-dom.ts";

const globals = createGlobalStash();

describe("installLayerCaptureClock", () => {
  afterEach(() => globals.restore());

  test("holds page callbacks while layer captures are frozen", async () => {
    let intervalCallback: unknown;
    let timeoutCallback: unknown;
    let frameCallback: unknown;
    const nativeCalls: unknown[][] = [];
    globals.set("setInterval", (callback: unknown, ...args: unknown[]) => {
      intervalCallback = callback;
      nativeCalls.push(["interval", ...args]);
      return 1;
    });
    globals.set("setTimeout", (callback: unknown, ...args: unknown[]) => {
      timeoutCallback = callback;
      nativeCalls.push(["timeout", callback, ...args]);
      return 2;
    });
    globals.set("requestAnimationFrame", (callback: unknown) => {
      frameCallback = callback;
      return 3;
    });
    let installs = 0;
    const page = {
      addInitScript: (script: () => void) => {
        script();
        return Promise.resolve();
      },
      clock: {
        install: () => {
          installs += 1;
          return Promise.resolve();
        },
      },
    } as never;

    await installLayerCaptureClock(page);
    expect(installs).toBe(1);

    const intervalRuns: unknown[] = [];
    setInterval((value) => intervalRuns.push(value), 10, "ready");
    if (typeof intervalCallback !== "function") {
      throw new Error("Interval callback was not installed.");
    }
    Reflect.apply(intervalCallback, globalThis, ["ready"]);
    expect(intervalRuns).toEqual(["ready"]);

    Reflect.apply(Reflect.get(globalThis, "setTimeout"), globalThis, [
      "literal callback",
      5,
    ]);
    expect(nativeCalls.at(-1)).toEqual(["timeout", "literal callback", 5]);

    const setFrozen = Reflect.get(globalThis, "__setLayerCaptureFrozen");
    if (typeof setFrozen !== "function") {
      throw new Error("Layer capture controls were not installed.");
    }
    Reflect.apply(setFrozen, globalThis, [true]);

    let timeoutRuns = 0;
    setTimeout(() => {
      timeoutRuns += 1;
    }, 20);
    if (typeof timeoutCallback !== "function") {
      throw new Error("Timeout callback was not installed.");
    }
    Reflect.apply(timeoutCallback, globalThis, []);
    Reflect.apply(intervalCallback, globalThis, ["frozen"]);

    let frameTime = 0;
    requestAnimationFrame((time) => {
      frameTime = time;
    });
    if (typeof frameCallback !== "function") {
      throw new Error("Animation frame callback was not installed.");
    }
    Reflect.apply(frameCallback, globalThis, [25]);
    expect(intervalRuns).toEqual(["ready"]);
    expect(timeoutRuns).toBe(0);
    expect(frameTime).toBe(0);

    Reflect.apply(setFrozen, globalThis, [false]);
    await Promise.resolve();
    expect(timeoutRuns).toBe(1);

    requestAnimationFrame((time) => {
      frameTime = time;
    });
    if (typeof frameCallback !== "function") {
      throw new Error("Animation frame callback was not installed.");
    }
    Reflect.apply(frameCallback, globalThis, [50]);
    expect(frameTime).toBe(50);
  });

  test("fails when the browser has no animation frame method", async () => {
    globals.set("requestAnimationFrame", undefined);
    const page = {
      addInitScript: (script: () => void) => Promise.resolve(script()),
      clock: { install: () => Promise.resolve() },
    } as never;

    await expect(installLayerCaptureClock(page)).rejects.toThrow(
      "Missing browser method: requestAnimationFrame",
    );
  });
});