import "@testing-library/jest-dom"; import { fireEvent, render, screen } from "@testing-library/react"; import Modal from "./Modal"; beforeAll(() => { HTMLDialogElement.prototype.showModal = vi.fn(function ( this: HTMLDialogElement, ) { this.open = true; }); HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) { this.open = false; }); }); describe("Modal", () => { test("renders the title when open", () => { render( {}} />); expect(screen.getByText("Test Modal")).toBeInTheDocument(); }); test("renders children in the modal body", () => { render( {}}>

Modal content

, ); expect(screen.getByText("Modal content")).toBeInTheDocument(); }); test("calls showModal when isOpen is true", () => { render( {}} />); expect(HTMLDialogElement.prototype.showModal).toHaveBeenCalledTimes(1); }); test("calls close when isOpen transitions to false", () => { const { rerender } = render( {}} />, ); rerender( {}} />); expect(HTMLDialogElement.prototype.close).toHaveBeenCalledTimes(1); }); test("calls onClose when the close button is clicked", () => { const handleClose = vi.fn(); render(); fireEvent.click(screen.getByRole("button", { name: /close/i })); expect(handleClose).toHaveBeenCalledTimes(1); }); test("renders the footer when provided", () => { render( {}} footer={} />, ); expect(screen.getByText("Confirm")).toBeInTheDocument(); }); test("does not render the footer element when footer prop is omitted", () => { const { container } = render( {}} />, ); expect(container.querySelector(".modal-footer")).not.toBeInTheDocument(); }); test("calls onClose when the backdrop (dialog element) is clicked", () => { const handleClose = vi.fn(); const { container } = render( , ); const dialog = container.querySelector("dialog"); fireEvent.click(dialog as Element, { target: dialog }); expect(handleClose).toHaveBeenCalledTimes(1); }); test("does not call onClose when content inside the modal is clicked", () => { const handleClose = vi.fn(); render(

Inner content

, ); fireEvent.click(screen.getByText("Inner content")); expect(handleClose).not.toHaveBeenCalled(); }); test("renders a close button with an accessible label", () => { render( {}} />); expect(screen.getByRole("button", { name: /close/i })).toBeInTheDocument(); }); });