import { describe, expect, test } from "bun:test"; import { ciVerdict, MAX_CI_POLLS, NO_CI_GRACE_POLLS, NO_CI_REASON } from "./requeue-policy"; const status = (context: string, state: "success" | "failure" | "pending") => ({ context, state }); describe("ciVerdict", () => { test("required checks gate the re-enqueue", () => { const base = { required: ["ci/test", "ci/lint"], statuses: [], poll: 1 }; expect(ciVerdict({ ...base, requiredResults: ["success", "success"] })).toEqual({ kind: "green" }); expect(ciVerdict({ ...base, requiredResults: ["success", "pending"] })).toEqual({ kind: "wait" }); expect(ciVerdict({ ...base, requiredResults: ["success", "missing"] })).toEqual({ kind: "wait" }); expect(ciVerdict({ ...base, requiredResults: ["failure", "success"] }).kind).toBe("red"); expect(ciVerdict({ ...base, requiredResults: ["untrusted", "success"] }).kind).toBe("red"); }); test("without required checks every reported status must pass", () => { const base = { required: [], requiredResults: [], poll: 1 }; expect(ciVerdict({ ...base, statuses: [status("a", "success"), status("b", "pending")] })).toEqual({ kind: "wait", }); expect(ciVerdict({ ...base, statuses: [status("a", "success")] })).toEqual({ kind: "green" }); expect(ciVerdict({ ...base, statuses: [status("a", "failure")] }).kind).toBe("red"); expect(ciVerdict({ ...base, statuses: [{ context: "a", state: "untrusted" }] }).kind).toBe("red"); }); test("no CI at all hands the fix back to a human after a grace period", () => { const base = { required: [], requiredResults: [], statuses: [] }; expect(ciVerdict({ ...base, poll: NO_CI_GRACE_POLLS - 1 })).toEqual({ kind: "wait" }); expect(ciVerdict({ ...base, poll: NO_CI_GRACE_POLLS })).toEqual({ kind: "red", reason: NO_CI_REASON }); }); test("pending CI is bounded", () => { const pending = { required: ["ci"], requiredResults: ["pending" as const], statuses: [] }; expect(ciVerdict({ ...pending, poll: MAX_CI_POLLS - 1 })).toEqual({ kind: "wait" }); expect(ciVerdict({ ...pending, poll: MAX_CI_POLLS }).kind).toBe("red"); }); });