36 lines
1.7 KiB
TypeScript
36 lines
1.7 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { findReusableDeliveryPullRequest } from "../src/integrations/gitea/policy.js";
|
|
import type { GiteaPullRequest } from "../src/integrations/gitea/types.js";
|
|
|
|
const head = "a".repeat(40);
|
|
const merged: GiteaPullRequest = {
|
|
id: 31, number: 31, title: "M18 evidence", state: "closed", merged: true,
|
|
html_url: "https://example.test/pulls/31", created_at: "2026-09-07T00:00:00Z", updated_at: "2026-09-08T00:00:00Z",
|
|
merge_commit_sha: "b".repeat(40), head: { ref: "chatgpt/evidence", sha: head }, base: { ref: "main", sha: "b".repeat(40) },
|
|
};
|
|
const select = (prs: GiteaPullRequest[]) => findReusableDeliveryPullRequest(prs, "chatgpt/evidence", "main", head);
|
|
|
|
describe("existing delivery PR reconciliation", () => {
|
|
it("adopts the exact already-merged PR instead of opening an empty replacement", () => {
|
|
expect(select([merged])).toBe(merged);
|
|
});
|
|
it("reuses an exact open review", () => {
|
|
const open = { ...merged, merged: false, state: "open", merge_commit_sha: undefined };
|
|
expect(select([open])).toBe(open);
|
|
});
|
|
it.each([
|
|
{ ...merged, head: { ...merged.head, sha: "c".repeat(40) } },
|
|
{ ...merged, head: { ...merged.head, ref: "chatgpt/other" } },
|
|
{ ...merged, base: { ...merged.base, ref: "other" } },
|
|
{ ...merged, merged: false },
|
|
])("does not adopt stale, foreign or abandoned reviews", (pr) => {
|
|
expect(select([pr])).toBeUndefined();
|
|
});
|
|
it("rejects ambiguous matching reviews", () => {
|
|
expect(() => select([merged, { ...merged, id: 32, number: 32 }])).toThrow("AMBIGUOUS");
|
|
});
|
|
it("requires actual merge commit evidence", () => {
|
|
expect(() => select([{ ...merged, merge_commit_sha: undefined }])).toThrow("MERGE_EVIDENCE_REQUIRED");
|
|
});
|
|
});
|