import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { describe, expect, it, vi } from 'vitest';
import { MdAlertMessage } from '../MdAlertMessage';
describe('MdAlertMessage', () => {
describe('rendering', () => {
it('renders with label', () => {
render();
expect(screen.getByText('Alert message')).toBeInTheDocument();
});
it('renders with description', () => {
render();
expect(screen.getByText('Description text')).toBeInTheDocument();
});
it('renders label as ReactNode', () => {
render(Custom} />);
expect(screen.getByTestId('custom-label')).toBeInTheDocument();
});
it('renders description as ReactNode', () => {
render(Custom} />);
expect(screen.getByTestId('custom-desc')).toBeInTheDocument();
});
it('renders icon by default', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).toBeInTheDocument();
});
it('hides icon when hideIcon is true', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).not.toBeInTheDocument();
});
});
describe('themes', () => {
it('applies info theme by default', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message')).not.toHaveClass('md-alert-message--success');
expect(container.querySelector('.md-alert-message')).not.toHaveClass('md-alert-message--warning');
expect(container.querySelector('.md-alert-message')).not.toHaveClass('md-alert-message--error');
});
it('applies success theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message--success')).toBeInTheDocument();
});
it('applies warning theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message--warning')).toBeInTheDocument();
});
it('applies error theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message--error')).toBeInTheDocument();
});
it('applies info-box theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message--info-box')).toBeInTheDocument();
});
});
describe('icons', () => {
it('renders info icon for info theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).toBeInTheDocument();
});
it('renders success icon for success theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).toBeInTheDocument();
});
it('renders warning icon for warning theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).toBeInTheDocument();
});
it('renders error icon for error theme', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).toBeInTheDocument();
});
it('renders custom icon', () => {
render(} />);
expect(screen.getByTestId('custom-icon')).toBeInTheDocument();
});
});
describe('closable', () => {
it('shows close button when closable is true', () => {
// Component requires both closable AND onClose to render the button
render( {}} />);
expect(screen.getByRole('button')).toBeInTheDocument();
});
it('does not show close button by default', () => {
render();
expect(screen.queryByRole('button')).not.toBeInTheDocument();
});
it('calls onClose when close button is clicked', async () => {
const user = userEvent.setup();
const onClose = vi.fn();
render();
await user.click(screen.getByRole('button'));
expect(onClose).toHaveBeenCalledTimes(1);
});
});
describe('fullWidth', () => {
it('applies fullWidth class', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message--fullWidth')).toBeInTheDocument();
});
});
describe('alignContent', () => {
it('applies center alignment', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__content--center')).toBeInTheDocument();
});
it('applies end alignment', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__content--end')).toBeInTheDocument();
});
});
describe('props forwarding', () => {
it('merges custom className', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message')).toHaveClass('custom-class');
});
it('forwards data-* attributes', () => {
render();
expect(screen.getByTestId('alert')).toBeInTheDocument();
});
});
describe('accessibility', () => {
it('icons have aria-label', () => {
const { container } = render();
expect(container.querySelector('.md-alert-message__icon')).toHaveAttribute('aria-label');
});
});
});