Files
kandev/apps/web/components/task/commit-detail-panel.test.tsx
2026-09-10 18:14:05 +01:00

86 lines
2.5 KiB
TypeScript

import { fireEvent, render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
const mocks = vi.hoisted(() => ({
refetch: vi.fn(),
useCommitDetail: vi.fn(() => ({
files: null,
commit: null,
loading: false,
error: "Commit detail unavailable",
refetch: mocks.refetch,
})),
}));
vi.mock("@/components/state-provider", () => ({
useAppStore: (selector: (state: unknown) => unknown) =>
selector({ tasks: { activeSessionId: null } }),
}));
vi.mock("@/hooks/domains/session/use-session-commits", () => ({
useSessionCommits: () => ({ commits: [] }),
}));
vi.mock("@/hooks/domains/session/use-commit-detail", () => ({
useCommitDetail: mocks.useCommitDetail,
}));
vi.mock("@/hooks/use-panel-actions", () => ({
usePanelActions: () => ({ openFile: vi.fn() }),
}));
vi.mock("@/lib/layout/panel-portal-manager", () => ({
setPanelTitle: vi.fn(),
}));
vi.mock("./panel-primitives", () => ({
PanelRoot: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
PanelBody: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
}));
import { CommitDetailPanel, CommitDiffView } from "./commit-detail-panel";
afterEach(() => {
mocks.refetch.mockReset();
mocks.useCommitDetail.mockClear();
});
describe("CommitDiffView error state", () => {
it("does not present a protocol failure as an empty commit and offers retry", () => {
render(
<CommitDiffView
target={{
source: "github",
sha: "remote123",
workspaceId: "workspace-1",
owner: "acme",
repo: "widget",
}}
/>,
);
expect(screen.getByRole("alert").textContent).toContain("Commit detail unavailable");
expect(screen.queryByText("No files in this commit")).toBeNull();
const retryButton = screen.getByRole("button", { name: "Retry" });
expect(retryButton.getAttribute("data-size")).toBe("default");
expect(retryButton.className).toContain("h-7");
expect(retryButton.className).toContain("pointer:coarse");
fireEvent.click(retryButton);
expect(mocks.refetch).toHaveBeenCalledOnce();
});
});
describe("CommitDetailPanel target validation", () => {
it("does not accept a partial GitHub target from serialized params", () => {
render(
<CommitDetailPanel
panelId="commit-detail"
params={{ target: { source: "github", sha: "partial" } }}
/>,
);
expect(mocks.useCommitDetail).toHaveBeenCalledWith({ source: "local", sha: "" });
});
});