Skip to content
Source
Sign inSign up
Open History to see the last commit

pullRequestStatus.test.ts

101 lines3.5 KB

1import type { PullRequestActivity, PullRequestCheck, PullRequestComment } from "@t3tools/contracts";
2import { describe, expect, it } from "vite-plus/test";
3import {
4 normalizedReviewState,
5 pullRequestChecksSummary,
6 pullRequestReviewSummary,
7} from "./pullRequestStatus";
8​
9const author = { login: "julius", name: null, avatarUrl: null };
10function review(state: string, at: string): PullRequestComment {
11 return {
12 id: `${state}:${at}`,
13 kind: "review",
14 author,
15 body: "",
16 createdAt: at,
17 url: null,
18 path: null,
19 reviewState: state,
20 };
22function activity(
23 comments: readonly PullRequestComment[],
24): Pick<PullRequestActivity, "comments" | "commits"> {
25 return { comments, commits: [] };
27function check(status: PullRequestCheck["status"]): PullRequestCheck {
28 return { name: status, status, url: null, description: null };
30​
31describe("mobile overview review status", () => {
32 it("uses each reviewer's latest verdict even when history arrives out of order", () => {
33 const result = pullRequestReviewSummary(
34 { reviewers: [] },
35 activity([
36 review("CHANGES_REQUESTED", "2026-10-10T10:00:00Z"),
37 review("APPROVED", "2026-10-10T09:00:00Z"),
38 ]),
39 );
40 expect(result.title).toBe("Changes requested");
41 expect(result.reviews).toHaveLength(1);
42 });
43​
44 it("does not claim a dismissed approval or an approval preceding the latest commit", () => {
45 const approved = review("APPROVED", "2026-10-10T09:00:00Z");
46 expect(
47 pullRequestReviewSummary(
48 { reviewers: [] },
49 activity([approved, review("DISMISSED", "2026-10-10T10:00:00Z")]),
50 ).reviews,
51 ).toEqual([]);
52 const result = pullRequestReviewSummary(
53 { reviewers: [author] },
54 {
55 comments: [approved],
56 commits: [
57 { oid: "abc123", messageHeadline: "Update", committedDate: "2026-10-10T10:00:00Z" },
58 ],
59 },
60 );
61 expect(result.title).toBe("Awaiting review");
62 });
63​
64 it("keeps an approval when a later review only comments, and normalizes provider spelling", () => {
65 const result = pullRequestReviewSummary(
66 { reviewers: [] },
67 activity([
68 review("approved", "2026-10-10T09:00:00Z"),
69 review("COMMENTED", "2026-10-10T10:00:00Z"),
70 ]),
71 );
72 expect(result.title).toBe("Approved by julius");
73 expect(result.reviews).toHaveLength(1);
74 expect(
75 pullRequestReviewSummary(
76 { reviewers: [] },
77 activity([review("changes-requested", "2026-10-10T11:00:00Z")]),
78 ).title,
79 ).toBe("Changes requested");
80 });
81});
82​
83describe("mobile review state spelling", () => {
84 it("reads GitHub's uppercase and Bitbucket's or GitCafe's lowercase verdicts alike", () => {
85 expect(normalizedReviewState("APPROVED")).toBe("APPROVED");
86 expect(normalizedReviewState("approved")).toBe("APPROVED");
87 expect(normalizedReviewState("CHANGES_REQUESTED")).toBe("CHANGES_REQUESTED");
88 expect(normalizedReviewState("changes_requested")).toBe("CHANGES_REQUESTED");
89 expect(normalizedReviewState("changes-requested")).toBe("CHANGES_REQUESTED");
90 expect(normalizedReviewState("commented")).toBe("COMMENTED");
91 expect(normalizedReviewState(null)).toBeUndefined();
92 });
93});
94​
95describe("mobile overview check status", () => {
96 it("prioritizes failed checks while others are running", () => {
97 expect(
98 pullRequestChecksSummary({ checks: [check("success"), check("pending"), check("failure")] }),
99 ).toMatchObject({ title: "1 check failing", count: "1 of 3" });
100 });
101});