103 lines · 4.1 KB
import { describe, expect, mock, test } from "bun:test";
import type { BranchProtection } from "./protection";

mock.module("cloudflare:workers", () => ({
  env: {},
  waitUntil: () => undefined,
  WorkflowEntrypoint: class {},
  DurableObject: class {},
  WorkerEntrypoint: class {},
}));

const { tagUpdateViolation } = await import("./protection");
const { protectionVerdicts } = await import("./git/proxy");
const ZERO = "0".repeat(40);
const A = "a".repeat(40);
const B = "b".repeat(40);

function rule(overrides: Partial<BranchProtection> = {}): BranchProtection {
  return {
    id: "r1",
    pattern: "refs/tags/v*",
    requirePullRequest: false,
    requiredApprovals: 0,
    requiredChecks: [],
    dismissStaleReviews: false,
    allowDeletions: false,
    allowForcePushes: false,
    enforceAdmins: false,
    requireCodeOwnerReview: false,
    ...overrides,
  };
}

describe("tagUpdateViolation (GIT-A3 / GIT-A6)", () => {
  test("no rule means no restriction", () => {
    expect(tagUpdateViolation(null, "write", "create")).toBeNull();
    expect(tagUpdateViolation(null, "write", "delete")).toBeNull();
  });

  test("writers cannot create, move or delete tags under a strict rule", () => {