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}`} />,
|
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 }));
|
const useTaskDiffStatsMock = vi.fn(() => ({ stats: null, loading: false }));
|
||||||
vi.mock("../../hooks/useTaskDiffStats", () => ({
|
vi.mock("../../hooks/useTaskDiffStats", () => ({
|
||||||
useTaskDiffStats: (...args: any[]) => useTaskDiffStatsMock(...args),
|
useTaskDiffStats: (...args: any[]) => useTaskDiffStatsMock(...args),
|
||||||
@@ -302,6 +324,138 @@ describe("TaskCard", () => {
|
|||||||
expect(onOpenDetail).not.toHaveBeenCalled();
|
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", () => {
|
it("renders GitHub badge from live websocket data even when task payload has no badge fields", () => {
|
||||||
badgeUpdatesMock.set("default:FN-001", {
|
badgeUpdatesMock.set("default:FN-001", {
|
||||||
prInfo: {
|
prInfo: {
|
||||||
@@ -3284,6 +3438,17 @@ describe("TaskCard provider icons on agent row", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("TaskCard memo comparator provenance behavior", () => {
|
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", () => {
|
it("returns false when disableDrag changes", () => {
|
||||||
const task = makeTask();
|
const task = makeTask();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user