/** * @jest-environment jsdom */ import React from 'react' import { render } from '@testing-library/react' import '@testing-library/jest-dom/extend-expect' import { SubNavigation } from '../../components/sub-navigation/partials' import fixture from '../fixtures/index' describe('SubNavigation with dropdown options', () => { const mockProps = { ...fixture, userIsLoggedIn: false, userIsAnonymous: true, showMegaNav: false, variant: 'simple' as const, data: { ...fixture.data, subsections: [ { label: 'Markets Data', url: '/markets-data', isSubnavDropdownEnabled: true, subnavDropdownOptions: [ { label: 'Equities', url: '/equities', trackable: 'equities' }, { label: 'Currencies', url: '/currencies', trackable: 'currencies' } ] }, { label: 'Markets Overview', url: '/markets-overview' } ] } } it('renders hidden dropdown modal with provided options', () => { const { container } = render() const button = container.querySelector('[data-o-header-subnav-dropdown-button]') expect(button).toBeInTheDocument() expect(button).toHaveAttribute('data-trackable', 'Markets Data') expect(button).toHaveAttribute('id', 'subnav-dropdown-button-markets-data') expect(button).toHaveAttribute('aria-controls', 'subnav-dropdown-modal-markets-data') expect(button).toHaveAttribute('aria-haspopup', 'dialog') expect(button).toHaveAttribute('aria-expanded', 'false') const dropdown = container.querySelector('[data-o-header-subnav-dropdown-modal]') expect(dropdown).toBeInTheDocument() expect(dropdown).toHaveAttribute('id', 'subnav-dropdown-modal-markets-data') expect(dropdown).toHaveAttribute('role', 'dialog') expect(dropdown).toHaveAttribute('aria-modal', 'true') expect(dropdown).toHaveAttribute('aria-labelledby', 'subnav-dropdown-button-markets-data') expect(dropdown).not.toHaveAttribute('aria-label') const title = container.querySelector('.o-header__subnav-dropdown-title') expect(title).toBeInTheDocument() expect(title).toHaveTextContent('Markets Data') const closeButton = container.querySelector('[data-o-header-subnav-dropdown-close]') expect(closeButton).toBeInTheDocument() expect(closeButton).toHaveAttribute('aria-label', 'Close menu') const closeIcon = container.querySelector('.o-header__subnav-dropdown-close-icon') expect(closeIcon).toBeInTheDocument() const dropdownLinks = container.querySelectorAll('.o-header__subnav-dropdown-link') expect(dropdownLinks).toHaveLength(2) expect(dropdownLinks[0]).toHaveAttribute('href', '/equities') expect(dropdownLinks[0]).toHaveAttribute('data-trackable', 'equities') expect(dropdownLinks[1]).toHaveAttribute('href', '/currencies') expect(dropdownLinks[1]).toHaveAttribute('data-trackable', 'currencies') }) it('renders subnav items as regular links when options are not available', () => { const propsWithoutDropdowns = { ...mockProps, data: { ...mockProps.data, subsections: [ { label: 'Markets Overview', url: '/markets-overview', isSubnavDropdownEnabled: true }, { label: 'Analysis', url: '/analysis' } ], 'subsections-right': [] } } const { container, getAllByRole } = render() const links = getAllByRole('link') const overviewLink = links.find((link) => link.textContent === 'Markets Overview') expect(overviewLink).toBeInTheDocument() expect(overviewLink).toHaveAttribute('href', '/markets-overview') const dropdown = container.querySelector('[data-o-header-subnav-dropdown-modal]') const button = container.querySelector('[data-o-header-subnav-dropdown-button]') expect(dropdown).not.toBeInTheDocument() expect(button).not.toBeInTheDocument() }) it('renders subnav items as regular links when isSubnavDropdownEnabled = false', () => { const propsWithDropdownsDisabled = { ...mockProps, data: { ...mockProps.data, subsections: [ { label: 'Markets Data', url: '/markets-data', isSubnavDropdownEnabled: false, subnavDropdownOptions: [ { label: 'Equities', url: '/equities', trackable: 'equities' }, { label: 'Currencies', url: '/currencies', trackable: 'currencies' } ] }, { label: 'Markets Overview', url: '/markets-overview' } ] } } const { container, getAllByRole } = render() const links = getAllByRole('link') const overviewLink = links.find((link) => link.textContent === 'Markets Overview') expect(overviewLink).toBeInTheDocument() expect(overviewLink).toHaveAttribute('href', '/markets-overview') const dropdown = container.querySelector('[data-o-header-subnav-dropdown-modal]') const button = container.querySelector('[data-o-header-subnav-dropdown-button]') expect(dropdown).not.toBeInTheDocument() expect(button).not.toBeInTheDocument() }) })