// @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(); }); });