// card.test.jsimport React from "react";import { render, unmountComponentAtNode } from "react-dom";import { act } from "react-dom/test-utils";import Card from "./card";let container = null;beforeEach(() => { // setup a DOM element as a render target
container = document.createElement("div");
document.body.appendChild(container);
jest.useFakeTimers();});afterEach(() => { // cleanup on exiting
unmountComponentAtNode(container);
container.remove();
container = null;
jest.useRealTimers();});it("should select null after timing out", () => {
const onSelect = jest.fn();
act(() => {
render(, container);
}); // move ahead in time by 100ms
act(() => {
jest.advanceTimersByTime(100);
});
expect(onSelect).not.toHaveBeenCalled(); // and then move ahead by 5 seconds
act(() => {
jest.advanceTimersByTime(5000);
});
expect(onSelect).toHaveBeenCalledWith(null);});it("should cleanup on being removed", () => {
const onSelect = jest.fn();
act(() => {
render(, container);
});
act(() => {
jest.advanceTimersByTime(100);
});
expect(onSelect).not.toHaveBeenCalled(); // unmount the app
act(() => {
render(null, container);
});
act(() => {
jest.advanceTimersByTime(5000);
});
expect(onSelect).not.toHaveBeenCalled();});it("should accept selections", () => {
const onSelect = jest.fn();
act(() => {
render(, container);
});
act(() => {
container
.querySelector("[data-testid='2']")
.dispatchEvent(new MouseEvent("click", { bubbles: true }));
});
expect(onSelect).toHaveBeenCalledWith(2);});