mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-15 02:11:05 +00:00
test(context-menu): add unit tests
This commit is contained in:
parent
7c916828f2
commit
b3816606f6
3 changed files with 137 additions and 58 deletions
108
tests/ContextMenu/ContextMenu.test.ts
Normal file
108
tests/ContextMenu/ContextMenu.test.ts
Normal file
|
@ -0,0 +1,108 @@
|
|||
import { render, screen } from "@testing-library/svelte";
|
||||
import { user } from "../setup-tests";
|
||||
import ContextMenu from "./ContextMenu.test.svelte";
|
||||
|
||||
describe("ContextMenu", () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it("should render with default props", () => {
|
||||
render(ContextMenu);
|
||||
|
||||
const target = screen.getByTestId("target");
|
||||
expect(target).toBeInTheDocument();
|
||||
expect(target).toHaveTextContent("Right click me");
|
||||
|
||||
const menu = screen.getAllByRole("menu");
|
||||
expect(menu[0]).toBeInTheDocument();
|
||||
expect(menu[0]).toHaveClass("bx--menu");
|
||||
});
|
||||
|
||||
it("should render menu options", () => {
|
||||
render(ContextMenu);
|
||||
|
||||
const options = screen.getAllByRole("menuitem");
|
||||
expect(options).toHaveLength(2);
|
||||
expect(options[0]).toHaveTextContent("Option 1");
|
||||
expect(options[1]).toHaveTextContent("Option 2");
|
||||
});
|
||||
|
||||
it("should open on right click", async () => {
|
||||
const consoleLog = vi.spyOn(console, "log");
|
||||
render(ContextMenu);
|
||||
|
||||
const target = screen.getByTestId("target");
|
||||
await user.pointer({ target, keys: "[MouseRight]" });
|
||||
expect(consoleLog).toHaveBeenCalledWith("open", expect.any(HTMLElement));
|
||||
});
|
||||
|
||||
it("should close on escape key", async () => {
|
||||
const consoleLog = vi.spyOn(console, "log");
|
||||
render(ContextMenu, { props: { open: true } });
|
||||
|
||||
await user.keyboard("{Escape}");
|
||||
expect(consoleLog).toHaveBeenCalledWith("close");
|
||||
});
|
||||
|
||||
it("should close on click outside", async () => {
|
||||
const consoleLog = vi.spyOn(console, "log");
|
||||
render(ContextMenu, { props: { open: true } });
|
||||
|
||||
await user.click(document.body);
|
||||
expect(consoleLog).toHaveBeenCalledWith("close");
|
||||
});
|
||||
|
||||
it("should handle keyboard navigation", async () => {
|
||||
render(ContextMenu, { props: { open: true } });
|
||||
|
||||
const menu = screen.getAllByRole("menu")[0];
|
||||
menu.focus();
|
||||
|
||||
// Arrow down
|
||||
await user.keyboard("{ArrowDown}");
|
||||
const options = screen.getAllByRole("menuitem");
|
||||
expect(options[0].parentElement).toHaveFocus();
|
||||
|
||||
// Arrow up
|
||||
await user.keyboard("{ArrowUp}");
|
||||
expect(options[1].parentElement).toHaveFocus();
|
||||
});
|
||||
|
||||
it("should handle custom target", async () => {
|
||||
const consoleLog = vi.spyOn(console, "log");
|
||||
render(ContextMenu);
|
||||
|
||||
const target = screen.getByTestId("target");
|
||||
await user.pointer({ target, keys: "[MouseRight]" });
|
||||
expect(consoleLog).toHaveBeenCalledWith("open", target);
|
||||
});
|
||||
|
||||
it("should handle custom position", () => {
|
||||
render(ContextMenu, {
|
||||
props: {
|
||||
open: true,
|
||||
x: 100,
|
||||
y: 200,
|
||||
},
|
||||
});
|
||||
|
||||
const menu = screen.getAllByRole("menu")[0];
|
||||
expect(menu).toHaveStyle({
|
||||
left: "100px",
|
||||
top: "200px",
|
||||
});
|
||||
});
|
||||
|
||||
it("should handle nested menus", async () => {
|
||||
render(ContextMenu, { props: { open: true } });
|
||||
|
||||
const menus = screen.getAllByRole("menu");
|
||||
expect(menus[0]).toHaveAttribute("data-level", "1");
|
||||
|
||||
// Simulate nested menu
|
||||
const nestedMenu = document.createElement("ul");
|
||||
nestedMenu.setAttribute("data-level", "2");
|
||||
menus[0].appendChild(nestedMenu);
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue