import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Button } from '../../../src/renderer/components/ui/Button';
describe('Button', () => {
it('renders with children', () => {
render();
expect(
screen.getByRole('button', { name: 'Click me' })
).toBeInTheDocument();
});
it('applies default variant styles by default', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-gradient-to-r');
expect(button).toHaveClass('from-hgo-blue');
});
it('applies secondary variant styles', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-white/10');
expect(button).toHaveClass('backdrop-blur-sm');
});
it('applies ghost variant styles', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('hover:bg-white/10');
expect(button).toHaveClass('text-gray-600');
});
it('applies destructive variant styles', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-red-600');
});
it('handles click events', async () => {
const handleClick = jest.fn();
const user = userEvent.setup();
render();
const button = screen.getByRole('button');
await user.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
it('can be disabled', () => {
render();
const button = screen.getByRole('button');
expect(button).toBeDisabled();
expect(button).toHaveClass('disabled:opacity-50');
});
it('supports different sizes', () => {
const { rerender } = render();
let button = screen.getByRole('button');
expect(button).toHaveClass('px-2', 'py-1', 'text-xs');
rerender();
button = screen.getByRole('button');
expect(button).toHaveClass('px-3', 'py-1.5', 'text-xs');
rerender();
button = screen.getByRole('button');
expect(button).toHaveClass('px-3.5', 'py-2', 'text-sm');
});
it('supports gradient variant', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-gradient-to-r');
});
it('supports outline variant', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('border', 'bg-white/5');
});
it('supports custom className', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('custom-class');
});
it('supports type prop', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveAttribute('type', 'submit');
});
it('has proper ARIA attributes', () => {
render(
);
const button = screen.getByRole('button');
expect(button).toHaveAttribute('aria-label', 'Custom label');
expect(button).toHaveAttribute('aria-pressed', 'true');
});
it('supports keyboard navigation', async () => {
const handleClick = jest.fn();
const user = userEvent.setup();
render();
const button = screen.getByRole('button');
button.focus();
expect(button).toHaveFocus();
await user.keyboard('{Enter}');
expect(handleClick).toHaveBeenCalledTimes(1);
await user.keyboard(' ');
expect(handleClick).toHaveBeenCalledTimes(2);
});
it('does not trigger click when disabled', async () => {
const handleClick = jest.fn();
const user = userEvent.setup();
render(
);
const button = screen.getByRole('button');
await user.click(button);
expect(handleClick).not.toHaveBeenCalled();
});
});