import { describe, expect, it, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { Button } from './button'; describe('Button', () => { it('renders as a button element by default', () => { render(); expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument(); }); it('calls onClick when pressed', async () => { const onClick = vi.fn(); render(); await userEvent.click(screen.getByRole('button', { name: 'Save' })); expect(onClick).toHaveBeenCalledOnce(); }); it('does not fire onClick while disabled', async () => { const onClick = vi.fn(); render( ); await userEvent.click(screen.getByRole('button', { name: 'Save' })); expect(onClick).not.toHaveBeenCalled(); }); it('renders the child element when asChild is set', () => { render( ); const link = screen.getByRole('link', { name: 'Docs' }); expect(link).toHaveAttribute('href', '/docs'); expect(screen.queryByRole('button')).not.toBeInTheDocument(); }); it('lets a consumer className override a built-in utility', () => { render(); // tailwind-merge should drop `bg-primary` in favour of the passed class. expect(screen.getByRole('button')).toHaveClass('bg-red-500'); expect(screen.getByRole('button')).not.toHaveClass('bg-primary'); }); });