Files
kandev/apps/web/components/task/task-pr-open.test.ts
T
2026-08-26 15:54:59 +00:00

78 lines
2.4 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { resolveTaskPROpenAction, resolveTaskReviewOpenAction } from "./task-pr-open";
import type { TaskPR } from "@/lib/types/github";
import type { TaskMR } from "@/lib/types/gitlab";
function makePR(overrides: Partial<TaskPR>): TaskPR {
return {
id: "pr-1",
workspace_id: "workspace-1",
task_id: "task-1",
owner: "kdlbs",
repo: "kandev",
pr_number: 1,
pr_url: "https://github.com/kdlbs/kandev/pull/1",
pr_title: "Test PR",
head_branch: "feature/x",
base_branch: "main",
author_login: "jcfs",
state: "open",
review_state: "",
checks_state: "",
mergeable_state: "",
review_count: 0,
pending_review_count: 0,
comment_count: 0,
unresolved_review_threads: 0,
checks_total: 0,
checks_passing: 0,
additions: 0,
deletions: 0,
created_at: "2026-01-01T00:00:00Z",
merged_at: null,
closed_at: null,
last_synced_at: null,
updated_at: "2026-01-01T00:00:00Z",
...overrides,
};
}
describe("resolveTaskPROpenAction", () => {
it("returns none when the task has no linked PRs", () => {
expect(resolveTaskPROpenAction([])).toEqual({ kind: "none" });
});
it("opens directly when exactly one PR is linked", () => {
const pr = makePR({ id: "only" });
expect(resolveTaskPROpenAction([pr])).toEqual({ kind: "open", pr });
});
it("asks for a pick when several PRs are linked", () => {
const prs = [makePR({ id: "a" }), makePR({ id: "b", pr_number: 2 })];
expect(resolveTaskPROpenAction(prs)).toEqual({ kind: "pick", prs });
});
});
describe("resolveTaskReviewOpenAction", () => {
it("opens one GitLab merge request directly", () => {
const mr = { id: "mr-1", mr_url: "https://gitlab.com/a/b/-/merge_requests/2" } as TaskMR;
expect(resolveTaskReviewOpenAction([], [mr])).toEqual({
kind: "open",
url: mr.mr_url,
target: { type: "mr", key: "mr:mr-1", url: mr.mr_url, review: mr },
});
});
it("uses the provider-aware picker for mixed linked reviews", () => {
const pr = makePR({ id: "pr" });
const mr = { id: "mr", mr_url: "https://gitlab.com/a/b/-/merge_requests/2" } as TaskMR;
expect(resolveTaskReviewOpenAction([pr], [mr])).toMatchObject({
kind: "pick",
targets: [
{ type: "pr", key: "pr:pr", url: pr.pr_url, review: pr },
{ type: "mr", key: "mr:mr", url: mr.mr_url, review: mr },
],
});
});
});