import { describe, it, expect, beforeEach, vi } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import { DbViewerToolbar } from "./DbViewerToolbar"; import { useDbViewerStore } from "../../stores/dbViewerStore"; import { TooltipProvider } from "../ui/Tooltip"; const defaultProps = { databases: [] as string[], currentDatabase: null as string | null, setCurrentDatabase: () => {}, schemas: [] as string[], currentSchema: null as string | null, setCurrentSchema: () => {}, searchQuery: "", onSearchChange: () => {}, }; describe("DbViewerToolbar", () => { beforeEach(() => { useDbViewerStore.getState().reset(); }); it("renders Tables label", () => { render( , ); expect(screen.getByText("Tables")).toBeInTheDocument(); }); it("renders database dropdown when multiple databases", () => { render( , ); expect(screen.getByText("mydb")).toBeInTheDocument(); }); it("omits bottom padding when nothing is rendered below the title row", () => { const { container } = render( , ); expect(container.firstElementChild!.className).not.toContain("pb-3"); }); it("keeps bottom padding when selectors are rendered below", () => { const { container } = render( , ); expect(container.firstElementChild!.className).toContain("pb-3"); }); it("keeps bottom padding while the search input is open", () => { const { container } = render( , ); fireEvent.click(screen.getByLabelText(/search tables/i)); expect(container.firstElementChild!.className).toContain("pb-3"); }); it("renders refresh and create table buttons", () => { render( , ); expect(screen.getByLabelText(/refresh/i)).toBeInTheDocument(); expect(screen.getByLabelText(/create table/i)).toBeInTheDocument(); }); it("opens a create table form tab when Create Table is clicked", () => { const openFormTab = vi.spyOn(useDbViewerStore.getState(), "openFormTab"); render( , ); fireEvent.click(screen.getByLabelText(/create table/i)); expect(openFormTab).toHaveBeenCalledWith(expect.objectContaining({ kind: "table", mode: "create" })); }); it("shows a disabled schema loading indicator while schema tree is loading", () => { useDbViewerStore.setState({ schemaTreeLoading: true }); render( , ); expect(screen.getByLabelText(/select schema/i)).toBeDisabled(); expect(screen.getByText(/Loading/i)).toBeInTheDocument(); }); it("renders schema options when not loading and multiple schemas exist", () => { useDbViewerStore.setState({ schemaTreeLoading: false }); render( , ); expect(screen.getByText("public")).toBeInTheDocument(); }); });