import { afterEach, describe, expect, it, vi } from "vitest";
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import { CommitRow, type CommitItem } from "./commit-row";
vi.mock("@kandev/ui/context-menu", () => ({
ContextMenu: ({ children }: { children: React.ReactNode }) => <>{children}>,
ContextMenuContent: ({ children }: { children: React.ReactNode }) =>
{children}
,
ContextMenuItem: ({
children,
onSelect,
}: {
children: React.ReactNode;
onSelect: () => void;
}) => (
),
ContextMenuTrigger: ({ children }: { children: React.ReactNode }) => <>{children}>,
}));
vi.mock("@kandev/ui/tooltip", () => ({
Tooltip: ({ children }: { children: React.ReactNode }) => <>{children}>,
TooltipContent: ({ children }: { children: React.ReactNode }) => <>{children}>,
TooltipTrigger: ({ children }: { children: React.ReactNode }) => <>{children}>,
}));
afterEach(cleanup);
function remoteCommit(): CommitItem {
return {
commit_sha: "remote123456",
commit_message: "Remote contribution",
insertions: 0,
deletions: 0,
pushed: true,
statsAvailable: false,
detailTarget: {
source: "github",
sha: "remote123456",
workspaceId: "workspace-1",
owner: "acme",
repo: "widget",
},
};
}
describe("CommitRow", () => {
it("hides unknown statistics and local mutation actions for remote commits", () => {
render(
,
);
expect(screen.getByText("Remote contribution")).toBeTruthy();
expect(screen.queryByText("+0")).toBeNull();
expect(screen.queryByText("-0")).toBeNull();
expect(screen.queryByText("Amend message")).toBeNull();
expect(screen.queryByText("Revert commit")).toBeNull();
expect(screen.queryByText("Reset to this commit")).toBeNull();
});
it("passes the full source target when a remote row is opened", () => {
const onOpenCommitDetail = vi.fn();
const commit = remoteCommit();
render();
fireEvent.click(screen.getByTestId("commit-row-remote1"));
expect(onOpenCommitDetail).toHaveBeenCalledWith(commit.detailTarget);
});
it("announces diverged row provenance without showing an unpushed marker", () => {
const localCheckoutCommit: CommitItem = {
...remoteCommit(),
commit_sha: "local123456",
commit_message: "Superseded checkout commit",
pushed: false,
presentation: "local_checkout",
detailTarget: { source: "local", sha: "local123456" },
};
render();
expect(screen.getByTitle("Local checkout commit")).toBeTruthy();
expect(screen.getByText("Local checkout commit")).toBeTruthy();
expect(screen.queryByTitle("Local commit (not yet pushed)")).toBeNull();
});
it("exposes current PR provenance through a stable marker and violet styling", () => {
render();
const marker = screen.getByTestId("commit-provenance");
expect(marker.getAttribute("data-commit-provenance")).toBe("current_pr");
expect(marker.getAttribute("title")).toBe("Current PR commit");
expect(marker.querySelector("svg")?.getAttribute("class")).toContain("text-violet-500");
expect(screen.getByText("Current PR commit")).toBeTruthy();
});
});