38 lines · 1.9 KB
import { describe, expect, mock, test } from "bun:test";

mock.module("cloudflare:workers", () => ({ env: {}, waitUntil: () => undefined }));
const { assertNotArchived, repoPermission, repoReadOnlyReason, repoTakenDown } = await import("./repos");

describe("read-only repositories", () => {
  test("a disabled owner makes the repository read-only, like archiving", () => {
    expect(repoReadOnlyReason({ is_archived: 0, owner_disabled_at: null })).toBeNull();
    expect(repoReadOnlyReason({ is_archived: 0 })).toBeNull();
    expect(repoReadOnlyReason({ is_archived: 1, owner_disabled_at: null })).toContain("archived");
    expect(repoReadOnlyReason({ is_archived: 0, owner_disabled_at: 1 })).toContain("account is disabled");
    expect(() => assertNotArchived({ is_archived: 0, owner_disabled_at: 1 })).toThrow("account is disabled");
  });
});

describe("taken-down repositories", () => {
  const repo = {
    id: "r1",
    owner_id: "owner",
    visibility: "public",
    owner_disabled_at: 1,
    owner_disabled_reason: "admin",
  } as Parameters<typeof repoPermission>[0];
  const viewer = { id: "someone", name: "someone", displayName: null, email: "", isAdmin: false, emailVerified: true };

  test("only an admin disable takes repositories down; a dispute keeps them readable", () => {
    expect(repoTakenDown({ owner_disabled_at: 1, owner_disabled_reason: "admin" })).toBe(true);
    expect(repoTakenDown({ owner_disabled_at: 1, owner_disabled_reason: "payment_dispute" })).toBe(false);
    expect(repoTakenDown({ owner_disabled_at: null, owner_disabled_reason: null })).toBe(false);
  });

  test("a taken-down public repository is hidden from anonymous and signed-in viewers, readable by admins", async () => {
    expect(await repoPermission(repo, null)).toBe("none");
    expect(await repoPermission(repo, viewer)).toBe("none");
    expect(await repoPermission(repo, { ...viewer, isAdmin: true, emailVerified: true })).toBe("read");
  });
});