import { describe, it, expect } from 'vitest';
import { render, screen } from '@testing-library/react';
import { PlayerLoading } from './PlayerLoading';
describe('PlayerLoading', () => {
it('should not render when isLoading is false', () => {
const { container } = render();
expect(container.firstChild).toBeNull();
});
it('should render when isLoading is true', () => {
render();
expect(screen.getByRole('status')).toBeInTheDocument();
});
it('should display default message', () => {
const { container } = render();
// Check that message appears in the visible text (not just sr-only)
expect(container.textContent).toContain('Chargement...');
expect(screen.getByText('Chargement...', { selector: 'p' })).toBeInTheDocument();
});
it('should display custom message', () => {
const { container } = render(
);
// Check that message appears in the visible text (not just sr-only)
expect(container.textContent).toContain('Chargement de la piste...');
expect(screen.getByText('Chargement de la piste...', { selector: 'p' })).toBeInTheDocument();
});
it('should not display message when message is empty', () => {
const { container } = render();
expect(screen.queryByText('Chargement...', { selector: 'p' })).not.toBeInTheDocument();
expect(screen.getByRole('status')).toBeInTheDocument();
// Should still have sr-only text for accessibility
expect(container.textContent).toContain('');
});
it('should apply size classes for spinner', () => {
const { container: smContainer } = render(
);
const spinner = smContainer.querySelector('svg');
expect(spinner).toHaveClass('h-4', 'w-4');
const { container: mdContainer } = render(
);
const mdSpinner = mdContainer.querySelector('svg');
expect(mdSpinner).toHaveClass('h-6', 'w-6');
const { container: lgContainer } = render(
);
const lgSpinner = lgContainer.querySelector('svg');
expect(lgSpinner).toHaveClass('h-8', 'w-8');
});
it('should apply size classes for text', () => {
const { container: smContainer } = render(
);
const text = smContainer.querySelector('p');
expect(text).toHaveClass('text-xs');
const { container: mdContainer } = render(
);
const mdText = mdContainer.querySelector('p');
expect(mdText).toHaveClass('text-sm');
const { container: lgContainer } = render(
);
const lgText = lgContainer.querySelector('p');
expect(lgText).toHaveClass('text-base');
});
it('should apply custom className', () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass('custom-class');
});
it('should render fullScreen variant', () => {
const { container } = render();
expect(container.firstChild).toHaveClass('fixed', 'inset-0');
});
it('should render inline variant by default', () => {
const { container } = render();
expect(container.firstChild).toHaveClass('flex', 'items-center', 'justify-center', 'p-4');
expect(container.firstChild).not.toHaveClass('fixed', 'inset-0');
});
it('should have accessible attributes', () => {
render();
const status = screen.getByRole('status');
expect(status).toHaveAttribute('aria-live', 'polite');
expect(status).toHaveAttribute('aria-label', 'Chargement...');
});
it('should have spinner with animation', () => {
const { container } = render();
const spinner = container.querySelector('svg');
expect(spinner).toHaveClass('animate-spin');
});
it('should have sr-only text for screen readers', () => {
render();
expect(screen.getByText('Chargement...', { selector: '.sr-only' })).toBeInTheDocument();
});
});