import { render, screen, waitFor } from "@testing-library/react";
import { userEvent } from "@testing-library/user-event";
import { NavigationMenuRoot } from "./NavigationMenuRoot";
import { NavigationMenuList } from "./NavigationMenuList";
import { NavigationMenuItem } from "./NavigationMenuItem";
import { NavigationMenuTrigger } from "./NavigationMenuTrigger";
import { NavigationMenuContent } from "./NavigationMenuContent";
describe("NavigationMenuContent", () => {
test("renders visibly into the document", () => {
const testText = "Test Text";
render(
{testText}
);
expect(screen.getByText(testText)).toBeVisible();
});
test("shows popper on hover", () => {
render(
Trigger
);
userEvent.hover(screen.getByRole("button"));
const content = screen.getByTestId("wpds-nav-menu-content-popper");
expect(content).toBeVisible();
});
test("accepts a ref", () => {
const testRef = { current: null };
render(
);
expect(testRef.current).toBeInTheDocument();
});
test("accepts a function ref", () => {
const funcRef = jest.fn();
render(
);
expect(funcRef).toHaveBeenCalled();
});
describe("uses the side prop", () => {
test("bottom", async () => {
const testText = "Test Text";
render(
Trigger
{testText}
);
userEvent.hover(screen.getByRole("button"));
const content = screen.getByText(testText);
expect(content).toHaveStyle("--initialposition: 0, -0.25rem");
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual(
"bottom-start"
);
});
});
test("top", async () => {
const testText = "Test Text";
render(
Trigger
{testText}
);
userEvent.hover(screen.getByRole("button"));
const content = screen.getByText(testText);
expect(content).toHaveStyle("--initialposition: 0, 0.25rem");
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual(
"top-start"
);
});
});
test("left", async () => {
const testText = "Test Text";
render(
Trigger
{testText}
);
userEvent.hover(screen.getByRole("button"));
const content = screen.getByText(testText);
expect(content).toHaveStyle("--initialposition: 0.25rem, 0");
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual(
"left-start"
);
});
});
test("right", async () => {
const testText = "Test Text";
render(
Trigger
{testText}
);
userEvent.hover(screen.getByRole("button"));
const content = screen.getByText(testText);
expect(content).toHaveStyle("--initialposition: -0.25rem, 0");
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual(
"right-start"
);
});
});
});
describe("uses the align prop", () => {
test("start", async () => {
render(
Trigger
);
userEvent.hover(screen.getByRole("button"));
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual(
"bottom-start"
);
});
});
test("center", async () => {
render(
Trigger
);
userEvent.hover(screen.getByRole("button"));
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual("bottom");
});
});
test("end", async () => {
render(
Trigger
);
userEvent.hover(screen.getByRole("button"));
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper.getAttribute("data-popper-placement")).toEqual(
"bottom-end"
);
});
});
});
test("accepts popperOptions", async () => {
render(
Trigger
);
userEvent.hover(screen.getByRole("button"));
const popper = screen.getByTestId("wpds-nav-menu-content-popper");
await waitFor(() => {
// eslint-disable-next-line jest-dom/prefer-to-have-attribute
expect(popper).toHaveStyle("transform: translate(0px, 16px)");
});
});
});