/// /// import { render, screen } from '@testing-library/react'; import React from 'react'; import { describe, expect, it } from 'vitest'; import { MdBadge } from '../MdBadge'; describe('MdBadge', () => { describe('rendering', () => { it('renders as dot badge when count is not provided', () => { const { container } = render(); expect(container.querySelector('.md-badge--dot')).toBeInTheDocument(); }); it('renders as dot badge when count is null', () => { const { container } = render(); expect(container.querySelector('.md-badge--dot')).toBeInTheDocument(); }); it('renders count as text content', () => { render(); expect(screen.getByText('5')).toBeInTheDocument(); }); it('renders count of 0 without dot class', () => { const { container } = render(); expect(screen.getByText('0')).toBeInTheDocument(); expect(container.querySelector('.md-badge--dot')).not.toBeInTheDocument(); }); it('renders a span element with md-badge class', () => { const { container } = render(); expect(container.querySelector('span.md-badge')).toBeInTheDocument(); }); }); describe('edge cases', () => { it('shows count when below maxCount', () => { render(); expect(screen.getByText('5')).toBeInTheDocument(); }); it('shows count when equal to maxCount', () => { render(); expect(screen.getByText('10')).toBeInTheDocument(); }); it('shows maxCount+ when count exceeds maxCount', () => { render(); expect(screen.getByText('10+')).toBeInTheDocument(); }); it('shows full count when maxCount is not set', () => { render(); expect(screen.getByText('999')).toBeInTheDocument(); }); }); describe('size', () => { it.each(['small', 'medium', 'large'] as const)('applies %s size class', (size) => { const { container } = render(); expect(container.querySelector(`.md-badge--${size}`)).toBeInTheDocument(); }); }); describe('theme', () => { it.each(['primary', 'secondary', 'error', 'warning', 'success', 'info'] as const)( 'applies %s theme class', (theme) => { const { container } = render(); expect(container.querySelector(`.md-badge--${theme}`)).toBeInTheDocument(); }, ); it('applies no theme class when theme is not provided', () => { const { container } = render(); const badge = container.querySelector('.md-badge'); expect(badge?.className).not.toMatch( /md-badge--(primary|secondary|error|warning|success|info)/, ); }); }); describe('props forwarding', () => { it('merges custom className with component classes', () => { const { container } = render(); const badge = container.querySelector('.md-badge'); expect(badge).toHaveClass('md-badge', 'custom-class'); }); it('forwards id attribute', () => { const { container } = render(); expect(container.querySelector('#my-badge')).toBeInTheDocument(); }); it('forwards aria-label attribute', () => { const { container } = render(); expect(container.querySelector('.md-badge')).toHaveAttribute('aria-label', '3 notifications'); }); it('forwards data-* attributes', () => { const { container } = render(); expect(container.querySelector('[data-testid="badge"]')).toBeInTheDocument(); }); }); });