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');
});
});