// @vitest-environment node import { describe, expect, it, vi } from "vitest"; vi.mock("@/lib/services/import/core/download", () => ({ downloadFile: vi.fn(async () => ({ ok: true, size: 100 })), })); vi.mock("@/lib/services/figure-source", () => ({ resolveFigureSwfUrl: vi.fn(async (lib: string) => `https://x/${lib}.swf`), })); vi.mock("@/lib/services/figuremap", () => ({ listFigureLibraries: vi.fn(async () => [ { id: "Hair_F_Bob", revision: 1 }, { id: "shirt_M_x", revision: 2 }, { id: "Hat_U_y", revision: 3 }, ]), })); const convertSwfToNitro = vi.fn(() => ({ bundle: Buffer.from("nitro"), warnings: [], })); vi.mock("@/lib/services/swf-to-nitro", () => ({ convertSwfToNitro: (...a: unknown[]) => convertSwfToNitro(...(a as Parameters)), })); vi.mock("node:fs", async (orig) => { const real = (await orig()) as typeof import("node:fs"); return { ...real, existsSync: vi.fn(() => false), promises: { ...real.promises, readFile: vi.fn(async () => Buffer.from("CWS")), writeFile: vi.fn(async () => {}), mkdir: vi.fn(async () => {}), unlink: vi.fn(async () => {}), }, }; }); import { getFigureList, importSingleFigure } from "./figure-import"; describe("figure-import", () => { it("paginates the library list with present flags", async () => { const { items, meta } = await getFigureList({ search: "", page: 1, perPage: 2, }); expect(items).toHaveLength(2); expect(meta).toMatchObject({ page: 1, perPage: 2, total: 3 }); expect(items[0]).toMatchObject({ lib: "Hair_F_Bob", nitroExists: false }); }); it("filters by search", async () => { const { items, meta } = await getFigureList({ search: "shirt", page: 1, perPage: 50, }); expect(meta.total).toBe(1); expect(items[0].lib).toBe("shirt_M_x"); }); it("importSingleFigure downloads + converts + writes", async () => { const r = await importSingleFigure({ lib: "Hair_F_Bob" }); expect(r.ok).toBe(true); expect(convertSwfToNitro).toHaveBeenCalled(); }); it("fails cleanly when conversion throws", async () => { convertSwfToNitro.mockImplementationOnce(() => { throw new Error("bad swf"); }); const r = await importSingleFigure({ lib: "shirt_M_x" }); expect(r.ok).toBe(false); expect(r.error).toContain("conversion"); }); });