import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; import { Tooltip, TooltipArrow, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip"; describe("Tooltip", () => { it("shows and hides tooltip content around hover", async () => { const user = userEvent.setup(); render( Help Helpful context ); await user.hover(screen.getByRole("button", { name: "Help" })); const tooltip = await screen.findByRole("tooltip"); const content = tooltip.closest('[data-slot="content"]'); expect(content).toHaveAttribute("data-size", "lg"); expect(document.querySelector('[data-slot="arrow"]')).toBeInTheDocument(); await user.unhover(screen.getByRole("button", { name: "Help" })); await waitFor(() => { expect(screen.queryByRole("tooltip")).not.toBeInTheDocument(); }); }); it("reports controlled open changes from the trigger", async () => { const user = userEvent.setup(); const onOpenChange = vi.fn(); render( Help Helpful context ); await user.hover(screen.getByRole("button", { name: "Help" })); await waitFor(() => { expect(onOpenChange).toHaveBeenCalledWith(true); }); }); it("shows tooltip content on focus and hides it on blur", async () => { render( Focus help Focus context ); const trigger = screen.getByRole("button", { name: "Focus help" }); trigger.focus(); const tooltip = await screen.findByRole("tooltip"); expect(tooltip).toHaveTextContent("Focus context"); expect(trigger).toHaveFocus(); trigger.blur(); await waitFor(() => { expect(screen.queryByRole("tooltip")).not.toBeInTheDocument(); }); }); });