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