import { test, expect } from 'vitest'; import { render, screen, within } from '@testing-library/react'; import ContentsNav from './ContentsNav'; const ITEM_HREF = '#foo'; const ITEM_TITLE = 'My content'; const LABEL_TEXT = 'Pages in this guide'; test('contents nav renders correctly', () => { render( Apply for Blue Badge Eligibility Using your Blue Badge Report a lost, stolen or misuesd Blue Badge Changing or handing back a Blue Badge ) const contentsNav = screen.getByRole('navigation'); const contentsNavTitle = within(contentsNav).getByRole('heading'); const contentsNavList = within(contentsNav).getByRole('list'); expect(contentsNav).toHaveClass('ds_contents-nav'); expect(contentsNav.ariaLabel).toEqual(LABEL_TEXT); expect(contentsNav.tagName).toEqual('NAV'); expect(contentsNavTitle).toHaveClass('ds_contents-nav__title'); expect(contentsNavTitle.textContent).toEqual('Contents'); expect(contentsNavList).toHaveClass('ds_contents-nav__list'); expect(contentsNavList.tagName).toEqual('UL'); }); test('contents nav with custom title', () => { const TITLE_TEXT = 'My title'; render( ); const contentsNav = screen.getByRole('navigation'); const contentsNavTitle = within(contentsNav).getByRole('heading'); expect(contentsNavTitle.textContent).toEqual(TITLE_TEXT); }); test('contents nav item', () => { render( {ITEM_TITLE} ); const listItem = screen.getByRole('listitem'); const link = within(listItem).getByRole('link'); expect(listItem).toHaveClass('ds_contents-nav__item'); expect(listItem.tagName).toEqual('LI'); expect(link).toHaveClass('ds_contents-nav__link'); expect(link.tagName).toEqual('A'); expect(link.textContent).toEqual(ITEM_TITLE); expect(link).toHaveAttribute('href', ITEM_HREF); }); test('contents nav item without href', () => { render( {ITEM_TITLE} ); const listItem = screen.getByRole('listitem'); const link = within(listItem).getByText(ITEM_TITLE); expect(link.tagName).toEqual('SPAN'); expect(link).not.toHaveClass('ds_current'); }); test('current contents nav item with href', () => { render( {ITEM_TITLE} ); const listItem = screen.getByRole('listitem'); const link = within(listItem).getByText(ITEM_TITLE); expect(link.tagName).toEqual('A'); expect(link).toHaveClass('ds_current'); }); test('current contents nav item without href', () => { render( {ITEM_TITLE} ); const listItem = screen.getByRole('listitem'); const link = within(listItem).getByText(ITEM_TITLE); expect(link.tagName).toEqual('SPAN'); expect(link).toHaveClass('ds_current'); }); test('contents nav item with custom element', () => { render( ( )}> {ITEM_TITLE} ); const item = screen.getByRole('listitem'); const link = within(item).queryByRole('link'); expect(link?.tagName).toEqual('STRONG'); expect(link?.textContent).toEqual(ITEM_TITLE); }); test('passing additional props', () => { render( ) const contentsNav = screen.getByRole('navigation'); expect(contentsNav?.dataset.test).toEqual('foo'); }); test('passing additional CSS classes', () => { render( ) const contentsNav = screen.getByRole('navigation'); expect(contentsNav).toHaveClass('foo', 'ds_contents-nav'); });