import { render, fireEvent } from '@testing-library/react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog' describe('Dialog 组件', () => { const mockOnOpenChange = jest.fn() beforeEach(() => { jest.clearAllMocks() }) describe('Dialog 主组件', () => { it('应该渲染对话框当 open 为 true 时', () => { const { getByText } = render(
对话框内容
) expect(getByText('对话框内容')).toBeTruthy() }) it('不应该渲染对话框当 open 为 false 时', () => { const { queryByText } = render(
对话框内容
) expect(queryByText('对话框内容')).toBeNull() }) it('应该调用 onOpenChange(false) 当点击背景遮罩时', () => { const { container } = render(
对话框内容
) // 找到背景遮罩元素 const backdrop = container.querySelector('.fixed') expect(backdrop).toBeTruthy() if (backdrop) { fireEvent.click(backdrop) expect(mockOnOpenChange).toHaveBeenCalledWith(false) } }) it('不应该调用 onOpenChange 当点击内容区域时', () => { const { getByText } = render(
对话框内容
) const content = getByText('对话框内容') fireEvent.click(content) expect(mockOnOpenChange).not.toHaveBeenCalled() }) it('应该应用正确的样式类名', () => { const { container } = render(
对话框内容
) const backdrop = container.querySelector('.fixed') const content = container.querySelector('.bg-white') expect(backdrop).toBeTruthy() expect(content).toBeTruthy() expect(backdrop).toHaveClass('fixed', 'inset-0', 'z-50', 'flex', 'items-center', 'justify-center', 'bg-black/50') expect(content).toHaveClass('bg-white', 'rounded-lg', 'shadow-lg', 'max-w-md', 'w-full', 'mx-4') }) }) describe('DialogContent 组件', () => { it('应该渲染内容并应用类名', () => { const { getByText, container } = render( 对话框内容 ) const content = getByText('对话框内容') expect(content).toBeTruthy() // 直接检查包含内容的div元素 const contentDiv = container.querySelector('div') expect(contentDiv).toBeTruthy() expect(contentDiv).toHaveClass('p-6', 'custom-class') }) it('应该使用默认类名', () => { const { getByText, container } = render( 对话框内容 ) const content = getByText('对话框内容') expect(content).toBeTruthy() // 直接检查包含内容的div元素 const contentDiv = container.querySelector('div') expect(contentDiv).toBeTruthy() expect(contentDiv).toHaveClass('p-6') }) }) describe('DialogHeader 组件', () => { it('应该渲染头部并应用类名', () => { const { getByText, container } = render( 对话框头部 ) const header = getByText('对话框头部') expect(header).toBeTruthy() // 直接检查包含头部的div元素 const headerDiv = container.querySelector('div') expect(headerDiv).toBeTruthy() expect(headerDiv).toHaveClass('mb-4', 'custom-header') }) it('应该使用默认类名', () => { const { getByText, container } = render( 对话框头部 ) const header = getByText('对话框头部') expect(header).toBeTruthy() // 直接检查包含头部的div元素 const headerDiv = container.querySelector('div') expect(headerDiv).toBeTruthy() expect(headerDiv).toHaveClass('mb-4') }) }) describe('DialogTitle 组件', () => { it('应该渲染标题并应用类名', () => { const { getByText } = render( 对话框标题 ) const title = getByText('对话框标题') expect(title).toBeTruthy() expect(title).toHaveClass('text-lg', 'font-semibold', 'text-gray-900', 'custom-title') }) it('应该使用默认类名', () => { const { getByText } = render( 对话框标题 ) const title = getByText('对话框标题') expect(title).toHaveClass('text-lg', 'font-semibold', 'text-gray-900') }) }) describe('DialogDescription 组件', () => { it('应该渲染描述并应用类名', () => { const { getByText } = render( 对话框描述 ) const description = getByText('对话框描述') expect(description).toBeTruthy() expect(description).toHaveClass('text-sm', 'text-gray-600', 'custom-desc') }) it('应该使用默认类名', () => { const { getByText } = render( 对话框描述 ) const description = getByText('对话框描述') expect(description).toHaveClass('text-sm', 'text-gray-600') }) }) describe('DialogFooter 组件', () => { it('应该渲染底部并应用类名', () => { const { getByText, container } = render( 对话框底部 ) const footer = getByText('对话框底部') expect(footer).toBeTruthy() // 直接检查包含底部的div元素 const footerDiv = container.querySelector('div') expect(footerDiv).toBeTruthy() expect(footerDiv).toHaveClass('flex', 'justify-end', 'space-x-2', 'custom-footer') }) it('应该使用默认类名', () => { const { getByText, container } = render( 对话框底部 ) const footer = getByText('对话框底部') expect(footer).toBeTruthy() // 直接检查包含底部的div元素 const footerDiv = container.querySelector('div') expect(footerDiv).toBeTruthy() expect(footerDiv).toHaveClass('flex', 'justify-end', 'space-x-2') }) }) describe('完整对话框示例', () => { it('应该渲染完整的对话框结构', () => { const { getByText } = render( 确认操作 您确定要执行此操作吗? ) expect(getByText('确认操作')).toBeTruthy() expect(getByText('您确定要执行此操作吗?')).toBeTruthy() expect(getByText('取消')).toBeTruthy() expect(getByText('确认')).toBeTruthy() }) it('应该正确处理事件冒泡', () => { const { getByText } = render( 测试事件 ) const button = getByText('测试按钮') fireEvent.click(button) // 点击按钮不应该触发对话框关闭 expect(mockOnOpenChange).not.toHaveBeenCalled() }) }) })