@amsterdam/design-system-react
Version:
All React components from the Amsterdam Design System. Use it to compose pages in your website or application.
122 lines (121 loc) • 5.9 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { createRef } from 'react';
import './matchMedia.mock'; // Must be imported before Header
import { Header } from './Header';
import '@testing-library/jest-dom';
describe('Header', () => {
it('renders', () => {
render(_jsx(Header, {}));
const component = screen.getByRole('banner');
expect(component).toBeInTheDocument();
expect(component).toBeVisible();
});
it('renders a design system BEM class name', () => {
render(_jsx(Header, {}));
const component = screen.getByRole('banner');
expect(component).toHaveClass('ams-header');
});
it('renders an additional class name', () => {
render(_jsx(Header, { className: "extra" }));
const component = screen.getByRole('banner');
expect(component).toHaveClass('extra');
expect(component).toHaveClass('ams-header');
});
it('supports ForwardRef in React', () => {
const ref = createRef();
render(_jsx(Header, { ref: ref }));
const component = screen.getByRole('banner');
expect(ref.current).toBe(component);
});
it('renders a logo link', () => {
render(_jsx(Header, {}));
const component = screen.getByRole('link');
expect(component).toHaveClass('ams-header__logo-link');
});
it('renders a different brand logo', () => {
const { container } = render(_jsx(Header, { logoBrand: "ggd-amsterdam" }));
const component = container.querySelector('.ams-logo__text-secondary');
expect(component).toBeInTheDocument();
});
it('renders a custom logo link', () => {
render(_jsx(Header, { logoLink: "/home" }));
const logoLink = screen.getByRole('link');
expect(logoLink).toHaveAttribute('href', '/home');
});
it('renders a custom logo link title', () => {
render(_jsx(Header, { logoLinkTitle: "Go to homepage" }));
const logoLinkTitle = screen.getByRole('link', { name: 'Go to homepage' });
expect(logoLinkTitle).toBeInTheDocument();
});
it('renders an application name', () => {
render(_jsx(Header, { brandName: "Application name" }));
const brandName = screen.getByText('Application name');
expect(brandName).toBeInTheDocument();
});
it('renders the correct class for the responsive logo', () => {
const { container } = render(_jsx(Header, { brandName: "Application name" }));
const logoContainer = container.querySelector('.ams-header__logo-container');
expect(logoContainer).toBeInTheDocument();
});
it('renders a nav section', () => {
render(_jsx(Header, { children: "Test" }));
const component = screen.getByRole('navigation');
expect(component).toHaveClass('ams-header__navigation');
});
it('renders a nav section with a custom label', () => {
render(_jsx(Header, { navigationLabel: "Custom Navigation", children: "Test" }));
const component = screen.getByRole('navigation', { name: 'Custom Navigation' });
expect(component).toBeInTheDocument();
});
it('renders a menu', () => {
render(_jsx(Header, { menuItems: _jsx(Header.MenuLink, { children: "Menu Item" }) }));
const component = screen.getByRole('list');
expect(component).toHaveClass('ams-header__menu');
});
it('renders menu items', () => {
render(_jsx(Header, { menuItems: [
_jsx(Header.MenuLink, { href: "/", children: "Menu Item 1" }, 1),
_jsx(Header.MenuLink, { href: "/", children: "Menu Item 2" }, 2),
] }));
const item1 = screen.getByRole('link', { name: 'Menu Item 1' });
const item2 = screen.getByRole('link', { name: 'Menu Item 2' });
expect(item1).toBeInTheDocument();
expect(item2).toBeInTheDocument();
});
it('renders a menu button', () => {
render(_jsx(Header, { children: "Test" }));
const component = screen.getByRole('button', { name: 'Menu' });
expect(component).toHaveClass('ams-header__mega-menu-button');
});
it('renders a menu button icon', () => {
const { container } = render(_jsx(Header, { children: "Test" }));
const component = container.querySelector('.ams-header__menu-icon');
expect(component).toBeInTheDocument();
});
it('renders a custom menu button text', () => {
render(_jsx(Header, { menuButtonText: "Custom button text", children: "Test" }));
const component = screen.getByRole('button', { name: 'Custom button text' });
expect(component).toBeInTheDocument();
});
it('renders the correct class when noMenuButtonOnWideWindow is true', () => {
render(_jsx(Header, { noMenuButtonOnWideWindow: true, children: "Test" }));
const component = screen.getByRole('listitem');
expect(component).toHaveClass('ams-header__mega-menu-button-item--hide-on-wide-window');
});
it('opens and closes the mega menu', async () => {
const user = userEvent.setup();
const { container } = render(_jsx(Header, { children: "Test" }));
const closedMegaMenu = container.querySelector('.ams-header__mega-menu--closed');
expect(closedMegaMenu).toBeInTheDocument();
const menuButton = screen.getByRole('button', { name: 'Menu' });
await user.click(menuButton);
const openMegaMenu = container.querySelector('.ams-header__mega-menu');
expect(openMegaMenu).toBeInTheDocument();
expect(openMegaMenu).not.toHaveClass('ams-header__mega-menu--closed');
});
it.skip('it closes the mega menu when it is open and the screen width passes the breakpoint', () => {
// TODO: Add this test
});
});