/** * Tests for Navigation component * * Tests navigation UI elements, active state, badge counts, and keyboard shortcuts. */ import { describe, it, expect, beforeEach } from "vitest"; import { render, screen, act } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { Navigation } from "@/components/Navigation"; import { useNavStore } from "@/stores/nav-store"; import { useFocusStore } from "@/stores/focus-store"; import { useInboxStore } from "@/stores/inbox-store"; import { makeFocusItem } from "../helpers/fixtures"; describe("Navigation", () => { beforeEach(() => { useNavStore.setState({ activeView: "focus" }); useFocusStore.setState({ current: null, queue: [], isLoading: false, error: null, }); useInboxStore.setState({ items: [], isLoading: false, error: null, }); }); it("renders nav items for all views", () => { render(); expect(screen.getByRole("button", { name: /focus/i })).toBeInTheDocument(); expect(screen.getByRole("button", { name: /queue/i })).toBeInTheDocument(); expect(screen.getByRole("button", { name: /inbox/i })).toBeInTheDocument(); }); it("highlights the active view", () => { useNavStore.setState({ activeView: "queue" }); render(); const queueButton = screen.getByRole("button", { name: /queue/i }); expect(queueButton).toHaveAttribute("data-active", "true"); const focusButton = screen.getByRole("button", { name: /focus/i }); expect(focusButton).toHaveAttribute("data-active", "false"); }); it("shows queue badge count when items exist", () => { useFocusStore.setState({ current: makeFocusItem({ id: "a" }), queue: [makeFocusItem({ id: "b" }), makeFocusItem({ id: "c" })], }); render(); const badge = screen.getByTestId("queue-badge"); expect(badge).toHaveTextContent("3"); }); it("does not show queue badge when no items", () => { render(); expect(screen.queryByTestId("queue-badge")).not.toBeInTheDocument(); }); it("navigates to queue view on click", async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole("button", { name: /queue/i })); expect(useNavStore.getState().activeView).toBe("queue"); }); it("navigates to inbox view on click", async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole("button", { name: /inbox/i })); expect(useNavStore.getState().activeView).toBe("inbox"); }); it("navigates to settings view on settings button click", async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole("button", { name: /settings/i })); expect(useNavStore.getState().activeView).toBe("settings"); }); // Keyboard shortcut tests function dispatchKeyEvent( key: string, opts: { metaKey?: boolean } = {} ): void { const event = new KeyboardEvent("keydown", { key, metaKey: opts.metaKey ?? false, bubbles: true, }); document.dispatchEvent(event); } it("navigates to focus view on Cmd+1", () => { useNavStore.setState({ activeView: "queue" }); render(); act(() => { dispatchKeyEvent("1", { metaKey: true }); }); expect(useNavStore.getState().activeView).toBe("focus"); }); it("navigates to queue view on Cmd+2", () => { render(); act(() => { dispatchKeyEvent("2", { metaKey: true }); }); expect(useNavStore.getState().activeView).toBe("queue"); }); it("navigates to inbox view on Cmd+3", () => { render(); act(() => { dispatchKeyEvent("3", { metaKey: true }); }); expect(useNavStore.getState().activeView).toBe("inbox"); }); it("navigates to settings view on Cmd+,", () => { render(); act(() => { dispatchKeyEvent(",", { metaKey: true }); }); expect(useNavStore.getState().activeView).toBe("settings"); }); it("displays keyboard shortcut hints", () => { render(); // Check for shortcut hints in the nav items expect(screen.getByText("1")).toBeInTheDocument(); expect(screen.getByText("2")).toBeInTheDocument(); expect(screen.getByText("3")).toBeInTheDocument(); }); });