import {
render,
screen,
waitFor,
waitForElementToBeRemoved,
} from "@testing-library/react";
import React from "react";
import userEvent from "@testing-library/user-event";
import { fireEvent } from "@testing-library/dom";
import { Tooltip } from ":/components/Tooltip/index";
import { Button } from ":/components/Button";
describe("", () => {
it("appear on button hover and then disappear", async () => {
render(
);
const button = screen.getByRole("button");
expect(screen.queryByText("Hi there")).not.toBeInTheDocument();
const user = userEvent.setup();
fireEvent.mouseMove(document.body);
await user.hover(button);
expect(await screen.findByText("Hi there")).toBeInTheDocument();
await user.unhover(button);
await waitForElementToBeRemoved(screen.queryByText("Hi there"));
});
it("appear on button focus and then disappear", async () => {
render(
);
expect(screen.queryByText("Hi there")).not.toBeInTheDocument();
const user = userEvent.setup();
await user.tab();
expect(await screen.findByText("Hi there")).toBeInTheDocument();
await user.tab();
await waitForElementToBeRemoved(screen.queryByText("Hi there"));
});
it("sets entering and exiting class", async () => {
render(
);
expect(screen.queryByText("Hi there")).not.toBeInTheDocument();
const user = userEvent.setup();
const button = screen.getByRole("button");
fireEvent.mouseMove(document.body);
await user.hover(button);
// Make sure the tooltip is entering.
await waitFor(() => {
const tooltip = document.querySelector(".c__tooltip");
expect(tooltip).toHaveClass("c__tooltip--entering");
expect(tooltip).not.toHaveClass("c__tooltip--exiting");
});
// Make sure the entering class is removed and the exiting class is not added yet.
await waitFor(() => {
const tooltip = document.querySelector(".c__tooltip");
expect(tooltip).not.toHaveClass("c__tooltip--entering");
expect(tooltip).not.toHaveClass("c__tooltip--exiting");
});
await user.unhover(button);
// Make sure the tooltip is exiting.
await waitFor(() => {
const tooltip = document.querySelector(".c__tooltip");
expect(tooltip).not.toHaveClass("c__tooltip--entering");
expect(tooltip).toHaveClass("c__tooltip--exiting");
});
// Make sure the tooltip is removed.
await waitForElementToBeRemoved(document.querySelector(".c__tooltip"));
});
it("works with HTML", async () => {
render(
Title
Description
>
}
closeDelay={0}
>
);
const button = screen.getByRole("button");
expect(screen.queryByText("Hi there")).not.toBeInTheDocument();
const user = userEvent.setup();
fireEvent.mouseMove(document.body);
await user.hover(button);
await screen.findByRole("heading", { name: "Title" });
await screen.findByText("Description");
});
it("renders with className", async () => {
render(
Title
Description
>
}
closeDelay={0}
className="my-custom-class"
>
);
const button = screen.getByRole("button");
expect(screen.queryByText("Hi there")).not.toBeInTheDocument();
const user = userEvent.setup();
fireEvent.mouseMove(document.body);
await user.hover(button);
await waitFor(() => {
const tooltip = document.querySelector(".c__tooltip");
expect(tooltip).toHaveClass("my-custom-class");
});
});
});