import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { describe, expect, it, vi } from 'vitest'; import { Button } from '../button'; describe('Button', () => { it('renders with children text', () => { render(); expect(screen.getByRole('button', { name: 'Click me' })).toBeInTheDocument(); }); it('handles click events', async () => { const onClick = vi.fn(); render(); await userEvent.click(screen.getByRole('button')); expect(onClick).toHaveBeenCalledOnce(); }); it('is disabled when disabled prop is set', () => { render(); expect(screen.getByRole('button')).toBeDisabled(); }); it('does not fire click when disabled', async () => { const onClick = vi.fn(); render(); await userEvent.click(screen.getByRole('button')); expect(onClick).not.toHaveBeenCalled(); }); it('applies variant classes for destructive', () => { render(); expect(screen.getByRole('button')).toHaveClass('bg-destructive'); }); it('applies variant classes for outline', () => { render(); expect(screen.getByRole('button')).toHaveClass('border'); }); it('applies size classes for sm', () => { render(); expect(screen.getByRole('button')).toHaveClass('h-9'); }); it('applies size classes for lg', () => { render(); expect(screen.getByRole('button')).toHaveClass('h-11'); }); it('applies custom className', () => { render(); expect(screen.getByRole('button')).toHaveClass('custom-class'); }); it('renders as submit button when type is set', () => { render(); expect(screen.getByRole('button')).toHaveAttribute('type', 'submit'); }); });