import { render, screen } from '@testing-library/react';
import {
LoadingSpinner,
LoadingOverlay,
InlineLoader,
PageLoader,
} from '../LoadingSpinner';
describe('LoadingSpinner Component', () => {
it('renders basic spinner', () => {
render();
const spinner = screen.getByRole('status');
expect(spinner).toBeInTheDocument();
expect(spinner).toHaveAttribute('aria-label', 'Loading');
});
it('renders with custom message', () => {
render();
expect(screen.getByText('Loading data...')).toBeInTheDocument();
});
it('renders different sizes', () => {
const { rerender } = render();
let spinner = screen.getByRole('status');
expect(spinner).toHaveClass('h-4', 'w-4');
rerender();
spinner = screen.getByRole('status');
expect(spinner).toHaveClass('h-12', 'w-12');
});
it('renders in full screen mode', () => {
render();
const container = screen.getByRole('status').parentElement;
expect(container).toHaveClass('fixed', 'inset-0', 'z-50');
expect(screen.getByText('Please wait...')).toBeInTheDocument();
});
it('applies custom className', () => {
render();
const spinner = screen.getByRole('status');
expect(spinner).toHaveClass('custom-class');
});
it('renders with different colors', () => {
const { rerender } = render();
let spinner = screen.getByRole('status');
expect(spinner).toHaveClass('border-blue-600');
rerender();
spinner = screen.getByRole('status');
expect(spinner).toHaveClass('border-white');
});
});
describe('LoadingOverlay Component', () => {
it('renders overlay with message', () => {
render();
expect(screen.getByText('Saving changes...')).toBeInTheDocument();
});
it('renders with different backdrop styles', () => {
const { rerender, container } = render();
let overlay = container.querySelector('.fixed');
expect(overlay).toHaveClass('bg-white/80');
rerender();
overlay = container.querySelector('.fixed');
expect(overlay).toHaveClass('bg-slate-900/80');
rerender();
overlay = container.querySelector('.fixed');
expect(overlay).toHaveClass('backdrop-blur-sm');
});
it('renders as fixed overlay', () => {
const { container } = render();
const overlay = container.querySelector('.fixed');
expect(overlay).toHaveClass('inset-0', 'z-50');
});
});
describe('InlineLoader Component', () => {
it('renders inline spinner', () => {
render();
const spinner = screen.getByRole('status');
expect(spinner).toHaveClass('inline-block');
});
it('applies custom className', () => {
render();
const spinner = screen.getByRole('status');
expect(spinner).toHaveClass('ml-2');
});
});
describe('PageLoader Component', () => {
it('renders page loader', () => {
render();
const spinner = screen.getByRole('status');
expect(spinner).toBeInTheDocument();
});
it('renders with message', () => {
render();
expect(screen.getByText('Loading dashboard...')).toBeInTheDocument();
});
it('has minimum height', () => {
const { container } = render();
const wrapper = container.firstChild as HTMLElement;
expect(wrapper).toHaveClass('min-h-[400px]');
});
});