import { fireEvent, render, screen } from "@solidjs/testing-library"; import { describe, expect, it, vi } from "vitest"; import { DropdownMenu } from "../../../src/components/dropdown-menu/index"; describe("DropdownMenu — rendering", () => { it("content has role=menu when open", () => { render(() => ( Actions Edit )); expect(screen.getByRole("menu")).toBeTruthy(); }); it("items have role=menuitem", () => { render(() => ( Actions Edit Delete )); expect(screen.getAllByRole("menuitem")).toHaveLength(2); }); it("trigger has correct ARIA", () => { render(() => ( Actions Edit )); const trigger = screen.getByText("Actions"); expect(trigger.getAttribute("aria-haspopup")).toBe("menu"); expect(trigger.getAttribute("aria-expanded")).toBe("false"); }); }); describe("DropdownMenu — interactions", () => { it("click trigger opens", () => { render(() => ( Actions Edit )); expect(screen.queryByRole("menu")).toBeNull(); fireEvent.click(screen.getByText("Actions")); expect(screen.getByRole("menu")).toBeTruthy(); }); it("Escape closes", () => { render(() => ( Actions Edit )); fireEvent.keyDown(screen.getByRole("menu"), { key: "Escape" }); expect(screen.queryByRole("menu")).toBeNull(); }); it("item click activates and closes", () => { const onSelect = vi.fn(); render(() => ( Actions Edit )); fireEvent.click(screen.getByRole("menuitem")); expect(onSelect).toHaveBeenCalled(); expect(screen.queryByRole("menu")).toBeNull(); }); }); describe("DropdownMenu — keyboard navigation", () => { it("Enter activates item", () => { const onSelect = vi.fn(); render(() => ( Actions Edit )); const menu = screen.getByRole("menu"); fireEvent.keyDown(menu, { key: "ArrowDown" }); fireEvent.keyDown(menu, { key: "Enter" }); expect(onSelect).toHaveBeenCalled(); }); it("ArrowDown navigates", () => { render(() => ( Actions Edit Delete )); const menu = screen.getByRole("menu"); fireEvent.keyDown(menu, { key: "ArrowDown" }); const items = screen.getAllByRole("menuitem"); expect(items[0].getAttribute("data-highlighted")).toBe(""); }); }); describe("DropdownMenu — checkbox and radio items", () => { it("CheckboxItem toggles", () => { const onChange = vi.fn(); render(() => ( Actions Bookmark )); fireEvent.click(screen.getByRole("menuitemcheckbox")); expect(onChange).toHaveBeenCalledWith(true); }); it("RadioItem selects", () => { const onChange = vi.fn(); render(() => ( Actions List Grid )); fireEvent.click(screen.getAllByRole("menuitemradio")[1]); expect(onChange).toHaveBeenCalledWith("grid"); }); });