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