import React from "react";
import { createSerializer } from "@emotion/jest";
import Popover from "../components/Popover";
import { render, fireEvent } from "@testing-library/react";
expect.addSnapshotSerializer(createSerializer());
const triggerId = "trigger";
describe("Popover", () => {
it("renders a closed dropdown", () => {
const { asFragment } = render(
dropdown content
);
expect(asFragment()).toMatchSnapshot();
});
it("renders an open dropdown", () => {
const { asFragment } = render(
dropdown content
);
expect(asFragment()).toMatchSnapshot();
});
it("renders a dropdown with a max width and max height", () => {
const { asFragment } = render(
dropdown content
);
expect(asFragment()).toMatchSnapshot();
});
it("renders an element passed as to the trigger prop", () => {
const { getByTestId } = render(
Dropdown trigger}>
dropdown content
);
expect(getByTestId(triggerId)).toBeTruthy();
});
it("toggles the dropdown on click", () => {
const { getByTestId } = render(
Dropdown trigger}>
dropdown content
);
const triggerElement = getByTestId(triggerId);
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
fireEvent.click(triggerElement);
expect(triggerElement.getAttribute("aria-expanded")).toBe("true");
fireEvent.click(triggerElement);
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
});
it("opens the dropdown menu when focusing and pressing the spacebar, and closes it on blur", () => {
const { getByTestId } = render(
Dropdown trigger}>
dropdown content
);
const triggerElement = getByTestId(triggerId);
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
triggerElement.focus();
fireEvent.keyDown(triggerElement, {
key: " "
});
expect(triggerElement.getAttribute("aria-expanded")).toBe("true");
triggerElement.blur();
// setTimeout needed because there is a setTimeout in the onBlur handler
setTimeout(() => {
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
}, 0);
});
it("opens the dropdown menu when focusing and pressing the down arrow", () => {
const { getByTestId } = render(
Dropdown trigger}>
dropdown content
);
const triggerElement = getByTestId(triggerId);
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
triggerElement.focus();
fireEvent.keyDown(triggerElement, {
key: "ArrowDown"
});
expect(triggerElement.getAttribute("aria-expanded")).toBe("true");
});
it("closes the dropdown when keying Escape", () => {
const { getByTestId } = render(
Dropdown trigger}>
dropdown content
);
const triggerElement = getByTestId(triggerId);
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
fireEvent.click(triggerElement);
expect(triggerElement.getAttribute("aria-expanded")).toBe("true");
fireEvent.keyDown(triggerElement, {
key: "Escape"
});
// setTimeout needed because there is a setTimeout in the onBlur handler
setTimeout(() => {
expect(triggerElement.getAttribute("aria-expanded")).toBe("false");
}, 0);
});
});