54 lines
1.4 KiB
TypeScript
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([]);
|
|
});
|