import { act, render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { describe, expect, it, vi } from 'vitest' import CustomDialog from '../index' describe('CustomDialog Component', () => { const setup = () => userEvent.setup() it('should render children and title when show is true', async () => { render(
Main Content
, ) const title = await screen.findByText('Modal Title') const content = screen.getByTestId('dialog-content') expect(title).toBeInTheDocument() expect(content).toBeInTheDocument() expect(screen.getByRole('dialog')).toBeInTheDocument() }) it('should not render anything when show is false', async () => { render(
Content
, ) expect(screen.queryByRole('dialog')).not.toBeInTheDocument() expect(screen.queryByText('Hidden Title')).not.toBeInTheDocument() }) it('should apply the correct semantic tag to title using titleAs', async () => { render( Content , ) const title = await screen.findByRole('heading', { level: 1 }) expect(title).toHaveTextContent('Semantic Title') }) it('should render the footer only when the prop is provided', async () => { const { rerender } = render( Content, ) await screen.findByRole('dialog') expect(screen.queryByText('Footer Content')).not.toBeInTheDocument() rerender( Footer Content}> Content , ) expect(await screen.findByTestId('footer-node')).toBeInTheDocument() }) it('should call onClose when Escape key is pressed', async () => { const user = setup() const onCloseMock = vi.fn() render( Content , ) await screen.findByRole('dialog') await act(async () => { await user.keyboard('{Escape}') }) expect(onCloseMock).toHaveBeenCalledTimes(1) }) it('should call onClose when the backdrop is clicked', async () => { const user = setup() const onCloseMock = vi.fn() render( Content , ) await screen.findByRole('dialog') const backdrop = document.querySelector('.bg-background-overlay-backdrop') expect(backdrop).toBeInTheDocument() await act(async () => { await user.click(backdrop!) }) expect(onCloseMock).toHaveBeenCalledTimes(1) }) it('should apply custom class names to internal elements', async () => { render(
Content
, ) await screen.findByRole('dialog') expect(document.querySelector('.custom-panel-container')).toBeInTheDocument() expect(document.querySelector('.custom-title-style')).toBeInTheDocument() expect(document.querySelector('.custom-body-style')).toBeInTheDocument() expect(document.querySelector('.custom-footer-style')).toBeInTheDocument() }) it('should maintain accessibility attributes (aria-modal)', async () => { render( , ) const dialog = await screen.findByRole('dialog') // Headless UI should automatically set aria-modal="true" expect(dialog).toHaveAttribute('aria-modal', 'true') }) })