import { render, screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router';
import { describe, expect, it } from 'vitest';
import PageHeader from './PageHeader';
/**
* The one page-title treatment. Rendered inside a MemoryRouter since an
* optional `back` link uses react-router's `Link` directly.
*/
describe('PageHeader', () => {
it('renders the title as the level-1 heading', () => {
render(
,
);
expect(screen.getByRole('heading', { level: 1, name: 'Daily Challenge' })).toBeInTheDocument();
});
it('renders the description when given', () => {
render(
,
);
expect(screen.getByText('One puzzle a day.')).toBeInTheDocument();
});
it('omits the description when not given', () => {
render(
,
);
expect(screen.queryByText('One puzzle a day.')).toBeNull();
});
it('renders page-level actions', () => {
render(
Share} />
,
);
expect(screen.getByRole('button', { name: 'Share' })).toBeInTheDocument();
});
it('omits the actions slot when not given', () => {
render(
,
);
expect(screen.queryByRole('button')).toBeNull();
});
it('renders a back link with the given label and href', () => {
render(
,
);
const back = screen.getByRole('link', { name: /Home/ });
expect(back).toHaveAttribute('href', '/');
});
it('omits the back link when not given', () => {
render(
,
);
expect(screen.queryByRole('link')).toBeNull();
});
it('merges a custom className', () => {
const { container } = render(
,
);
expect(container.firstElementChild?.className).toContain('mt-4');
expect(container.firstElementChild?.className).toContain('mb-6');
});
});