feat(import): run catalog synchronizations as durable jobs
This commit is contained in:
1 parent
a2954e4408
commit
76f0420d64
14 files changed
+559
-801
No files matched your search
@@ -0,0 +1,75 @@
|
||||
import { beforeEach, expect, it, vi } from "vitest";
|
||||
|
||||
const mocks = vi.hoisted(() => ({
|
||||
existing: vi.fn(),
|
||||
clone: vi.fn(),
|
||||
source: vi.fn(),
|
||||
import: vi.fn(),
|
||||
}));
|
||||
vi.mock("@/lib/db", async () => ({
|
||||
...(await import("@/db/schema")),
|
||||
db: {
|
||||
select: () => ({
|
||||
from: () => ({ where: () => ({ limit: mocks.existing }) }),
|
||||
}),
|
||||
},
|
||||
}));
|
||||
vi.mock("./clone-import", () => ({ cloneSingleFurni: mocks.clone }));
|
||||
vi.mock("./clone-sources", () => ({ getSource: mocks.source }));
|
||||
vi.mock("./furni-import", () => ({ importSingleFurni: mocks.import }));
|
||||
|
||||
import { runSyncJobItem } from "./furni-sync-item";
|
||||
|
||||
const item = {
|
||||
id: 0,
|
||||
classname: "chair",
|
||||
name: "Chair",
|
||||
description: "",
|
||||
type: "flooritem",
|
||||
revision: 1,
|
||||
category: "other",
|
||||
};
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
mocks.existing.mockResolvedValue([]);
|
||||
mocks.import.mockResolvedValue({ ok: true, warnings: [] });
|
||||
});
|
||||
it("skips an item another queued request has already imported", async () => {
|
||||
mocks.existing.mockResolvedValue([{ id: 3 }]);
|
||||
expect(await runSyncJobItem(item)).toMatchObject({ ok: true, itemId: 3 });
|
||||
expect(mocks.import).not.toHaveBeenCalled();
|
||||
expect(mocks.clone).not.toHaveBeenCalled();
|
||||
});
|
||||
it("never repairs existing furniture during official sync", async () => {
|
||||
await runSyncJobItem(item);
|
||||
expect(mocks.import).toHaveBeenCalledWith({ ...item, repairExisting: false });
|
||||
});
|
||||
it("fails a deleted clone source without substituting official assets", async () => {
|
||||
mocks.source.mockResolvedValue(null);
|
||||
await expect(
|
||||
runSyncJobItem({ ...item, cloneSourceId: "gone" }),
|
||||
).rejects.toThrow("no longer available");
|
||||
expect(mocks.import).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("returns the created clone item ID for audit correlation", async () => {
|
||||
mocks.existing.mockResolvedValueOnce([]).mockResolvedValueOnce([{ id: 71 }]);
|
||||
mocks.source.mockResolvedValue({ id: "source" });
|
||||
mocks.clone.mockResolvedValue({ ok: true, warnings: [] });
|
||||
const cloneEntry = {
|
||||
id: 1,
|
||||
classname: "chair",
|
||||
name: "Chair",
|
||||
description: "",
|
||||
xdim: 1,
|
||||
ydim: 1,
|
||||
canstandon: false,
|
||||
cansiton: true,
|
||||
canlayon: false,
|
||||
customparams: "",
|
||||
itemType: "s" as const,
|
||||
};
|
||||
expect(
|
||||
await runSyncJobItem({ ...item, cloneSourceId: "source", cloneEntry }),
|
||||
).toMatchObject({ ok: true, itemId: 71 });
|
||||
});
|
||||
Reference in new issue
Block a user