Files
EpicNext-Cms/src/lib/services/swf/conversion-pool-recovery.test.ts
T

46 lines
1.5 KiB
TypeScript

// @vitest-environment node
import { EventEmitter } from "node:events";
import { afterEach, describe, expect, it, vi } from "vitest";
const mocks = vi.hoisted(() => ({
convert: vi.fn(() => ({ bundle: Buffer.from("converted") })),
icon: vi.fn(() => Buffer.from("icon")),
}));
vi.mock("./index", () => ({
convertSwfToNitro: mocks.convert,
extractIconFromSwf: mocks.icon,
}));
vi.mock("node:worker_threads", () => ({
Worker: class extends EventEmitter {
postMessage() {
queueMicrotask(() =>
this.emit("error", new Error("worker module missing")),
);
}
},
}));
afterEach(() => {
vi.unstubAllEnvs();
vi.resetModules();
vi.clearAllMocks();
});
describe("conversion worker recovery", () => {
it("falls back when worker startup rejects the conversion job", async () => {
vi.stubEnv("NODE_ENV", "production");
vi.stubEnv("VITEST", undefined);
const { convertSwfToNitroAsync } = await import("./conversion-pool");
const data = Buffer.from("SWF");
const result = await convertSwfToNitroAsync(data, "chair");
expect(result.bundle.toString()).toBe("converted");
expect(mocks.convert).toHaveBeenCalledWith(data, "chair");
});
it("recovers icon extraction from a worker startup error", async () => {
vi.stubEnv("NODE_ENV", "production");
vi.stubEnv("VITEST", undefined);
const { extractIconFromSwfAsync } = await import("./conversion-pool");
expect(
(await extractIconFromSwfAsync(Buffer.from("SWF"), "chair"))?.toString(),
).toBe("icon");
});
});