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