import { beforeEach, describe, expect, mock, test } from "bun:test"; import { fakeD1 } from "../metering/fake-d1.test-helper"; import { scopedTestState } from "./scoped.test-helper"; let d1 = fakeD1(); const scoped = scopedTestState(); scoped.install(); const kv = new Map(); const fakeEnv = { get DB() { return d1.binding; }, KV: { get: async (key: string, type?: string) => { const value = kv.get(key) ?? null; return value !== null && type === "json" ? JSON.parse(value) : value; }, put: async (key: string, value: string) => void kv.set(key, value), delete: async (key: string) => void kv.delete(key), }, }; mock.module("cloudflare:workers", () => ({ env: fakeEnv, waitUntil: () => undefined })); const { dropAliasesForPreview, dropPullAliasesForIssue, syncPullAliases, sweepClosedPullAliasesForScope } = await import("./pr-aliases"); function addPull(id: string, number: number, headRepo: string): void { scoped.insert("r1", "issues", { id, number }); scoped.insert("r1", "pull_requests", { issue_id: id, head_repo_id: headRepo, head_ref: "feature" }); scoped.register("issue", id, "r1"); } function setup(): void { d1 = fakeD1(); kv.clear(); scoped.reset(); scoped.site({ id: "s1", owner_id: "u1", repo_id: "r1", label: "blog--alice" }); addPull("i7", 7, "r1"); addPull("i8", 8, "fork"); } const site = (commitPreviews: number) => ({ id: "s1", repo_id: "r1", label: "blog--alice", commit_previews: commitPreviews, }); const deployment = (id: string, sha: string) => ({ id, environment: "preview" as const, branch: "feature", sha }); const COMMITS = 7; const pointer = (label: string) => JSON.parse(kv.get(`sites:slot:${label}`) ?? "null"); describe("pull request aliases", () => { beforeEach(setup); test("points pr-N at the latest preview of a same-repo pull request only", async () => { await syncPullAliases(site(0), deployment("d1", "abcdef1234")); await syncPullAliases(site(0), deployment("d2", "1234567890")); expect(pointer("pr-7--blog--alice")).toEqual({ siteId: "s1", deploymentId: "d2" }); expect(pointer("pr-8--blog--alice")).toBeNull(); expect(pointer("abcdef1--blog--alice")).toBeNull(); }); test("commit previews are immutable and keep the last five", async () => { for (let index = 0; index < COMMITS; index += 1) { await syncPullAliases(site(1), deployment(`d${index}`, `${index}000000aaaa`)); } expect(pointer("0000000--blog--alice")).toBeNull(); expect(pointer("1000000--blog--alice")).toBeNull(); expect(pointer("2000000--blog--alice")).toEqual({ siteId: "s1", deploymentId: "d2" }); expect(pointer("6000000--blog--alice")).toEqual({ siteId: "s1", deploymentId: "d6" }); }); test("closing the pull request drops its hosts", async () => { await syncPullAliases(site(1), deployment("d1", "abcdef1234")); await dropPullAliasesForIssue("i7"); expect(pointer("pr-7--blog--alice")).toBeNull(); expect(pointer("abcdef1--blog--alice")).toBeNull(); }); test("the sweep drops aliases of pull requests closed without the hook", async () => { await syncPullAliases(site(0), deployment("d1", "abcdef1234")); scoped.repo("r1").run("UPDATE issues SET state = 'closed' WHERE id = 'i7'"); expect(await sweepClosedPullAliasesForScope("r1")).toBe(false); expect(pointer("pr-7--blog--alice")).toBeNull(); }); test("a commit shared by two pull requests survives pruning and closing of one of them", async () => { addPull("i9", 9, "r1"); await syncPullAliases(site(1), deployment("d1", "abcdef1234")); await dropPullAliasesForIssue("i7"); expect(pointer("abcdef1--blog--alice")).toEqual({ siteId: "s1", deploymentId: "d1" }); expect(pointer("pr-9--blog--alice")).toEqual({ siteId: "s1", deploymentId: "d1" }); }); test("removing the branch preview drops the aliases serving it", async () => { scoped.insert("r1", "site_deployments", { id: "d1", site_id: "s1", label: "feature--blog--alice" }); await syncPullAliases(site(1), deployment("d1", "abcdef1234")); await dropAliasesForPreview("s1", "feature--blog--alice"); expect(pointer("pr-7--blog--alice")).toBeNull(); expect(pointer("abcdef1--blog--alice")).toBeNull(); }); test("never takes over another site's host", async () => { kv.set("sites:slot:pr-7--blog--alice", JSON.stringify({ siteId: "s1-other", deploymentId: "x" })); scoped.site({ id: "s1-other", owner_id: "u2", label: "other" }); await syncPullAliases(site(0), deployment("d1", "abcdef1234")); expect(pointer("pr-7--blog--alice")).toEqual({ siteId: "s1-other", deploymentId: "x" }); }); });