import { render, fireEvent } from '@testing-library/react'
import { Button } from '@/components/ui/button'
describe('Button', () => {
it('应该渲染按钮', () => {
const { getByText } = render()
expect(getByText('测试按钮')).toBeTruthy()
})
it('应该处理点击事件', () => {
const handleClick = jest.fn()
const { getByText } = render(
)
const button = getByText('点击我')
fireEvent.click(button)
expect(handleClick).toHaveBeenCalled()
})
it('应该应用默认变体样式', () => {
const { container } = render()
const button = container.querySelector('button')
expect(button?.className).toContain('bg-primary')
expect(button?.className).toContain('text-primary-foreground')
})
it('应该应用不同的变体样式', () => {
const { container: defaultContainer } = render()
const { container: destructiveContainer } = render()
const { container: outlineContainer } = render()
const { container: secondaryContainer } = render()
const { container: ghostContainer } = render()
const { container: linkContainer } = render()
const defaultButton = defaultContainer.querySelector('button')
const destructiveButton = destructiveContainer.querySelector('button')
const outlineButton = outlineContainer.querySelector('button')
const secondaryButton = secondaryContainer.querySelector('button')
const ghostButton = ghostContainer.querySelector('button')
const linkButton = linkContainer.querySelector('button')
expect(defaultButton?.className).toContain('bg-primary')
expect(destructiveButton?.className).toContain('bg-destructive')
expect(outlineButton?.className).toContain('border-input')
expect(secondaryButton?.className).toContain('bg-secondary')
expect(ghostButton?.className).toContain('hover:bg-accent')
expect(linkButton?.className).toContain('text-primary')
})
it('应该应用不同的大小样式', () => {
const { container: defaultContainer } = render()
const { container: smContainer } = render()
const { container: lgContainer } = render()
const { container: iconContainer } = render()
const defaultButton = defaultContainer.querySelector('button')
const smButton = smContainer.querySelector('button')
const lgButton = lgContainer.querySelector('button')
const iconButton = iconContainer.querySelector('button')
expect(defaultButton?.className).toContain('h-10')
expect(smButton?.className).toContain('h-9')
expect(lgButton?.className).toContain('h-11')
expect(iconButton?.className).toContain('h-10 w-10')
})
it('应该禁用按钮', () => {
const { container } = render()
const button = container.querySelector('button')
expect(button?.disabled).toBe(true)
expect(button?.className).toContain('[&[disabled]]:opacity-50')
expect(button?.className).toContain('[&[disabled]]:pointer-events-none')
})
it('应该应用自定义类名', () => {
const { container } = render(
)
const button = container.querySelector('button')
expect(button?.className).toContain('custom-class')
})
it('应该渲染子元素', () => {
const { getByText } = render(
)
expect(getByText('带图标的按钮')).toBeTruthy()
expect(getByText('图标')).toBeTruthy()
})
it('应该传递其他属性', () => {
const { container } = render(
)
const button = container.querySelector('button')
expect(button?.type).toBe('submit')
})
it('应该应用重置样式', () => {
const { container } = render()
const button = container.querySelector('button')
expect(button?.className).toContain('w-auto')
expect(button?.className).toContain('border-0')
expect(button?.className).toContain('text-inherit')
expect(button?.className).toContain('p-0')
expect(button?.className).toContain('m-0')
})
it('应该组合变体样式和重置样式', () => {
const { container } = render(
)
const button = container.querySelector('button')
expect(button?.className).toContain('border-input') // outline变体
expect(button?.className).toContain('h-9') // sm大小
expect(button?.className).toContain('w-auto') // 重置样式
})
it('应该处理焦点状态', () => {
const { container } = render()
const button = container.querySelector('button')
expect(button?.className).toContain('focus-visible:outline-none')
expect(button?.className).toContain('focus-visible:ring-2')
expect(button?.className).toContain('focus-visible:ring-ring')
})
it('应该应用过渡效果', () => {
const { container } = render()
const button = container.querySelector('button')
expect(button?.className).toContain('transition-colors')
})
it('应该正确处理disabled为false的情况', () => {
const { container } = render()
const button = container.querySelector('button')
expect(button?.disabled).toBe(false)
})
})