label.test.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { render } from '@testing-library/react'
  2. import { Label } from '@/components/ui/label'
  3. describe('Label', () => {
  4. it('应该渲染标签', () => {
  5. const { getByText } = render(<Label>测试标签</Label>)
  6. expect(getByText('测试标签')).toBeTruthy()
  7. })
  8. it('应该应用默认变体样式', () => {
  9. const { container } = render(<Label>默认标签</Label>)
  10. const textElement = container.querySelector('span')
  11. expect(textElement?.className).toContain('text-sm')
  12. expect(textElement?.className).toContain('font-medium')
  13. expect(textElement?.className).toContain('text-gray-900')
  14. })
  15. it('应该应用不同的变体样式', () => {
  16. const { container: defaultContainer } = render(<Label variant="default">默认</Label>)
  17. const { container: secondaryContainer } = render(<Label variant="secondary">次要</Label>)
  18. const { container: destructiveContainer } = render(<Label variant="destructive">危险</Label>)
  19. const defaultLabel = defaultContainer.querySelector('span')
  20. const secondaryLabel = secondaryContainer.querySelector('span')
  21. const destructiveLabel = destructiveContainer.querySelector('span')
  22. expect(defaultLabel?.className).toContain('text-gray-900')
  23. expect(secondaryLabel?.className).toContain('text-gray-600')
  24. expect(destructiveLabel?.className).toContain('text-red-600')
  25. })
  26. it('应该应用不同的大小样式', () => {
  27. const { container: defaultContainer } = render(<Label size="default">默认</Label>)
  28. const { container: smContainer } = render(<Label size="sm">小</Label>)
  29. const { container: lgContainer } = render(<Label size="lg">大</Label>)
  30. const defaultLabel = defaultContainer.querySelector('span')
  31. const smLabel = smContainer.querySelector('span')
  32. const lgLabel = lgContainer.querySelector('span')
  33. expect(defaultLabel?.className).toContain('text-sm')
  34. expect(smLabel?.className).toContain('text-xs')
  35. expect(lgLabel?.className).toContain('text-base')
  36. })
  37. it('应该显示必填标记', () => {
  38. const { getByText } = render(
  39. <Label required>必填字段</Label>
  40. )
  41. expect(getByText('必填字段')).toBeTruthy()
  42. expect(getByText('*')).toBeTruthy()
  43. })
  44. it('不应该显示必填标记当required为false时', () => {
  45. const { queryByText } = render(
  46. <Label required={false}>非必填字段</Label>
  47. )
  48. expect(queryByText('*')).toBeNull()
  49. })
  50. it('应该应用自定义类名', () => {
  51. const { container } = render(
  52. <Label className="custom-class">自定义样式</Label>
  53. )
  54. const label = container.querySelector('span')
  55. expect(label?.className).toContain('custom-class')
  56. })
  57. it('应该渲染子元素', () => {
  58. const { getByText } = render(
  59. <Label>
  60. <span>图标</span>
  61. 带图标的标签
  62. </Label>
  63. )
  64. expect(getByText('带图标的标签')).toBeTruthy()
  65. expect(getByText('图标')).toBeTruthy()
  66. })
  67. it('应该传递htmlFor属性', () => {
  68. const { container } = render(
  69. <Label htmlFor="input-field">关联标签</Label>
  70. )
  71. const textElement = container.querySelector('span')
  72. expect(textElement).toBeTruthy()
  73. })
  74. it('应该应用mb-2样式', () => {
  75. const { container } = render(<Label>有边距的标签</Label>)
  76. const viewElement = container.querySelector('div')
  77. expect(viewElement?.className).toContain('mb-2')
  78. })
  79. it('应该组合变体样式和大小样式', () => {
  80. const { container } = render(
  81. <Label variant="destructive" size="sm">组合样式</Label>
  82. )
  83. const label = container.querySelector('span')
  84. expect(label?.className).toContain('text-red-600') // destructive变体
  85. expect(label?.className).toContain('text-xs') // sm大小
  86. })
  87. it('应该渲染复杂的子元素结构', () => {
  88. const { getByText } = render(
  89. <Label>
  90. <span className="icon">📝</span>
  91. 带图标的复杂标签
  92. <span className="hint">(可选)</span>
  93. </Label>
  94. )
  95. expect(getByText('📝')).toBeTruthy()
  96. expect(getByText('带图标的复杂标签')).toBeTruthy()
  97. expect(getByText('(可选)')).toBeTruthy()
  98. })
  99. it('应该正确处理空子元素', () => {
  100. const { container } = render(<Label></Label>)
  101. const label = container.querySelector('span')
  102. expect(label).toBeTruthy()
  103. })
  104. })