import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; import { Button } from './button'; describe('Button Component', () => { it('renders with default props', () => { render(); const button = screen.getByRole('button', { name: /click me/i }); expect(button).toBeInTheDocument(); expect(button).toHaveClass('bg-primary'); }); it('renders with different variants', () => { const { rerender } = render(); expect(screen.getByRole('button')).toHaveClass('bg-muted/30'); rerender(); expect(screen.getByRole('button')).toHaveClass('bg-destructive/10'); rerender(); expect(screen.getByRole('button')).toHaveClass('border'); }); it('renders with different sizes', () => { const { rerender } = render(); expect(screen.getByRole('button')).toHaveClass('h-9'); rerender(); expect(screen.getByRole('button')).toHaveClass('h-12'); rerender(); expect(screen.getByRole('button')).toHaveClass('h-10'); }); it('handles click events', () => { const handleClick = vi.fn(); render(); const button = screen.getByRole('button'); fireEvent.click(button); expect(handleClick).toHaveBeenCalledTimes(1); }); it('can be disabled', () => { const handleClick = vi.fn(); render( , ); const button = screen.getByRole('button'); expect(button).toBeDisabled(); fireEvent.click(button); expect(handleClick).not.toHaveBeenCalled(); }); it('applies custom className', () => { render(); const button = screen.getByRole('button'); expect(button).toHaveClass('custom-class'); }); it('renders as different element when asChild is true', () => { render( , ); const link = screen.getByRole('link'); expect(link).toBeInTheDocument(); expect(link).toHaveAttribute('href', '/test'); }); it('forwards ref correctly', () => { const ref = vi.fn(); render(); expect(ref).toHaveBeenCalled(); }); it('supports loading state', () => { render(); const button = screen.getByRole('button'); expect(button).toBeDisabled(); expect(button).toHaveClass('opacity-70'); }); it('renders with icon when provided', () => { const TestIcon = () => Icon; render(); expect(screen.getByTestId('test-icon')).toBeInTheDocument(); }); });