import {
fireEvent,
render,
screen,
createEvent,
act,
} from "@testing-library/react";
import { Select } from "../../components/Select/Select";
import { SelectItem } from "../../components/Select/SelectItem";
import { axe } from "jest-axe";
describe("Select", () => {
test("Should render component correctly.", () => {
const { container } = render(
);
expect(container.firstChild).toMatchSnapshot();
});
});
describe("Accessibility", () => {
test("Should have no accessibility violations.", async () => {
const { container } = render(
);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
});
describe("Interaction", () => {
test("Should open SelectContainer on icon click.", () => {
render(
);
act(() => screen.getByRole("button").click());
expect(screen.getByText("30")).toBeInTheDocument();
act(() => screen.getByRole("listitem").click());
});
test("Should open SelectContainer on placeholder click.", () => {
render(
);
act(() => screen.getByText("Placeholder").click());
});
test("Should close SelectConatiner on label click.", () => {
render(
);
screen.getAllByText("30")[0].click();
});
test("Should close Select on click outside.", () => {
render(
);
fireEvent.mouseDown(document.body);
});
test("Should trigger onClose on Escape key down.", () => {
const onClose = jest.fn();
render(
);
fireEvent.keyDown(document.body, { key: "Escape" });
expect(onClose).toHaveBeenCalledTimes(1);
});
test("Should trigger key down events correctly.", () => {
const onClose = jest.fn();
render(
);
const selectItem = screen.getAllByRole("listitem")[0];
const spaceEvent = createEvent.keyDown(selectItem, {
code: "Space",
});
fireEvent(selectItem, spaceEvent);
expect(onClose).toHaveBeenCalledTimes(1);
const arrowUpEvent = createEvent.keyDown(selectItem, {
code: "ArrowUp",
});
fireEvent(selectItem, arrowUpEvent);
expect(onClose).toHaveBeenCalledTimes(1);
const arrowDownEvent = createEvent.keyDown(selectItem, {
code: "ArrowDown",
});
fireEvent(selectItem, arrowDownEvent);
expect(onClose).toHaveBeenCalledTimes(1);
});
test("Should focus select items correctly.", () => {
render(
);
const firstItem = screen.getAllByRole("listitem")[0];
const secondItem = screen.getAllByRole("listitem")[1];
expect(firstItem).toHaveFocus();
const event1 = createEvent.keyDown(firstItem, {
code: "ArrowDown",
});
fireEvent(firstItem, event1);
expect(secondItem).toHaveFocus();
const event2 = createEvent.keyDown(secondItem, {
code: "ArrowDown",
});
fireEvent(secondItem, event2);
expect(firstItem).toHaveFocus();
const event3 = createEvent.keyDown(firstItem, {
code: "ArrowUp",
});
fireEvent(firstItem, event3);
expect(secondItem).toHaveFocus();
const event4 = createEvent.keyDown(secondItem, {
code: "ArrowUp",
});
fireEvent(secondItem, event4);
expect(firstItem).toHaveFocus();
});
});
describe("Props", () => {
test("Should render children correctly.", () => {
render(
);
expect(screen.getByRole("listbox")).not.toHaveTextContent("40");
});
test("Should render label correctly.", () => {
render(
);
expect(screen.getByText("Select")).toBeInTheDocument();
});
test("Should render correct Chevron when open.", () => {
render(
);
expect(screen.getByLabelText("Chevron Up")).toBeInTheDocument();
});
test("Should render correct Chevron when closed.", () => {
render(
);
expect(screen.getByLabelText("Chevron Down")).toBeInTheDocument();
});
});