Files
EpicNext-Cms/src/lib/furni/import-job-retry.test.ts
T
Simo c389c3893d
CI / check (push) Successful in 52s
CI / deploy (push) Successful in 2m10s
CI / publish-container (push) Failing after 1m18s
feat(cms): improve catalog, editorial recovery and operations
2026-09-09 19:36:15 +02:00

54 lines
1.4 KiB
TypeScript

import { expect, it } from "vitest";
import type { ImportJob } from "./import-job";
import { retryableJobItems } from "./import-job-retry";
const job = (state: ImportJob["state"]) =>
({
state,
items: [
"done",
"failed",
"pending",
"running",
"cancelled",
"interrupted",
].map((state) => ({
state,
classname: state,
})),
}) as ImportJob;
it("only retries failures after a completed job", () =>
expect(retryableJobItems(job("completed")).map((i) => i.state)).toEqual([
"failed",
]));
it("recovers only safe unfinished items from an interrupted job", () =>
expect(retryableJobItems(job("interrupted")).map((i) => i.state)).toEqual([
"failed",
"pending",
"cancelled",
]));
it.each(["queued", "running"] as const)("never duplicates a %s job", (state) =>
expect(retryableJobItems(job(state))).toEqual([]),
);
it("retries cancelled remaining work without redoing completed or uncertain items", () => {
expect(retryableJobItems(job("cancelled")).map((i) => i.state)).toEqual([
"failed",
"pending",
"cancelled",
]);
});
it("does not blindly retry legacy interrupted mutations stored as failures", () => {
const interrupted = job("interrupted");
interrupted.items = [
{
...interrupted.items[0],
state: "failed",
error:
"Server restarted during import. Review local data and retry to complete missing parts.",
},
];
expect(retryableJobItems(interrupted)).toEqual([]);
});