import { test, expect } from 'vitest';
import { render, screen, within } from '@testing-library/react';
import SiteNavigation from './SiteNavigation';
const LINK_HREF = '#about';
const LINK_TEXT = 'About';
test('renders correctly', () => {
render(
About
Get started
Styles
Components
Patterns
Guidance
);
const nav = screen.getByRole('navigation');
const list = within(nav).getByRole('list');
// check nav
expect(nav).toHaveClass('ds_site-navigation');
expect(nav.tagName).toEqual('NAV');
// check list
expect(list.tagName).toEqual('UL');
expect(list).toHaveClass('ds_site-navigation__list');
});
test('site navigation link renders correctly', () => {
render(
{LINK_TEXT}
);
const listItem =screen.getByRole('listitem');
const link = within(listItem).getByRole('link');
expect(listItem).toHaveClass('ds_site-navigation__item');
expect(link).toHaveClass('ds_site-navigation__link');
expect(link).not.toHaveClass('ds_current');
expect(link.textContent).toEqual(LINK_TEXT);
expect(link).toHaveAttribute('href', LINK_HREF)
});
test('site navigation item with custom link element', () => {
render(
(
)}>
{LINK_TEXT}
);
const item = screen.getByRole('listitem');
const link = within(item).queryByRole('link');
expect(link?.tagName).toEqual('STRONG');
expect(link?.textContent).toEqual(LINK_TEXT);
});
test('site navigation item without href', () => {
render(
// @ts-expect-error required prop missing
{LINK_TEXT}
);
const item = screen.getByRole('listitem');
const link = within(item).queryByRole('link');
expect(link).not.toBeInTheDocument();
expect(item.textContent).toEqual(LINK_TEXT);
});
test('highlights current item', () => {
render(
{LINK_TEXT}
);
const link = screen.getByRole('link');
expect(link).toHaveClass('ds_current');
});
test('passing additional props', () => {
render(
);
const nav = screen.getByRole('navigation');
expect(nav.dataset.test).toEqual('foo');
});
test('passing additional CSS classes', () => {
render(
);
const nav = screen.getByRole('navigation');
expect(nav).toHaveClass('foo', 'ds_site-navigation');
});