import { setLanguage } from '@cmsgov/design-system';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Header from './Header';
function makeHeader(props = {}) {
props = Object.assign(
{
t: (key: string) => key,
},
props
);
return {
user: userEvent.setup(),
...render(),
};
}
describe('Header', function () {
it('renders full/homepage header', () => {
const { container } = makeHeader({});
expect(container).toMatchSnapshot();
});
it('renders Direct Enrollment banner', () => {
const { container } = makeHeader({
deConsumer: true,
deBrokerName: 'Foo',
});
expect(container).toMatchSnapshot();
});
it('renders logged-in header with firstName', () => {
const { container } = makeHeader({ loggedIn: true, firstName: 'John' });
expect(container).toMatchSnapshot();
});
it('renders logged-in header without firstName', () => {
const { container } = makeHeader({ loggedIn: true });
expect(container).toMatchSnapshot();
});
it('renders Spanish header', () => {
setLanguage('es');
const { container } = makeHeader();
expect(container).toMatchSnapshot();
setLanguage('en');
});
it('toggles openMenu state when handleMenuToggleClick is called', async () => {
const { user } = makeHeader();
const actionMenuOpen = screen.getByLabelText('Open menu');
expect(actionMenuOpen).toBeInTheDocument();
await user.click(actionMenuOpen);
const actionMenuClose = screen.getByLabelText('Close menu');
expect(actionMenuClose).toBeInTheDocument();
});
it('passes correct props to SkipNav', () => {
makeHeader({
skipNavHref: '',
onSkipNavClick: () => jest.fn(),
});
const skipNav = screen.getByText('Skip to main content');
expect(skipNav).toBeInTheDocument();
});
it('re-renders with updated links', () => {
const { rerender } = render();
// You always get the logout link and locale link with any custom links unless you
// explicitly disable them
const links = screen.getAllByRole('link');
expect(links.length).toBe(2);
const newProps = { links: [{ href: '/foo', label: 'Foo', ariaLabel: 'Bar in Foo' }] };
rerender();
const newLinks = screen.getAllByRole('link');
expect(newLinks.length).toBe(5);
});
it('should add spanish toggle if logged in', () => {
makeHeader({ loggedIn: true, hideLanguageSwitch: false });
const links = screen.getAllByRole('link');
expect(links.length).toBe(2);
const languageSwitch = screen.getByText('Español');
expect(languageSwitch).toBeInTheDocument();
});
it('should not add Spanish toggle when hideLanguageSwitch set', () => {
makeHeader({ hideLanguageSwitch: true });
const links = screen.getAllByRole('link');
expect(links.length).toBe(3);
const languageSwitch = screen.queryByText('Español');
expect(languageSwitch).not.toBeInTheDocument();
});
it('should not add Login Link when hideLoginLink set', () => {
makeHeader({ hideLoginLink: true });
const loginLink = screen.queryByText('Log in');
expect(loginLink).not.toBeInTheDocument();
});
it('should not add Logout Link when hideLogoutLink set', () => {
makeHeader({ loggedIn: true, hideLogoutLink: true, links: [] });
const logoutLink = screen.queryByText('Log out');
expect(logoutLink).not.toBeInTheDocument();
});
it('renders links with absolute URLs if provided a primaryDomain prop', () => {
const { container } = makeHeader({ primaryDomain: 'https://www.healthcare.gov' });
expect(container).toMatchSnapshot();
});
it('toggles open menu for fully controlled operation', async () => {
const onMenuToggle = jest.fn();
const { user } = makeHeader({
isMenuOpen: false,
onMenuToggle,
});
const menuButton = screen.getByRole('button', { name: 'Open menu' });
const menu = screen.getByRole('list');
expect(menuButton).toHaveAttribute('aria-expanded', 'false');
expect(menu).toHaveClass('ds-u-display--none');
await user.click(menuButton);
expect(onMenuToggle).toHaveBeenCalled();
});
it('should render custom classes provided for Logo', () => {
const customClass = 'custom-class-logo';
const { baseElement } = makeHeader({
logoClassName: customClass,
});
const logo = baseElement.querySelector('.hc-c-logo');
expect(logo.className.includes(customClass)).toBe(true);
});
it('should render custom class and id provided for language switch link', () => {
const customClass = 'custom-class-lang';
makeHeader({
languageLinkClassName: customClass,
});
const languageSwitch = screen.getAllByText('Español')[0];
expect(languageSwitch).toBeInTheDocument();
expect(languageSwitch.className.includes(customClass)).toBe(true);
});
it('should render custom class and id provided for login link', () => {
const customClass = 'custom-class-login';
makeHeader({ loginLinkClassName: customClass });
const loginLink = screen.queryAllByText('Log in')[0];
expect(loginLink).toBeInTheDocument();
expect(loginLink.className.includes(customClass)).toBe(true);
});
it('should render custom classes provided within links', () => {
const customClass = 'custom-class-link';
const { baseElement } = makeHeader({
links: [
{
label: 'Custom Link',
href: '/',
className: customClass,
ariaLabel: 'Custom Link',
},
],
});
const actionMenuLink = baseElement.querySelector(`.hc-c-logged-out-links__link.${customClass}`);
const menuLink = baseElement.querySelector(`.hc-c-menu__link.${customClass}`);
expect(actionMenuLink).toBeTruthy();
expect(menuLink).toBeTruthy();
});
});