import { render } from '@testing-library/react'
import { Label } from '@/components/ui/label'
describe('Label', () => {
it('应该渲染标签', () => {
const { getByText } = render()
expect(getByText('测试标签')).toBeTruthy()
})
it('应该应用默认变体样式', () => {
const { container } = render()
const textElement = container.querySelector('span')
expect(textElement?.className).toContain('text-sm')
expect(textElement?.className).toContain('font-medium')
expect(textElement?.className).toContain('text-gray-900')
})
it('应该应用不同的变体样式', () => {
const { container: defaultContainer } = render()
const { container: secondaryContainer } = render()
const { container: destructiveContainer } = render()
const defaultLabel = defaultContainer.querySelector('span')
const secondaryLabel = secondaryContainer.querySelector('span')
const destructiveLabel = destructiveContainer.querySelector('span')
expect(defaultLabel?.className).toContain('text-gray-900')
expect(secondaryLabel?.className).toContain('text-gray-600')
expect(destructiveLabel?.className).toContain('text-red-600')
})
it('应该应用不同的大小样式', () => {
const { container: defaultContainer } = render()
const { container: smContainer } = render()
const { container: lgContainer } = render()
const defaultLabel = defaultContainer.querySelector('span')
const smLabel = smContainer.querySelector('span')
const lgLabel = lgContainer.querySelector('span')
expect(defaultLabel?.className).toContain('text-sm')
expect(smLabel?.className).toContain('text-xs')
expect(lgLabel?.className).toContain('text-base')
})
it('应该显示必填标记', () => {
const { getByText } = render(
)
expect(getByText('必填字段')).toBeTruthy()
expect(getByText('*')).toBeTruthy()
})
it('不应该显示必填标记当required为false时', () => {
const { queryByText } = render(
)
expect(queryByText('*')).toBeNull()
})
it('应该应用自定义类名', () => {
const { container } = render(
)
const label = container.querySelector('span')
expect(label?.className).toContain('custom-class')
})
it('应该渲染子元素', () => {
const { getByText } = render(
)
expect(getByText('带图标的标签')).toBeTruthy()
expect(getByText('图标')).toBeTruthy()
})
it('应该传递htmlFor属性', () => {
const { container } = render(
)
const textElement = container.querySelector('span')
expect(textElement).toBeTruthy()
})
it('应该应用mb-2样式', () => {
const { container } = render()
const viewElement = container.querySelector('div')
expect(viewElement?.className).toContain('mb-2')
})
it('应该组合变体样式和大小样式', () => {
const { container } = render(
)
const label = container.querySelector('span')
expect(label?.className).toContain('text-red-600') // destructive变体
expect(label?.className).toContain('text-xs') // sm大小
})
it('应该渲染复杂的子元素结构', () => {
const { getByText } = render(
)
expect(getByText('📝')).toBeTruthy()
expect(getByText('带图标的复杂标签')).toBeTruthy()
expect(getByText('(可选)')).toBeTruthy()
})
it('应该正确处理空子元素', () => {
const { container } = render()
const label = container.querySelector('span')
expect(label).toBeTruthy()
})
})