import { render, screen } from '@testing-library/react';
import React from 'react';
import { describe, expect, it } from 'vitest';
import { MdTag } from '../MdTag';
describe('MdTag', () => {
describe('rendering', () => {
it('renders with label', () => {
render();
expect(screen.getByText('Success')).toBeInTheDocument();
});
it('renders without label (nolabel class)', () => {
const { container } = render();
expect(container.querySelector('.md-tag--nolabel')).toBeInTheDocument();
});
});
describe('themes', () => {
it('applies primary theme', () => {
const { container } = render(} />);
expect(container.querySelector('.md-tag-theme--primary')).toBeInTheDocument();
});
it('applies secondary theme', () => {
const { container } = render(} />);
expect(container.querySelector('.md-tag-theme--secondary')).toBeInTheDocument();
});
it('applies success theme', () => {
const { container } = render();
expect(container.querySelector('.md-tag-theme--success')).toBeInTheDocument();
});
it('applies warning theme', () => {
const { container } = render();
expect(container.querySelector('.md-tag-theme--warning')).toBeInTheDocument();
});
it('applies info theme', () => {
const { container } = render();
expect(container.querySelector('.md-tag-theme--info')).toBeInTheDocument();
});
it('applies error theme', () => {
const { container } = render();
expect(container.querySelector('.md-tag-theme--error')).toBeInTheDocument();
});
});
describe('types', () => {
it('applies base type by default', () => {
const { container } = render();
expect(container.querySelector('.md-tag-type--outline')).not.toBeInTheDocument();
expect(container.querySelector('.md-tag-type--light')).not.toBeInTheDocument();
});
it('applies outlined type', () => {
const { container } = render();
expect(container.querySelector('.md-tag-type--outline')).toBeInTheDocument();
});
it('applies light type', () => {
const { container } = render();
expect(container.querySelector('.md-tag-type--light')).toBeInTheDocument();
});
});
describe('icons', () => {
it('shows icon when showIcon is true', () => {
const { container } = render();
expect(container.querySelector('.md-tag-icon')).toBeInTheDocument();
});
it('does not show icon when showIcon is false', () => {
const { container } = render();
expect(container.querySelector('.md-tag-icon')).not.toBeInTheDocument();
});
it('renders custom icon for primary theme', () => {
render(} />);
expect(screen.getByTestId('custom-icon')).toBeInTheDocument();
});
it('renders custom icon for secondary theme', () => {
render(} />);
expect(screen.getByTestId('custom-icon')).toBeInTheDocument();
});
it('renders built-in icon for success theme', () => {
const { container } = render();
// Icon is wrapped in .md-tag-icon container
expect(container.querySelector('.md-tag-icon')).toBeInTheDocument();
expect(container.querySelector('svg')).toBeInTheDocument();
});
it('renders built-in icon for warning theme', () => {
const { container } = render();
// Icon is wrapped in .md-tag-icon container
expect(container.querySelector('.md-tag-icon')).toBeInTheDocument();
expect(container.querySelector('svg')).toBeInTheDocument();
});
it('renders built-in icon for info theme', () => {
const { container } = render();
// Icon is wrapped in .md-tag-icon container
expect(container.querySelector('.md-tag-icon')).toBeInTheDocument();
expect(container.querySelector('svg')).toBeInTheDocument();
});
it('renders built-in icon for error theme', () => {
const { container } = render();
// Icon is wrapped in .md-tag-icon container
expect(container.querySelector('.md-tag-icon')).toBeInTheDocument();
expect(container.querySelector('svg')).toBeInTheDocument();
});
});
describe('tooltipOnly mode', () => {
it('hides label when tooltipOnly is true', () => {
render();
// With tooltipOnly, the label appears in multiple places (visually hidden + tooltip)
// The text IS in the document but not visible
const elements = screen.getAllByText('Hidden Label');
expect(elements.length).toBeGreaterThan(0);
});
it('shows tooltip instead of label', () => {
const { container } = render();
expect(container.querySelector('.md-tooltip__anchor')).toBeInTheDocument();
});
});
describe('props forwarding', () => {
it('merges custom className', () => {
const { container } = render();
expect(container.querySelector('.md-tag')).toHaveClass('custom-class');
});
});
});