import "@testing-library/jest-dom";
import { fireEvent, render, screen } from "@testing-library/react";
import Popover from "./Popover";
const trigger = ;
describe("Popover", () => {
test("renders the trigger element", () => {
render(Body
} />);
expect(screen.getByRole("button", { name: "Open" })).toBeInTheDocument();
});
test("popover dialog is not visible initially", () => {
render(Body} />);
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
test("clicking the trigger opens the popover", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByRole("dialog")).toBeInTheDocument();
});
test("clicking the trigger again closes the popover", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
test("renders the content in the popover body", () => {
render(Popover content} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByText("Popover content")).toBeInTheDocument();
});
test("renders the title when provided", () => {
render(
Body} title="Settings" />,
);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByText("Settings")).toBeInTheDocument();
});
test("does not render the title element when title is omitted", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(
screen.queryByRole("dialog")?.querySelector(".popover-title"),
).not.toBeInTheDocument();
});
test("close button closes the popover", () => {
render(
Body} title="Settings" />,
);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
fireEvent.click(screen.getByRole("button", { name: "Close" }));
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
test("Escape key closes the popover", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
fireEvent.keyDown(document, { key: "Escape" });
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
test("clicking outside closes the popover", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
fireEvent.mouseDown(document.body);
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
test("trigger has aria-expanded false when closed", () => {
render(Body} />);
expect(screen.getByRole("button", { name: "Open" })).toHaveAttribute(
"aria-expanded",
"false",
);
});
test("trigger has aria-expanded true when open", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByRole("button", { name: "Open" })).toHaveAttribute(
"aria-expanded",
"true",
);
});
test("trigger has aria-haspopup set to dialog", () => {
render(Body} />);
expect(screen.getByRole("button", { name: "Open" })).toHaveAttribute(
"aria-haspopup",
"dialog",
);
});
test("applies the correct position class", () => {
render(
Body} position="right" />,
);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByRole("dialog")).toHaveClass("popover-right");
});
test("defaults to the bottom position", () => {
render(Body} />);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByRole("dialog")).toHaveClass("popover-bottom");
});
test("applies an additional className to the popover", () => {
render(
Body}
className="custom-popover"
/>,
);
fireEvent.click(screen.getByRole("button", { name: "Open" }));
expect(screen.getByRole("dialog")).toHaveClass("popover", "custom-popover");
});
});