Files
MorphDoc/packages/preview-engine/tests/image-ready.test.ts
T

61 lines
1.7 KiB
TypeScript

// @vitest-environment happy-dom
import { describe, expect, it, vi } from "vitest";
import { waitForImages } from "../src/index.js";
function createPendingImage() {
const image = document.createElement("img");
Object.defineProperty(image, "complete", {
configurable: true,
get: () => false
});
return image;
}
describe("文档图片就绪等待", () => {
it("图片正常加载后立即完成", async () => {
const image = createPendingImage();
image.decode = vi.fn(() => new Promise(() => undefined));
document.body.replaceChildren(image);
const waiting = waitForImages(document, 1_000);
image.dispatchEvent(new Event("load"));
await expect(waiting).resolves.toEqual([undefined]);
});
it("decode 拒绝且图片已经失败时不会错过 error 状态", async () => {
let complete = false;
const image = document.createElement("img");
Object.defineProperty(image, "complete", {
configurable: true,
get: () => complete
});
image.decode = vi.fn(async () => {
complete = true;
throw new Error("decode failed");
});
document.body.replaceChildren(image);
await expect(waitForImages(document, 1_000)).resolves.toEqual([
undefined
]);
});
it("图片永不响应时由局部超时结束等待", async () => {
vi.useFakeTimers();
try {
const image = createPendingImage();
image.decode = vi.fn(() => new Promise(() => undefined));
document.body.replaceChildren(image);
const waiting = waitForImages(document, 25);
await vi.advanceTimersByTimeAsync(25);
await expect(waiting).resolves.toEqual([undefined]);
} finally {
vi.useRealTimers();
}
});
});