import React from "react"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { DropdownMenu, DropdownSection, DropdownMenuItem } from ".."; describe("Dropdown", () => { it("renders a closed dropdown", () => { const { baseElement } = render( Edit Scale Restart Stop ); expect(baseElement).toMatchSnapshot(); }); it("renders an open dropdown", () => { const { baseElement } = render( Edit Scale Restart Stop ); expect(baseElement).toMatchSnapshot(); }); it("renders a dropdown with a max height", () => { const { baseElement } = render( Edit Scale Restart Stop ); expect(baseElement).toMatchSnapshot(); }); it("renders an open dropdown with multiple sections", () => { const { baseElement } = render( Edit Scale Restart Restart Delay Pause Stop ); expect(baseElement).toMatchSnapshot(); }); it("renders an element passed as trigger prop", () => { render( Dropdown trigger}> Edit Scale Restart Stop ); const trigger = screen.queryByText(/dropdown trigger/i); expect(trigger).toBeTruthy(); }); it("toggles menu by clicking twice", async () => { const user = userEvent.setup(); render( Dropdown trigger}> Edit Scale Restart Stop ); const trigger = screen.getByText(/dropdown trigger/i); expect(screen.queryByText(/edit/i)).toBeFalsy(); await user.click(trigger); expect(screen.queryByText(/edit/i)).toBeTruthy(); await user.click(trigger); expect(screen.queryByText(/edit/i)).toBeFalsy(); }); it("toggles menu by pressing the spacebar twice", async () => { const user = userEvent.setup(); render( Dropdown trigger}> Edit Scale Restart Stop ); const trigger = screen.getByText(/dropdown trigger/i); expect(screen.queryByText(/edit/i)).toBeFalsy(); // click to focus, then space to close menu await user.click(trigger); await user.keyboard(" "); await user.keyboard(" "); expect(screen.queryByText(/edit/i)).toBeTruthy(); await user.keyboard(" "); expect(screen.queryByText(/edit/i)).toBeFalsy(); }); it("selects first item and passes it's value to onSelect", async () => { const user = userEvent.setup(); const onSelectFn = jest.fn(); render( Dropdown trigger}> Edit Scale Restart Stop ); const trigger = screen.getByText(/dropdown trigger/i); expect(onSelectFn).not.toHaveBeenCalled(); await user.click(trigger); await user.keyboard("{ArrowDown}"); await user.keyboard("{Enter}"); // using `expect.anything()` because the second parameter is an object // that comes from Downshift, and there's no good way to know exactly // what to expect expect(onSelectFn).toHaveBeenCalledWith("edit", expect.anything()); }); it("calls onSelect prop with the selected value", async () => { const user = userEvent.setup(); const onSelectFn = jest.fn(); render( Dropdown trigger}> Edit Scale Restart Stop ); const trigger = screen.getByText(/dropdown trigger/i); expect(onSelectFn).not.toHaveBeenCalled(); await user.click(trigger); await user.keyboard("{ArrowDown}"); await user.keyboard("{Enter}"); // using `expect.anything()` because the second parameter is an object // that comes from Downshift, and there's no good way to know exactly // what to expect expect(onSelectFn).not.toHaveBeenCalledWith("edit", expect.anything()); expect(onSelectFn).toHaveBeenCalled(); }); });