Files
goodgo-platform/apps/web/components/design-system/__tests__/compact-header.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

49 lines
1.7 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { CompactHeader } from '../compact-header';
describe('CompactHeader', () => {
it('renders a header element', () => {
render(<CompactHeader />);
expect(screen.getByRole('banner')).toBeInTheDocument();
});
it('renders logo when provided', () => {
render(<CompactHeader logo={<span data-testid="logo" />} />);
expect(screen.getByTestId('logo')).toBeInTheDocument();
});
it('renders breadcrumb when provided', () => {
render(<CompactHeader breadcrumb={<span>Trang chủ</span>} />);
expect(screen.getByText('Trang chủ')).toBeInTheDocument();
});
it('renders search slot when provided', () => {
render(<CompactHeader search={<input data-testid="search" />} />);
expect(screen.getByTestId('search')).toBeInTheDocument();
});
it('renders actions when provided', () => {
render(<CompactHeader actions={<button data-testid="act">Đăng nhập</button>} />);
expect(screen.getByTestId('act')).toBeInTheDocument();
});
it('does not render logo slot when omitted', () => {
const { container } = render(<CompactHeader />);
// no extra wrapping div for logo
const header = container.querySelector('header') as HTMLElement;
// Slot divs: just the ml-auto actions div should be present
expect(header.children.length).toBe(1);
});
it('is sticky and has border-b class', () => {
render(<CompactHeader data-testid="ch" />);
expect(screen.getByRole('banner')).toHaveClass('sticky', 'border-b');
});
it('merges custom className', () => {
render(<CompactHeader className="custom-header" />);
expect(screen.getByRole('banner')).toHaveClass('custom-header');
});
});