Files
goodgo-platform/apps/web/components/design-system/__tests__/skeleton.spec.tsx
Ho Ngoc Hai 5a119df806 test(web): add Vitest+RTL tests for 15 design-system presentational components
Covers Badge, Divider, EmptyState, Numeric, PriceDelta, Signal, Skeleton,
StatusChip, Surface, StatCard, KpiCard, DensityToggle, Footer, MarketIndex,
CompactHeader — rendering, variants, props, a11y attributes, className merging.

All 1139 web tests pass. Zustand persist store mocked for DensityToggle to
avoid jsdom localStorage incompatibility.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-23 20:33:17 +07:00

48 lines
1.8 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { Skeleton } from '../skeleton';
describe('Skeleton', () => {
it('renders base skeleton with animate-pulse', () => {
const { container } = render(<Skeleton />);
expect(container.firstChild).toHaveClass('animate-pulse');
});
it('base skeleton has aria-hidden', () => {
const { container } = render(<Skeleton />);
expect(container.firstChild).toHaveAttribute('aria-hidden');
});
it('Skeleton.Row renders row placeholder', () => {
const { container } = render(<Skeleton.Row />);
expect(container.firstChild).toHaveAttribute('aria-hidden');
// Should have multiple skeleton blocks
expect(container.querySelectorAll('.animate-pulse').length).toBeGreaterThan(0);
});
it('Skeleton.Card renders card placeholder', () => {
const { container } = render(<Skeleton.Card />);
expect(container.firstChild).toHaveAttribute('aria-hidden');
});
it('Skeleton.Table renders header and default 5 rows', () => {
const { container } = render(<Skeleton.Table />);
expect(container.firstChild).toHaveAttribute('aria-hidden');
// header + 5 rows = 6 row-like blocks; just check children exist
expect(container.children.length).toBeGreaterThan(0);
});
it('Skeleton.Table renders custom row count', () => {
const { container } = render(<Skeleton.Table rows={3} />);
// container.firstChild has header div + 3 SkeletonRow children
const el = container.firstChild as HTMLElement;
// header + 3 rows
expect(el.children.length).toBe(4);
});
it('merges custom className on base', () => {
render(<Skeleton data-testid="sk" className="h-10" />);
expect(screen.getByTestId('sk')).toHaveClass('h-10');
});
});