import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from '../Button';
describe('Button', () => {
it('renders children correctly', () => {
render();
expect(screen.getByText('Click me')).toBeInTheDocument();
});
it('applies primary variant by default', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-primary');
});
it('applies secondary variant when specified', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-secondary');
});
it('applies outline variant when specified', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('border-2');
expect(button).toHaveClass('border-primary');
});
it('applies danger variant when specified', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-error');
});
it('applies small size correctly', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('px-3');
expect(button).toHaveClass('py-1.5');
});
it('applies large size correctly', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('px-6');
expect(button).toHaveClass('py-3');
});
it('applies full width when specified', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('w-full');
});
it('disables button when disabled prop is true', () => {
render();
const button = screen.getByRole('button');
expect(button).toBeDisabled();
});
it('shows loading spinner when loading', () => {
render();
const button = screen.getByRole('button');
expect(button).toBeDisabled();
expect(button.querySelector('svg')).toBeInTheDocument();
});
it('calls onClick when clicked', () => {
const handleClick = jest.fn();
render();
const button = screen.getByRole('button');
fireEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
it('does not call onClick when disabled', () => {
const handleClick = jest.fn();
render(
);
const button = screen.getByRole('button');
fireEvent.click(button);
expect(handleClick).not.toHaveBeenCalled();
});
it('applies custom className', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('custom-class');
});
});