import React from 'react'
import { render, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import { Label } from '../label'
describe('Label Component', () => {
it('renders correctly with default props', () => {
render()
const label = screen.getByText('Default Label')
expect(label).toBeInTheDocument()
expect(label).toHaveClass('text-sm')
expect(label).toHaveClass('font-medium')
expect(label).toHaveClass('leading-none')
expect(label).toHaveClass('text-gray-900')
expect(label).toHaveClass('dark:text-gray-200')
expect(label).toHaveClass('peer-disabled:cursor-not-allowed')
expect(label).toHaveClass('peer-disabled:opacity-70')
expect(label).toHaveClass('dark:peer-disabled:opacity-60')
expect(label).toHaveClass('transition-colors')
expect(label).toHaveClass('duration-200')
})
it('renders with custom text content', () => {
render()
const label = screen.getByText('Custom Label Text')
expect(label).toBeInTheDocument()
})
it('applies custom className', () => {
render()
const label = screen.getByText('Test Label')
expect(label).toHaveClass('custom-label')
// Should still have default classes
expect(label).toHaveClass('text-sm')
expect(label).toHaveClass('font-medium')
})
it('forwards ref correctly', () => {
const ref = React.createRef()
render()
expect(ref.current).toBeInstanceOf(HTMLLabelElement)
expect(ref.current).toHaveTextContent('Ref Label')
})
it('passes through HTML label props', () => {
render()
const label = screen.getByText('Form Label')
expect(label).toHaveAttribute('for', 'test-input')
expect(label).toHaveAttribute('id', 'test-label')
})
it('handles onClick events', () => {
const onClick = jest.fn()
render()
const label = screen.getByText('Clickable Label')
label.click()
expect(onClick).toHaveBeenCalledTimes(1)
})
it('renders as a label element', () => {
render()
const label = screen.getByText('Label Element')
expect(label.tagName).toBe('LABEL')
})
it('supports data attributes', () => {
render()
const label = screen.getByTestId('custom-label')
expect(label).toHaveAttribute('data-custom', 'value')
})
it('supports aria attributes', () => {
render()
const label = screen.getByText('ARIA Label')
expect(label).toHaveAttribute('aria-label', 'Accessible Label')
expect(label).toHaveAttribute('aria-describedby', 'description')
})
it('handles empty content', () => {
render()
const label = screen.getByTestId('empty-label')
expect(label).toBeInTheDocument()
expect(label).toHaveClass('text-sm')
expect(label.tagName).toBe('LABEL')
})
it('handles children as React nodes', () => {
render(
)
const label = screen.getByText((content, element) => {
return element?.tagName === 'LABEL' && element.textContent === 'Child Label'
})
expect(label).toBeInTheDocument()
expect(label.querySelector('span')).toHaveTextContent('Child')
})
it('maintains displayName from Radix primitive', () => {
expect(Label.displayName).toBeDefined()
})
})