CLose story 1.2

This commit is contained in:
2026-05-21 23:08:34 +02:00
commit 110b295a7b
75 changed files with 16065 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
import { describe, it, expect } from "vitest";
import {
createPendingOp,
isValidPendingOp,
} from "../../../src/contracts/pending-op.js";
import { PENDING_OP_FIXTURES } from "../../fixtures/pending-op.js";
describe("pending-op contract", () => {
describe("createPendingOp()", () => {
it("creates a pending op with required fields", () => {
const op = createPendingOp("op-1", "user-1", "hidden", "active");
expect(op.opId).toBe("op-1");
expect(op.userId).toBe("user-1");
expect(op.targetState).toBe("hidden");
expect(op.previousState).toBe("active");
expect(typeof op.issuedAt).toBe("number");
expect(Number.isFinite(op.issuedAt)).toBe(true);
expect(op.issuedAt).toBeGreaterThan(0);
expect(op.timeoutId).toBeNull();
});
});
describe("isValidPendingOp()", () => {
it("accepts valid fixture", () => {
expect(() => isValidPendingOp(PENDING_OP_FIXTURES.valid)).not.toThrow();
});
it("accepts timeoutId: null", () => {
expect(() => isValidPendingOp(PENDING_OP_FIXTURES.timeoutNull)).not.toThrow();
});
it("accepts expired issuedAt (age check is caller's job)", () => {
expect(() => isValidPendingOp(PENDING_OP_FIXTURES.expiredIssuedAt)).not.toThrow();
});
it("throws on empty opId", () => {
expect(() => isValidPendingOp(PENDING_OP_FIXTURES.emptyOpId)).toThrow(TypeError);
});
it("throws on non-finite issuedAt", () => {
const bad = { ...PENDING_OP_FIXTURES.valid, issuedAt: NaN };
expect(() => isValidPendingOp(bad)).toThrow(TypeError);
});
it("throws on negative issuedAt", () => {
const bad = { ...PENDING_OP_FIXTURES.valid, issuedAt: -1 };
expect(() => isValidPendingOp(bad)).toThrow(TypeError);
});
it("throws if not an object", () => {
expect(() => isValidPendingOp(null)).toThrow(TypeError);
});
it("throws on unknown keys", () => {
const bad = { ...PENDING_OP_FIXTURES.valid, extra: true };
expect(() => isValidPendingOp(bad)).toThrow(TypeError);
});
it("throws on string timeoutId", () => {
const bad = { ...PENDING_OP_FIXTURES.valid, timeoutId: "not-a-number" };
expect(() => isValidPendingOp(bad)).toThrow(TypeError);
});
});
});