import { render, screen, fireEvent } from '@testing-library/react'
import { Button } from '../button'
describe('Button Component', () => {
it('renders correctly with default props', () => {
render()
const button = screen.getByRole('button', { name: /click me/i })
expect(button).toBeInTheDocument()
expect(button).toHaveClass('bg-primary')
})
it('renders different variants correctly', () => {
const { rerender } = render()
expect(screen.getByRole('button')).toHaveClass('bg-secondary')
expect(screen.getByRole('button')).toHaveClass('text-secondary-foreground')
rerender()
expect(screen.getByRole('button')).toHaveClass('bg-background')
expect(screen.getByRole('button')).toHaveClass('text-foreground')
rerender()
expect(screen.getByRole('button')).toHaveClass('text-foreground')
rerender()
expect(screen.getByRole('button')).toHaveClass('text-primary')
expect(screen.getByRole('button')).toHaveClass('underline-offset-4')
})
it('renders different sizes correctly', () => {
const { rerender } = render()
expect(screen.getByRole('button')).toHaveClass('h-8')
expect(screen.getByRole('button')).toHaveClass('px-3')
expect(screen.getByRole('button')).toHaveClass('text-sm')
rerender()
expect(screen.getByRole('button')).toHaveClass('h-12')
expect(screen.getByRole('button')).toHaveClass('px-6')
expect(screen.getByRole('button')).toHaveClass('text-lg')
rerender()
const button = screen.getByRole('button')
expect(button).toHaveClass('h-10')
expect(button).toHaveClass('w-10')
})
it('handles disabled state correctly', () => {
render()
const button = screen.getByRole('button')
expect(button).toBeDisabled()
expect(button).toHaveClass('disabled:pointer-events-none')
})
it('handles click events', () => {
const handleClick = jest.fn()
render()
fireEvent.click(screen.getByRole('button'))
expect(handleClick).toHaveBeenCalledTimes(1)
})
it('does not trigger click when disabled', () => {
const handleClick = jest.fn()
render()
fireEvent.click(screen.getByRole('button'))
expect(handleClick).not.toHaveBeenCalled()
})
it('renders as child component when asChild is true', () => {
render(
)
const link = screen.getByRole('link')
expect(link).toBeInTheDocument()
expect(link).toHaveAttribute('href', '/test')
})
it('applies custom className', () => {
render()
expect(screen.getByRole('button')).toHaveClass('custom-class')
})
it('forwards ref correctly', () => {
const ref = jest.fn()
render()
expect(ref).toHaveBeenCalled()
})
})