// @ts-nocheck
import { describe, it, expect, jest } from '@jest/globals';
import { render, screen, act } from '@testing-library/react';
import '@testing-library/jest-dom';
import { LoadingState, Spinner, PageLoader } from './loading-state';
// ─── Mocks ───────────────────────────────────────────────────────────────
jest.mock('framer-motion', () => ({
motion: {
div: ({ children, className, ...props }: any) => (
{children}
),
},
}));
jest.mock('@/components/ui/skeleton', () => ({
Skeleton: ({ className }: any) => ,
SkeletonHero: () => ,
SkeletonList: ({ items }: any) => ,
SkeletonCard: () => ,
SkeletonForm: ({ fields }: any) => ,
}));
// ─── Tests ───────────────────────────────────────────────────────────────
describe('Spinner', () => {
it('should render with default size', () => {
render();
const svg = document.querySelector('svg');
expect(svg).toBeInTheDocument();
expect(svg).toHaveAttribute('role', 'status');
});
it('should render with small size', () => {
render();
const svg = document.querySelector('svg');
expect(svg?.getAttribute('class')).toContain('w-4');
});
it('should render with large size', () => {
render();
const svg = document.querySelector('svg');
expect(svg?.getAttribute('class')).toContain('w-12');
});
it('should apply custom className', () => {
render();
const svg = document.querySelector('svg');
expect(svg?.getAttribute('class')).toContain('custom-spinner');
});
});
describe('PageLoader', () => {
it('should render when loading', () => {
render();
expect(screen.getByText('正在加载...')).toBeInTheDocument();
expect(screen.getByRole('alertdialog')).toBeInTheDocument();
});
it('should render custom message', () => {
render();
expect(screen.getByText('请稍候...')).toBeInTheDocument();
});
it('should not render when not loading', () => {
const { container } = render();
expect(container.innerHTML).toBe('');
});
});
describe('LoadingState', () => {
beforeEach(() => {
jest.useFakeTimers();
});
afterEach(() => {
jest.useRealTimers();
});
it('should render children when not loading', () => {
render(
Content
);
expect(screen.getByTestId('content')).toBeInTheDocument();
});
it('should show skeleton after delay when loading', () => {
// Mount as not loading first, then switch to loading
const { rerender } = render(
Content
);
expect(screen.getByTestId('content')).toBeInTheDocument();
rerender(
Content
);
// Before delay, skeleton should not be shown
expect(screen.queryByRole('status')).not.toBeInTheDocument();
// After delay, skeleton should appear
act(() => {
jest.advanceTimersByTime(150);
});
expect(screen.getByRole('status')).toBeInTheDocument();
});
it('should render hero variant skeleton', () => {
const { rerender } = render(
Content
);
rerender(
Content
);
act(() => {
jest.advanceTimersByTime(150);
});
expect(screen.getByRole('status')).toBeInTheDocument();
expect(screen.getByTestId('skeleton-hero')).toBeInTheDocument();
});
it('should render list variant skeleton', () => {
const { rerender } = render(
Content
);
rerender(
Content
);
act(() => {
jest.advanceTimersByTime(150);
});
expect(screen.getByRole('status')).toBeInTheDocument();
expect(screen.getByTestId('skeleton-list')).toBeInTheDocument();
});
it('should render card variant skeleton', () => {
const { rerender } = render(
Content
);
rerender(
Content
);
act(() => {
jest.advanceTimersByTime(150);
});
expect(screen.getByRole('status')).toBeInTheDocument();
});
it('should render form variant skeleton', () => {
const { rerender } = render(
Content
);
rerender(
Content
);
act(() => {
jest.advanceTimersByTime(150);
});
expect(screen.getByRole('status')).toBeInTheDocument();
expect(screen.getByTestId('skeleton-form')).toBeInTheDocument();
});
it('should render children when loading stops', () => {
const { rerender } = render(
Content
);
rerender(
Content
);
act(() => {
jest.advanceTimersByTime(150);
});
expect(screen.getByRole('status')).toBeInTheDocument();
rerender(
Content
);
expect(screen.getByTestId('content')).toBeInTheDocument();
});
});