import { Breakpoint, Size } from '../common'; import { mockMatchMedia } from '../mocks'; import { render, screen } from '../test-utils'; import Decision, { DecisionPresentation, DecisionType } from '.'; import { DecisionProps } from './Decision'; import AvatarView from '../avatarView'; mockMatchMedia(jest); describe('Decision', () => { const commonProps: DecisionProps = { options: [ { media: { list: , block: alt, }, href: '#href', title: 'title', description: 'description', 'aria-label': 'A label', onClick: jest.fn(), }, ], presentation: DecisionPresentation.LIST_BLOCK, type: DecisionType.NAVIGATION, }; const initialInnerWidth = window.innerWidth; const resetClientWidth = (width: number) => { window.innerWidth = width; }; afterAll(() => { window.innerWidth = initialInnerWidth; }); beforeEach(() => { resetClientWidth(Breakpoint.EXTRA_SMALL - 1); }); describe(`when presentation is ${DecisionPresentation.LIST_BLOCK}`, () => { const props = { ...commonProps }; it('renders only Navigation Option before first breakpoint', () => { render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementToBeNavigationOption(element); expectElementNotToBeTile(element); }); it('renders only Tile after first breakpoint', () => { resetClientWidth(Breakpoint.SMALL); render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementNotToBeNavigationOption(element); expectElementToBeTile(element); expectElementNotToBeSmallTile(element); }); }); describe(`when presentation is ${DecisionPresentation.LIST_BLOCK_GRID}`, () => { const props = { ...commonProps, presentation: DecisionPresentation.LIST_BLOCK_GRID }; it('renders only Navigation Option before first breakpoint', () => { render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementToBeNavigationOption(element); expectElementNotToBeTile(element); }); it('renders only Tile after first breakpoint', () => { resetClientWidth(Breakpoint.SMALL); render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementNotToBeNavigationOption(element); expectElementToBeTile(element); expectElementNotToBeSmallTile(element); }); it('renders container as a grid', () => { resetClientWidth(Breakpoint.SMALL); render(); const element = screen.getByLabelText('A label').parentElement; expect(element).toHaveClass('np-decision'); expect(element).toHaveClass('np-decision--grid'); expect(element).toHaveClass('flex-wrap'); }); }); describe(`when presentation is ${DecisionPresentation.LIST_BLOCK} and size is Small`, () => { const props: DecisionProps = { ...commonProps, presentation: DecisionPresentation.LIST_BLOCK, size: Size.SMALL, }; it('renders only Navigation Option before breakpoint', () => { render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementToBeNavigationOption(element); expectElementNotToBeTile(element); }); it('renders Small Tile after breakpoint', () => { resetClientWidth(Breakpoint.EXTRA_SMALL); render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementNotToBeNavigationOption(element); expectElementToBeTile(element); expectElementToBeSmallTile(element); }); }); describe(`when presentation is ${DecisionPresentation.LIST}`, () => { const props = { ...commonProps, presentation: DecisionPresentation.LIST }; it('renders Navigation Option before breakpoint', () => { render(); const element = screen.getByLabelText('A label'); expect(element).toBeInTheDocument(); expectElementToBeNavigationOption(element); expectElementNotToBeTile(element); }); }); const expectElementToBeNavigationOption = (element: HTMLElement) => { expect(element).toHaveClass('np-navigation-option'); }; const expectElementNotToBeNavigationOption = (element: HTMLElement) => { expect(element).not.toHaveClass('np-navigation-option'); }; const expectElementToBeTile = (element: HTMLElement) => { expect(element).toHaveClass('np-tile'); }; const expectElementNotToBeTile = (element: HTMLElement) => { expect(element).not.toHaveClass('np-tile'); }; const expectElementToBeSmallTile = (element: HTMLElement) => { expect(element).toHaveClass('np-tile--small'); }; const expectElementNotToBeSmallTile = (element: HTMLElement) => { expect(element).not.toHaveClass('np-tile--small'); }; });