import { fireEvent, render, screen } from "@solidjs/testing-library"; import { describe, expect, it, vi } from "vitest"; import { ContextMenu } from "../../../src/components/context-menu/index"; describe("ContextMenu — open/close and roles", () => { it("right-click opens menu", () => { render(() => (
Right click me
Edit Delete
)); expect(screen.queryByRole("menu")).toBeNull(); fireEvent.contextMenu(screen.getByTestId("area")); expect(screen.getByRole("menu")).toBeTruthy(); }); it("content has role=menu", () => { render(() => (
Area
Edit
)); expect(screen.getByRole("menu")).toBeTruthy(); }); it("items have role=menuitem", () => { render(() => (
Area
Edit Delete
)); expect(screen.getAllByRole("menuitem")).toHaveLength(2); }); it("trigger area does NOT have aria-haspopup", () => { render(() => (
Area
Edit
)); expect(screen.getByTestId("area").getAttribute("aria-haspopup")).toBeNull(); }); }); describe("ContextMenu — keyboard navigation", () => { it("Enter activates item", () => { const onSelect = vi.fn(); render(() => (
Area
Edit
)); const menu = screen.getByRole("menu"); fireEvent.keyDown(menu, { key: "ArrowDown" }); fireEvent.keyDown(menu, { key: "Enter" }); expect(onSelect).toHaveBeenCalled(); }); it("Escape closes", () => { render(() => (
Area
Edit
)); fireEvent.keyDown(screen.getByRole("menu"), { key: "Escape" }); expect(screen.queryByRole("menu")).toBeNull(); }); it("ArrowDown navigates items", () => { render(() => (
Area
Edit Delete
)); const menu = screen.getByRole("menu"); fireEvent.keyDown(menu, { key: "ArrowDown" }); expect(screen.getAllByRole("menuitem")[0].getAttribute("data-highlighted")).toBe(""); }); });