import { describe, it, expect, beforeEach, jest } from '@jest/globals'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; import { Badge } from './badge'; describe('Badge', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('Rendering', () => { it('should render badge with text', () => { render(Test Badge); expect(screen.getByText('Test Badge')).toBeInTheDocument(); }); it('should render as span by default', () => { const { container } = render(Badge); const badge = container.querySelector('span'); expect(badge).toBeInTheDocument(); }); it('should have data-slot attribute', () => { const { container } = render(Badge); const badge = container.querySelector('[data-slot="badge"]'); expect(badge).toBeInTheDocument(); }); }); describe('Variants', () => { it('should render default variant', () => { const { container } = render(Default); const badge = container.querySelector('[data-variant="default"]'); expect(badge).toBeInTheDocument(); }); it('should render secondary variant', () => { const { container } = render(Secondary); const badge = container.querySelector('[data-variant="secondary"]'); expect(badge).toBeInTheDocument(); }); it('should render error variant', () => { const { container } = render(Error); const badge = container.querySelector('[data-variant="error"]'); expect(badge).toBeInTheDocument(); }); it('should render outline variant', () => { const { container } = render(Outline); const badge = container.querySelector('[data-variant="outline"]'); expect(badge).toBeInTheDocument(); }); it('should render ghost variant', () => { const { container } = render(Ghost); const badge = container.querySelector('[data-variant="ghost"]'); expect(badge).toBeInTheDocument(); }); it('should render success variant', () => { const { container } = render(Success); const badge = container.querySelector('[data-variant="success"]'); expect(badge).toBeInTheDocument(); }); it('should render warning variant', () => { const { container } = render(Warning); const badge = container.querySelector('[data-variant="warning"]'); expect(badge).toBeInTheDocument(); }); it('should render info variant', () => { const { container } = render(Info); const badge = container.querySelector('[data-variant="info"]'); expect(badge).toBeInTheDocument(); }); }); describe('Styling', () => { it('should apply custom className', () => { const { container } = render(Badge); const badge = container.querySelector('.custom-class'); expect(badge).toBeInTheDocument(); }); it('should have rounded-full class', () => { const { container } = render(Badge); // Badge 使用 rounded-sm(shadcn/ui 规范) const badge = container.querySelector('.rounded-sm'); expect(badge).toBeInTheDocument(); }); it('should have inline-flex class', () => { const { container } = render(Badge); const badge = container.querySelector('.inline-flex'); expect(badge).toBeInTheDocument(); }); }); describe('AsChild', () => { it('should render as child component when asChild is true', () => { const { container } = render( ); const button = container.querySelector('button'); expect(button).toBeInTheDocument(); expect(button).toHaveTextContent('Button Badge'); }); }); });