38 lines · 2.1 KB
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");
  });
});