import { describe, it, expect, vi } from "vitest"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { ConnectionGrid } from "./ConnectionGrid"; import type { Connection, Folder } from "../../lib/types"; const makeConn = (id: string, folder_id: string | null = null): Connection => ({ id, name: `Conn ${id}`, db_type: "postgresql", host: "h", port: 5432, username: null, folder_id, keychain_ref: null, tag_ids: [], created_at: "", updated_at: "", }); const folders: Folder[] = [ { id: "f1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, { id: "f2", name: "Personal", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, { id: "f3", name: "Client A", parent_id: "f1", tag_ids: [], created_at: "", updated_at: "" }, ]; describe("ConnectionGrid", () => { it("renders empty state when no connections and no folders", () => { render(); expect(screen.getByText(/no connections yet/i)).toBeInTheDocument(); }); it("renders cards for each connection", () => { const conns = [makeConn("1"), makeConn("2")]; render(); expect(screen.getByText("Conn 1")).toBeInTheDocument(); expect(screen.getByText("Conn 2")).toBeInTheDocument(); }); it("renders no-results state when filtered empty", () => { render(); expect(screen.getByText(/no connections match/i)).toBeInTheDocument(); }); it("renders only top-level folders at root", () => { render(); expect(screen.getByText("Work")).toBeInTheDocument(); expect(screen.getByText("Personal")).toBeInTheDocument(); expect(screen.queryByText("Client A")).not.toBeInTheDocument(); }); it("renders only children of active folder", () => { render(); expect(screen.getByText("Client A")).toBeInTheDocument(); expect(screen.queryByText("Personal")).not.toBeInTheDocument(); }); it("calls onFolderSelect with folder id on click", async () => { const fn = vi.fn(); render(); await userEvent.click(screen.getByText("Work")); expect(fn).toHaveBeenCalledWith("f1"); }); it("breadcrumb navigates to root", async () => { const fn = vi.fn(); render(); await userEvent.click(screen.getByText(/all connections/i)); expect(fn).toHaveBeenCalledWith(null); }); it("shows folder cards", () => { render(); expect(screen.getByText("Work")).toBeInTheDocument(); expect(screen.getByText("Personal")).toBeInTheDocument(); }); });