import { fireEvent, render, screen } from '@testing-library/react' import Modal from '../modal' describe('Modal Component', () => { const defaultProps = { title: 'Test Modal', onClose: vi.fn(), onConfirm: vi.fn(), onCancel: vi.fn(), } beforeEach(() => { vi.clearAllMocks() }) describe('Render', () => { it('renders correctly with title and children', () => { render(
Child Content
, ) expect(screen.getByText('Test Modal')).toBeInTheDocument() expect(screen.getByTestId('modal-child')).toBeInTheDocument() expect(screen.getByText(/cancel/i)).toBeInTheDocument() expect(screen.getByText(/save/i)).toBeInTheDocument() }) it('renders subTitle when provided', () => { render() expect(screen.getByText('Test Subtitle')).toBeInTheDocument() }) it('renders and handles extra button', () => { const onExtraClick = vi.fn() render( , ) const extraBtn = screen.getByText('Extra Action') expect(extraBtn).toBeInTheDocument() fireEvent.click(extraBtn) expect(onExtraClick).toHaveBeenCalledTimes(1) }) it('renders md size class and default extra button label', () => { const { container } = render( , ) expect(screen.getByText(/remove/i)).toBeInTheDocument() expect(container.querySelector('.w-\\[640px\\]')).toBeInTheDocument() }) it('renders footerSlot and bottomSlot', () => { render( Footer} bottomSlot={
Bottom
} />, ) expect(screen.getByTestId('footer-slot')).toBeInTheDocument() expect(screen.getByTestId('bottom-slot')).toBeInTheDocument() }) }) describe('Interactions', () => { it('calls onClose when close icon is clicked', () => { render() const closeIcon = screen.getByTestId('close-icon').parentElement fireEvent.click(closeIcon!) expect(defaultProps.onClose).toHaveBeenCalledTimes(1) }) it('calls onConfirm when confirm button is clicked', () => { render() fireEvent.click(screen.getByText(/confirm/i)) expect(defaultProps.onConfirm).toHaveBeenCalledTimes(1) }) it('calls onCancel when cancel button is clicked', () => { render() fireEvent.click(screen.getByText('Cancel Me')) expect(defaultProps.onCancel).toHaveBeenCalledTimes(1) }) it('handles clickOutsideNotClose logic', () => { const onClose = vi.fn() const { rerender } = render() fireEvent.click(screen.getByRole('tooltip')) expect(onClose).toHaveBeenCalledTimes(1) onClose.mockClear() rerender() fireEvent.click(screen.getByRole('tooltip')) expect(onClose).not.toHaveBeenCalled() }) it('prevents propagation on internal container click', () => { const onClose = vi.fn() render() fireEvent.click(screen.getByText('Test Modal')) expect(onClose).not.toHaveBeenCalled() }) }) describe('Props', () => { it('disables buttons when disabled prop is true', () => { render() expect(screen.getByText(/cancel/i).closest('button')).toBeDisabled() expect(screen.getByText(/save/i).closest('button')).toBeDisabled() }) }) })