import { createRawSnippet, flushSync } from "svelte"; import { describe, expect, it } from "vitest"; import { Tooltip, tooltip as tooltipAppearance } from "./fixtures/dialog-tooltip-consumer"; import { classes, classesOf, render } from "./mount"; describe("the Base Tooltip", () => { it("opens from keyboard focus and describes an independently named trigger", () => { const root = render(Tooltip, { label: "Copy connection string", content: "Copies the value to your clipboard", children: createRawSnippet(() => ({ render: () => "Copy" })), }); const trigger = root.querySelector("[data-tooltip-trigger]")!; trigger.focus(); flushSync(); const tooltip = document.body.querySelector('[role="tooltip"]')!; expect(trigger.getAttribute("aria-label")).toBe("Copy connection string"); expect(trigger.getAttribute("aria-describedby")).toBe(tooltip.id); expect(tooltip.textContent).toBe("Copies the value to your clipboard"); }); it("dismisses with Escape without moving focus", () => { const root = render(Tooltip, { label: "Database status", content: "Healthy" }); const trigger = root.querySelector("[data-tooltip-trigger]")!; trigger.focus(); flushSync(); trigger.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true })); flushSync(); expect(document.body.querySelector('[role="tooltip"]')).toBeNull(); expect(document.activeElement).toBe(trigger); }); it("opens for a pointer and closes when the pointer leaves", () => { const root = render(Tooltip, { label: "Region help", content: "Choose the nearest region" }); const trigger = root.querySelector("[data-tooltip-trigger]")!; trigger.dispatchEvent(new MouseEvent("mouseenter")); flushSync(); expect(document.body.querySelector('[role="tooltip"]')?.textContent).toBe( "Choose the nearest region", ); trigger.dispatchEvent(new MouseEvent("mouseleave")); flushSync(); expect(document.body.querySelector('[role="tooltip"]')).toBeNull(); }); it("wears its exported token appearance and honors reduced motion", () => { const root = render(Tooltip, { label: "Status help", content: "Updated every minute" }); root.querySelector("[data-tooltip-trigger]")!.focus(); flushSync(); const element = document.body.querySelector('[role="tooltip"]')!; expect(classes(element)).toEqual(classesOf(tooltipAppearance())); expect(classes(element).has("motion-reduce:transition-none")).toBe(true); }); });