import { describe, it, expect } from 'vitest';
import { render } from '@testing-library/react';
import Skeleton from './Skeleton';
describe('Skeleton', () => {
it('page variant renders PageHeader-shaped band + 4 stat tiles + card', () => {
const { container, getByRole } = render();
expect(getByRole('status')).toHaveAttribute('aria-busy', 'true');
expect(getByRole('status')).toHaveAttribute('aria-label', 'Loading content');
expect(container.querySelector('.animate-pulse')).not.toBeNull();
// 4 stat tiles
expect(container.querySelectorAll('.grid > .bg-surface')).toHaveLength(4);
});
it('table variant defaults to 6 rows × 5 cols', () => {
const { container } = render();
const rows = container.querySelectorAll('tbody tr');
expect(rows).toHaveLength(6);
const cells = rows[0].querySelectorAll('td');
expect(cells).toHaveLength(5);
});
it('table variant respects custom rows + columns', () => {
const { container } = render();
expect(container.querySelectorAll('tbody tr')).toHaveLength(3);
expect(container.querySelectorAll('tbody tr:first-child td')).toHaveLength(4);
});
it('card variant renders title-row + 3 prose rows', () => {
const { container } = render();
// 1 title + 3 prose lines = 4 stripes inside the inner card
const stripes = container.querySelectorAll('.bg-surface > div, .bg-surface .space-y-2 > div');
expect(stripes.length).toBeGreaterThanOrEqual(4);
});
it('stat variant renders label-row + number-row', () => {
const { container, getByRole } = render();
expect(getByRole('status')).toHaveAttribute('aria-busy', 'true');
// 2 stripes
expect(container.querySelectorAll('.bg-surface-border')).toHaveLength(2);
});
it('custom ariaLabel surfaces on the role=status root', () => {
const { getByRole } = render(
,
);
expect(getByRole('status')).toHaveAttribute('aria-label', 'Loading certificates');
});
});