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