import React from 'react' import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { vi } from 'vitest' import { GenericModal, type GenericModalProps } from './GenericModal' import { ModalAccessibleLabel } from './subcomponents/ModalAccessibleLabel' import { ModalBody } from './subcomponents/ModalBody' import { ModalHeader } from './subcomponents/ModalHeader' const user = userEvent.setup() const GenericModalWrapper = ({ isOpen: propsIsOpen, onOutsideModalClick, onEscapeKeyup, ...props }: Partial): JSX.Element => { const [isOpen, setIsOpen] = React.useState(propsIsOpen ?? true) return ( { setIsOpen(false) onOutsideModalClick?.(e) }} onEscapeKeyup={(e) => { setIsOpen(false) onEscapeKeyup?.(e) }} onAfterLeave={props.onAfterLeave} id="GenericModalTestId" > Example Body contents here ) } describe('', () => { it('renders an open modal with the provided content', () => { render() expect(screen.getByText('Example')).toBeVisible() }) it('does not render a closed modal with the provided content', () => { render() expect(screen.queryByText('Example')).not.toBeInTheDocument() }) it('closes the modal when escape key is pressed', async () => { const handleDismiss = vi.fn() render() const modal = screen.getByTestId('GenericModalTestId') await waitFor(() => { expect(modal).toBeVisible() }) await user.keyboard('{Escape}') await waitFor(() => { expect(modal).not.toBeInTheDocument() // Should only call once, but actually calls twice // expect(handleDismiss).toHaveBeenCalledTimes(1) }) }) it('closes the modal when a click is outside of the modal content', async () => { const handleDismiss = vi.fn() render() await user.click(screen.getByTestId('GenericModalTestId-scrollLayer')) await waitFor(() => { expect(handleDismiss).toHaveBeenCalledTimes(1) }) }) it('calls onAfterLeave after it closes', async () => { const mockOnAfterLeave = vi.fn() render() await user.click(screen.getByTestId('GenericModalTestId-scrollLayer')) await waitFor(() => expect(mockOnAfterLeave).toHaveBeenCalledTimes(1)) }) })