feat(catalog): persist idempotent bulk operations and retryable deliveries
This commit is contained in:
1 parent
76e46d295c
commit
13665e0c3c
53 files changed
+1316
-76
No files matched your search
@@ -0,0 +1,31 @@
|
||||
import { expect, it } from "vitest";
|
||||
import { operationHash, retryDelay, validateOperation } from "./model";
|
||||
|
||||
it("hashes equivalent object payloads equally without ignoring array order", () => {
|
||||
expect(operationHash({ b: 2, a: { y: 1, x: 0 } })).toBe(
|
||||
operationHash({ a: { x: 0, y: 1 }, b: 2 }),
|
||||
);
|
||||
expect(operationHash([1, 2])).not.toBe(operationHash([2, 1]));
|
||||
});
|
||||
it("rejects unsupported or oversized input rather than hashing ambiguous values", () => {
|
||||
expect(() => operationHash({ amount: NaN })).toThrow();
|
||||
expect(() => operationHash({ value: undefined })).toThrow();
|
||||
expect(() => operationHash("x".repeat(100000))).toThrow();
|
||||
});
|
||||
it("validates actor and request identity before database access", () => {
|
||||
const valid = {
|
||||
actorId: 1,
|
||||
kind: "catalog.bulk.apply",
|
||||
key: "123e4567-e89b-42d3-a456-426614174000",
|
||||
input: {},
|
||||
};
|
||||
expect(() => validateOperation(valid)).not.toThrow();
|
||||
expect(() => validateOperation({ ...valid, actorId: 0 })).toThrow();
|
||||
expect(() => validateOperation({ ...valid, key: "shared" })).toThrow();
|
||||
expect(() => validateOperation({ ...valid, kind: "bad kind" })).toThrow();
|
||||
});
|
||||
it("backs off boundedly for repeated delivery failures", () => {
|
||||
expect(retryDelay(1)).toBe(60);
|
||||
expect(retryDelay(2)).toBe(120);
|
||||
expect(retryDelay(20)).toBe(3600);
|
||||
});
|
||||
Reference in new issue
Block a user