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()
})
})
})