import { describe, it, expect, vi, beforeEach } from "vitest";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { QueueView } from "@/components/QueueView";
import { useFocusStore } from "@/stores/focus-store";
import { makeFocusItem } from "../helpers/fixtures";
describe("QueueView", () => {
beforeEach(() => {
useFocusStore.setState({
current: null,
queue: [],
isLoading: false,
error: null,
});
});
it("shows empty state when no items", () => {
render();
expect(screen.getByText(/no items/i)).toBeInTheDocument();
});
it("groups items by type with section headers", () => {
useFocusStore.setState({
current: makeFocusItem({ id: "current" }),
queue: [
makeFocusItem({ id: "r1", type: "mr_review", title: "Review A" }),
makeFocusItem({ id: "r2", type: "mr_review", title: "Review B" }),
makeFocusItem({ id: "i1", type: "issue", title: "Issue A" }),
makeFocusItem({
id: "m1",
type: "mr_authored",
title: "My MR",
}),
],
});
render();
expect(screen.getByText(/REVIEWS/i)).toBeInTheDocument();
expect(screen.getByText(/ISSUES/i)).toBeInTheDocument();
expect(screen.getByText(/AUTHORED MRS/i)).toBeInTheDocument();
});
it("shows item count in section headers", () => {
useFocusStore.setState({
current: makeFocusItem({ id: "current", type: "issue" }),
queue: [
makeFocusItem({ id: "r1", type: "mr_review" }),
makeFocusItem({ id: "r2", type: "mr_review" }),
makeFocusItem({ id: "i1", type: "issue" }),
],
});
render();
// Text is split across elements, so use a function matcher
const reviewsHeader = screen.getByText((_content, element) => {
return element?.tagName === "H2" && element.textContent === "REVIEWS (2)";
});
expect(reviewsHeader).toBeInTheDocument();
const issuesHeader = screen.getByText((_content, element) => {
return element?.tagName === "H2" && element.textContent === "ISSUES (2)";
});
expect(issuesHeader).toBeInTheDocument();
});
it("includes current focus item in the list", () => {
useFocusStore.setState({
current: makeFocusItem({
id: "focused",
type: "mr_review",
title: "Focused item",
}),
queue: [
makeFocusItem({ id: "q1", type: "issue", title: "Queued item" }),
],
});
render();
expect(screen.getByText("Focused item")).toBeInTheDocument();
expect(screen.getByText("Queued item")).toBeInTheDocument();
});
it("calls onSetFocus when an item is clicked", async () => {
const onSetFocus = vi.fn();
const user = userEvent.setup();
useFocusStore.setState({
current: makeFocusItem({ id: "current" }),
queue: [
makeFocusItem({ id: "target", type: "issue", title: "Click me" }),
],
});
render();
await user.click(screen.getByText("Click me"));
expect(onSetFocus).toHaveBeenCalledWith("target");
});
it("marks the current focus item visually", () => {
useFocusStore.setState({
current: makeFocusItem({ id: "focused", title: "Current focus" }),
queue: [],
});
const { container } = render(
);
expect(container.querySelector("[data-focused='true']")).toBeTruthy();
});
});