Odoo18-Base/addons/web/static/lib/hoot/tests/hoot-dom/time.test.js
2025-01-06 10:57:38 +07:00

136 lines
3.6 KiB
JavaScript

/** @odoo-module */
import { describe, expect, test } from "@odoo/hoot";
import { animationFrame, delay, microTick, waitUntil } from "@odoo/hoot-dom";
import { Deferred, advanceTime, runAllTimers, tick } from "@odoo/hoot-mock";
import { parseUrl } from "../local_helpers";
// timeout of 1 second to ensure all timeouts are actually mocked
describe.timeout(1_000)(parseUrl(import.meta.url), () => {
test("advanceTime", async () => {
expect.assertions(8);
await advanceTime(5_000);
const timeoutId = window.setTimeout(() => expect.step("timeout"), 2_000);
const intervalId = window.setInterval(() => expect.step("interval"), 3_000);
const animationHandle = window.requestAnimationFrame((delta) => {
expect(delta).toBeGreaterThan(5_000);
expect.step("animation");
});
expect(timeoutId).toBeGreaterThan(0);
expect(intervalId).toBeGreaterThan(0);
expect(animationHandle).toBeGreaterThan(0);
expect.verifySteps([]);
await advanceTime(10_000); // 10 seconds
expect.verifySteps(["animation", "timeout", "interval", "interval", "interval"]);
await advanceTime(10_000);
expect.verifySteps(["interval", "interval", "interval"]);
window.clearInterval(intervalId);
await advanceTime(10_000);
expect.verifySteps([]);
});
test("Deferred", async () => {
const def = new Deferred();
def.then(() => expect.step("resolved"));
expect.step("before");
def.resolve(14);
expect.step("after");
await expect(def).resolves.toBe(14);
expect.verifySteps(["before", "after", "resolved"]);
});
test("tick", async () => {
let count = 0;
const nextTickPromise = tick().then(() => ++count);
expect(count).toBe(0);
await expect(nextTickPromise).resolves.toBe(1);
expect(count).toBe(1);
});
test("runAllTimers", async () => {
expect.assertions(4);
window.setTimeout(() => expect.step("timeout"), 1e6);
window.requestAnimationFrame((delta) => {
expect(delta).toBeGreaterThan(1);
expect.step("animation");
});
expect.verifySteps([]);
const ms = await runAllTimers();
expect(ms).toBeWithin(1e6 - 1, 1e6); // more or less
expect.verifySteps(["animation", "timeout"]);
});
test("waitUntil: already true", async () => {
const promise = waitUntil(() => "some value").then((value) => {
expect.step("resolved");
return value;
});
expect.verifySteps([]);
expect(promise).toBeInstanceOf(Promise);
await microTick();
expect.verifySteps(["resolved"]);
await expect(promise).resolves.toBe("some value");
});
test("waitUntil: rejects", async () => {
const promise = waitUntil(() => false, { timeout: 1 }).catch(() => expect.step("rejected"));
expect.verifySteps([]);
expect(promise).toBeInstanceOf(Promise);
await delay(1);
expect.verifySteps([]);
await animationFrame();
expect.verifySteps(["rejected"]);
});
test("waitUntil: lazy", async () => {
let returnValue = "";
const promise = waitUntil(() => returnValue).then((v) => expect.step(v));
expect.verifySteps([]);
expect(promise).toBeInstanceOf(Promise);
await animationFrame();
await animationFrame();
expect.verifySteps([]);
returnValue = "test";
await animationFrame();
expect.verifySteps(["test"]);
});
});