UNPKG

monday-ui-react-core

Version:

Official monday.com UI resources for application development in React.js

175 lines (152 loc) • 6.63 kB
import React from "react"; import { render, cleanup, fireEvent } from "@testing-library/react"; import { ModalHeader } from "../../../components"; import { ModalExampleWrapper } from "../__stories__/Modal.stories.helpers"; import { ComponentDefaultTestId } from "../../../tests/test-ids-utils"; const MODAL_TITLE_TEXT = "Modal title"; const MODAL_ID = "story-book-modal"; const MODAL_TEST_ID = "modal-test-id"; const CLOSE_BUTTON_LABEL = "close"; const OPEN_BUTTON_TEXT = "Open"; const ModalManager = props => { const { children, openOnStart = false, isAlertDialog = false, title } = props; return ( <ModalExampleWrapper buttonTitle="Open" show={openOnStart} id={MODAL_ID} data-testid={MODAL_TEST_ID} title={title || MODAL_TITLE_TEXT} alertDialog={isAlertDialog} openModalTestId={OPEN_BUTTON_TEXT} > {children} </ModalExampleWrapper> ); }; const getOpenButton = component => component.getByText(OPEN_BUTTON_TEXT); const findModal = component => component.findByRole("dialog"); const queryModal = component => component.queryByRole("dialog"); const queryClosedModal = component => component.queryByTestId(MODAL_TEST_ID); const queryAlertModal = component => component.queryByRole("alertdialog"); const findCloseButton = component => component.findByLabelText(CLOSE_BUTTON_LABEL); const queryCloseButton = component => component.queryByLabelText(CLOSE_BUTTON_LABEL); const findOverlay = component => component.findByTestId(ComponentDefaultTestId.MODAL_OVERLAY); const renderComponent = (props = {}) => { const { content } = props; return render(<ModalManager {...props}>{content ? content : <div>content of the modal</div>}</ModalManager>); }; describe("Modal tests", () => { afterEach(() => { cleanup(); }); describe("open", () => { it("should open when triggered", async () => { const component = renderComponent({ openOnStart: false }); const openButton = getOpenButton(component); fireEvent.click(openButton); expect(await findModal(component)).toBeInTheDocument(); }); it("should open on start if show=true", async () => { const component = renderComponent({ openOnStart: true }); expect(await findModal(component)).toBeInTheDocument(); }); }); describe("close", () => { it("should close when clicking on close button", async () => { const component = renderComponent({ openOnStart: true }); fireEvent.click(await findCloseButton(component)); expect(queryModal(component)).not.toBeInTheDocument(); }); it("should close when clicking on the modal overlay", async () => { const component = renderComponent({ openOnStart: true }); fireEvent.click(await findOverlay(component)); expect(queryModal(component)).not.toBeInTheDocument(); }); it("should close when clicking on the esc key", async () => { const component = renderComponent({ openOnStart: true }); fireEvent.keyDown(queryModal(component), { key: "Escape", code: "Escape" }); expect(queryModal(component)).not.toBeInTheDocument(); }); it("should NOT close on Esc or overlay click if alertDialog = true", async () => { const component = renderComponent({ openOnStart: true, isAlertDialog: true }); fireEvent.keyDown(queryAlertModal(component), { key: "Escape", code: "Escape" }); fireEvent.click(await findOverlay(component)); expect(queryAlertModal(component)).toBeInTheDocument(); }); }); describe("accessibility", () => { describe("container", () => { it("should have relevant aria attributes when shown", () => { const component = renderComponent({ openOnStart: true }); const modal = queryModal(component); expect(modal).toHaveAttribute("id"); expect(modal).toHaveAttribute("aria-modal"); expect(modal).toHaveAttribute("aria-labelledby"); expect(modal).not.toHaveAttribute("aria-hidden"); expect(modal.getAttribute("role")).toMatch("dialog"); }); it("should have relevant aria attributes when hidden", () => { const component = renderComponent(); const modal = queryClosedModal(component); expect(modal).toHaveAttribute("id"); expect(modal).toHaveAttribute("aria-modal"); expect(modal).toHaveAttribute("aria-labelledby"); expect(modal).toHaveAttribute("aria-hidden"); expect(modal.getAttribute("role")).toEqual("dialog"); }); it("should have relevant aria attributes when in alert mode", () => { const component = renderComponent({ isAlertDialog: true }); const modal = queryClosedModal(component); expect(modal.getAttribute("role")).toEqual("alertdialog"); }); }); describe("modal", () => { it("should have relevant attributes", function () { const component = renderComponent(); const title = component.queryByText(MODAL_TITLE_TEXT); expect(title).toHaveAttribute("id"); }); }); describe("title", () => { it("should have relevant attributes", function () { const component = renderComponent({ openOnStart: true }); const title = component.queryByRole("document"); expect(title).toBeInTheDocument(); }); }); describe("close button", () => { it("should have relevant attributes", function () { const component = renderComponent({ openOnStart: true }); const closeButton = queryCloseButton(component); expect(closeButton).toHaveAttribute("aria-label"); }); }); }); describe("rendering", () => { it("should render a title if the title prop is provided", () => { const TEST_TITLE = "test title"; const component = renderComponent({ openOnStart: true, title: TEST_TITLE }); const title = component.queryByText(TEST_TITLE); expect(title).toBeInTheDocument(); }); it("should render ModalHeader if passed as children", () => { const TEST_TITLE = "test title"; const component = renderComponent({ openOnStart: true, content: <ModalHeader title={TEST_TITLE} /> }); const title = component.queryByText(TEST_TITLE); expect(title).toBeInTheDocument(); }); it("should render ModalHeader if passed as children", () => { const TEST_TITLE = "test title"; const component = renderComponent({ openOnStart: true, content: <ModalHeader title={TEST_TITLE} /> }); const title = component.queryByText(TEST_TITLE); expect(title).toBeInTheDocument(); }); }); });