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");
});
});