import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; import { Button } from './button'; import React from 'react'; describe('Button', () => { it('renders correctly with default props', () => { render(); const button = screen.getByRole('button', { name: /click me/i }); expect(button).toBeInTheDocument(); expect(button).toHaveClass('bg-primary'); }); it('renders correctly with different variants', () => { const { rerender } = render(); expect(screen.getByRole('button')).toHaveClass('bg-destructive'); rerender(); expect(screen.getByRole('button')).toHaveClass('border-border'); rerender(); expect(screen.getByRole('button')).toHaveClass('hover:bg-accent'); }); it('renders correctly with different sizes', () => { const { rerender } = render(); expect(screen.getByRole('button')).toHaveClass('h-8'); rerender(); expect(screen.getByRole('button')).toHaveClass('h-10'); }); it('handles click events', () => { const handleClick = vi.fn(); render(); const button = screen.getByRole('button'); fireEvent.click(button); expect(handleClick).toHaveBeenCalledTimes(1); }); it('is disabled when loading prop is true', () => { render(); const button = screen.getByRole('button'); expect(button).toBeDisabled(); expect(button.querySelector('.animate-spin')).toBeInTheDocument(); }); it('is disabled when disabled prop is true', () => { render(); const button = screen.getByRole('button'); expect(button).toBeDisabled(); }); it('renders as a child component when asChild is true', () => { render( ); const link = screen.getByRole('link', { name: /link button/i }); expect(link).toBeInTheDocument(); expect(link).toHaveClass('bg-primary'); // Should still have button styles }); });