import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { describe, it, expect, vi, beforeEach } from "vitest";
import { ConversationTabsContextMenu } from "#/components/features/conversation/conversation-tabs/conversation-tabs-context-menu";
import { useConversationStore } from "#/stores/conversation-store";
const CONVERSATION_ID = "conv-abc123";
vi.mock("#/hooks/use-conversation-id", () => ({
useConversationId: () => ({ conversationId: CONVERSATION_ID }),
}));
let mockHasTaskList = false;
vi.mock("#/hooks/use-task-list", () => ({
useTaskList: () => ({
hasTaskList: mockHasTaskList,
taskList: [],
}),
}));
describe("ConversationTabsContextMenu", () => {
beforeEach(() => {
localStorage.clear();
mockHasTaskList = false;
useConversationStore.setState({
selectedTab: "editor",
isRightPanelShown: true,
hasRightPanelToggled: true,
});
});
it("should render nothing when isOpen is false", () => {
const { container } = render(
,
);
expect(container.innerHTML).toBe("");
});
it("should render all default tabs when open", () => {
render();
const expectedTabs = [
"COMMON$PLANNER",
"COMMON$CHANGES",
"COMMON$CODE",
"COMMON$TERMINAL",
"COMMON$BROWSER",
];
for (const tab of expectedTabs) {
expect(screen.getByText(tab)).toBeInTheDocument();
}
expect(screen.queryByText("COMMON$APP")).not.toBeInTheDocument();
});
it("should re-pin a tab when clicking an unpinned tab", async () => {
const user = userEvent.setup();
render();
const terminalItem = screen.getByText("COMMON$TERMINAL");
// Unpin
await user.click(terminalItem);
let storedState = JSON.parse(
localStorage.getItem(`conversation-state-${CONVERSATION_ID}`)!,
);
expect(storedState.unpinnedTabs).toContain("terminal");
// Re-pin
await user.click(terminalItem);
storedState = JSON.parse(
localStorage.getItem(`conversation-state-${CONVERSATION_ID}`)!,
);
expect(storedState.unpinnedTabs).not.toContain("terminal");
});
it("should close the right panel when unpinning the currently active tab", async () => {
const user = userEvent.setup();
render();
await user.click(screen.getByText("COMMON$CHANGES"));
const storeState = useConversationStore.getState();
expect(storeState.hasRightPanelToggled).toBe(false);
const storedState = JSON.parse(
localStorage.getItem(`conversation-state-${CONVERSATION_ID}`)!,
);
expect(storedState.rightPanelShown).toBe(false);
});
it("should not close the right panel when unpinning a non-active tab", async () => {
const user = userEvent.setup();
render();
await user.click(screen.getByText("COMMON$TERMINAL"));
const storeState = useConversationStore.getState();
expect(storeState.hasRightPanelToggled).toBe(true);
});
describe("with tasklist", () => {
beforeEach(() => {
mockHasTaskList = true;
});
it("should show tasklist in context menu when hasTaskList is true", () => {
render();
expect(screen.getByText("COMMON$TASK_LIST")).toBeInTheDocument();
});
});
});