Files
kandev/apps/web/components/task/task-changes-panel-comments.test.ts
T
2026-09-18 16:03:18 +01:00

50 lines
1.7 KiB
TypeScript

import { beforeEach, expect, it, vi } from "vitest";
import { act, renderHook } from "@testing-library/react";
import { useCommentsStore, type ReviewFileComment } from "@/lib/state/slices/comments";
import { useFixCommentsRequest } from "./task-changes-panel";
const { request } = vi.hoisted(() => ({ request: vi.fn().mockResolvedValue({}) }));
vi.mock("@/components/state-provider", () => ({
useAppStore: (select: (state: unknown) => unknown) =>
select({ tasks: { activeTaskId: "task-b" } }),
}));
vi.mock("@/components/toast-provider", () => ({ useToast: () => ({ toast: vi.fn() }) }));
vi.mock("@/lib/ws/connection", () => ({ getWebSocketClient: () => ({ request }) }));
beforeEach(() => {
request.mockClear();
useCommentsStore.setState({ byId: {}, bySession: {}, pendingForChat: [] });
});
it("sends and clears only the active session's review feedback", () => {
for (const sessionId of ["session-a", "session-b"]) {
const comment: ReviewFileComment = {
source: "review-file",
id: sessionId,
sessionId,
repositoryName: "",
filePath: "README.md",
text: `Feedback for ${sessionId}`,
status: "pending",
createdAt: "now",
};
useCommentsStore.getState().addComment(comment);
}
const { result } = renderHook(() => useFixCommentsRequest("session-b", false));
act(() => result.current());
expect(request).toHaveBeenCalledWith(
"message.add",
expect.objectContaining({
session_id: "session-b",
content: expect.stringContaining("Feedback for session-b"),
}),
);
expect(request.mock.calls[0][1].content).not.toContain("Feedback for session-a");
expect(
useCommentsStore
.getState()
.getPendingComments()
.map((c) => c.id),
).toEqual(["session-a"]);
});