test(FN-5017): complete Step 4 — cover create PR quick action behavior
Fusion-Task-Id: FN-5017 Fusion-Task-Lineage: aeedc3f2-7df8-4467-94b1-77b13b6554e3
This commit is contained in:
committed by
gsxdsm
parent
ebb3ee2a2d
commit
02065e43d5
@@ -26,6 +26,28 @@ vi.mock("../ProviderIcon", () => ({
|
||||
ProviderIcon: ({ provider }: { provider: string }) => <span data-testid={`provider-icon-${provider}`} />,
|
||||
}));
|
||||
|
||||
vi.mock("../PrCreateModal", () => ({
|
||||
PrCreateModal: ({ open, onClose, onCreated }: { open: boolean; onClose: () => void; onCreated: (prInfo: any) => void }) => (
|
||||
<div data-testid="pr-create-modal" data-open={open ? "true" : "false"}>
|
||||
<button type="button" onClick={() => onClose()}>close-pr-modal</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => onCreated({
|
||||
number: 42,
|
||||
url: "https://github.com/owner/repo/pull/42",
|
||||
status: "open",
|
||||
title: "Created PR",
|
||||
headBranch: "fusion/fn-001",
|
||||
baseBranch: "main",
|
||||
commentCount: 0,
|
||||
})}
|
||||
>
|
||||
create-pr-modal
|
||||
</button>
|
||||
</div>
|
||||
),
|
||||
}));
|
||||
|
||||
const useTaskDiffStatsMock = vi.fn(() => ({ stats: null, loading: false }));
|
||||
vi.mock("../../hooks/useTaskDiffStats", () => ({
|
||||
useTaskDiffStats: (...args: any[]) => useTaskDiffStatsMock(...args),
|
||||
@@ -302,6 +324,138 @@ describe("TaskCard", () => {
|
||||
expect(onOpenDetail).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("renders Create PR quick action on eligible in-review cards", () => {
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column: "in-review", paused: false, userPaused: false, prInfo: undefined as any })}
|
||||
onOpenDetail={noop}
|
||||
addToast={noop}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.getByRole("button", { name: "Create pull request" })).toBeDefined();
|
||||
});
|
||||
|
||||
it.each(["in-progress", "todo", "done"] as const)("does not render Create PR quick action outside in-review (%s)", (column) => {
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column, paused: false, userPaused: false, prInfo: undefined as any })}
|
||||
onOpenDetail={noop}
|
||||
addToast={noop}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.queryByRole("button", { name: "Create pull request" })).toBeNull();
|
||||
});
|
||||
|
||||
it("does not render Create PR quick action when prAuthAvailable is false", () => {
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column: "in-review", paused: false, userPaused: false, prInfo: undefined as any })}
|
||||
onOpenDetail={noop}
|
||||
addToast={noop}
|
||||
prAuthAvailable={false}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.queryByRole("button", { name: "Create pull request" })).toBeNull();
|
||||
});
|
||||
|
||||
it("does not render Create PR quick action when task already has prInfo", () => {
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({
|
||||
column: "in-review",
|
||||
prInfo: {
|
||||
url: "https://github.com/owner/repo/pull/7",
|
||||
number: 7,
|
||||
status: "open",
|
||||
title: "Existing PR",
|
||||
headBranch: "fusion/fn-001",
|
||||
baseBranch: "main",
|
||||
commentCount: 0,
|
||||
} as any,
|
||||
})}
|
||||
onOpenDetail={noop}
|
||||
addToast={noop}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.queryByRole("button", { name: "Create pull request" })).toBeNull();
|
||||
});
|
||||
|
||||
it.each([
|
||||
{ paused: true, userPaused: false },
|
||||
{ paused: false, userPaused: true },
|
||||
])("does not render Create PR quick action when paused flags are set", ({ paused, userPaused }) => {
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column: "in-review", paused, userPaused, prInfo: undefined as any })}
|
||||
onOpenDetail={noop}
|
||||
addToast={noop}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.queryByRole("button", { name: "Create pull request" })).toBeNull();
|
||||
});
|
||||
|
||||
it("opens Create PR modal on click and does not open task detail", () => {
|
||||
const onOpenDetail = vi.fn();
|
||||
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column: "in-review", paused: false, userPaused: false, prInfo: undefined as any })}
|
||||
onOpenDetail={onOpenDetail}
|
||||
addToast={noop}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
fireEvent.click(screen.getByRole("button", { name: "Create pull request" }));
|
||||
|
||||
expect(screen.getByTestId("pr-create-modal").getAttribute("data-open")).toBe("true");
|
||||
expect(onOpenDetail).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("closes Create PR modal when onClose fires", () => {
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column: "in-review", paused: false, userPaused: false, prInfo: undefined as any })}
|
||||
onOpenDetail={noop}
|
||||
addToast={noop}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
fireEvent.click(screen.getByRole("button", { name: "Create pull request" }));
|
||||
fireEvent.click(screen.getByRole("button", { name: "close-pr-modal" }));
|
||||
|
||||
expect(screen.getByTestId("pr-create-modal").getAttribute("data-open")).toBe("false");
|
||||
});
|
||||
|
||||
it("shows success toast and closes modal when PR is created", () => {
|
||||
const addToast = vi.fn();
|
||||
|
||||
render(
|
||||
<TaskCard
|
||||
task={makeTask({ column: "in-review", paused: false, userPaused: false, prInfo: undefined as any })}
|
||||
onOpenDetail={noop}
|
||||
addToast={addToast}
|
||||
prAuthAvailable={true}
|
||||
/>,
|
||||
);
|
||||
|
||||
fireEvent.click(screen.getByRole("button", { name: "Create pull request" }));
|
||||
fireEvent.click(screen.getByRole("button", { name: "create-pr-modal" }));
|
||||
|
||||
expect(addToast).toHaveBeenCalledWith("Created PR #42", "success");
|
||||
expect(screen.getByTestId("pr-create-modal").getAttribute("data-open")).toBe("false");
|
||||
});
|
||||
|
||||
it("renders GitHub badge from live websocket data even when task payload has no badge fields", () => {
|
||||
badgeUpdatesMock.set("default:FN-001", {
|
||||
prInfo: {
|
||||
@@ -3284,6 +3438,17 @@ describe("TaskCard provider icons on agent row", () => {
|
||||
});
|
||||
|
||||
describe("TaskCard memo comparator provenance behavior", () => {
|
||||
it("returns false when prAuthAvailable changes", () => {
|
||||
const task = makeTask({ column: "in-review" });
|
||||
|
||||
expect(
|
||||
__test_areTaskCardPropsEqual(
|
||||
{ task, onOpenDetail: noop, addToast: noop, prAuthAvailable: false } as any,
|
||||
{ task, onOpenDetail: noop, addToast: noop, prAuthAvailable: true } as any,
|
||||
),
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when disableDrag changes", () => {
|
||||
const task = makeTask();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user