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");
});
});