import { test, expect, describe } from 'vitest'; import { render, screen, within } from '@testing-library/react'; import FeatureHeader from './FeatureHeader'; const TITLE_TEXT = 'Design and build accessible digital services for Scotland'; describe('feature header', () => { test('feature header renders correctly', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); const featureHeaderPrimaryElement = screen.getByTestId('feature-header-primary'); const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary'); const featureHeaderTitleElement = within(featureHeaderPrimaryElement).getByRole('heading'); const featureHeaderImageElement = screen.getByTestId('feature-header-image'); expect(featureHeaderElement).toHaveClass('ds_feature-header'); expect(featureHeaderElement.tagName).toEqual('DIV'); expect(featureHeaderPrimaryElement).toHaveClass('ds_feature-header__primary'); expect(featureHeaderPrimaryElement.tagName).toEqual('DIV'); expect(featureHeaderPrimaryElement.parentElement).toEqual(featureHeaderElement); expect(featureHeaderSecondaryElement).toHaveClass('ds_feature-header__secondary'); expect(featureHeaderSecondaryElement.tagName).toEqual('DIV'); expect(featureHeaderSecondaryElement.parentElement).toEqual(featureHeaderElement); expect(featureHeaderSecondaryElement.previousElementSibling).toEqual(featureHeaderPrimaryElement); expect(featureHeaderTitleElement).toHaveClass('ds_feature-header__title'); expect(featureHeaderTitleElement.tagName).toEqual('H1'); expect(featureHeaderTitleElement.textContent).toEqual(TITLE_TEXT); expect(featureHeaderImageElement).toHaveClass('ds_feature-header__image'); }); test('image CSS class added to svg element correctly', () => { render( ); const featureHeaderImageElement = screen.getByTestId('feature-header-image'); expect(featureHeaderImageElement).toHaveClass('ds_feature-header__image'); }); test('image CSS class added to picture element correctly', () => { render( ); const featureHeaderImageElement = screen.getByTestId('feature-header-image'); expect(featureHeaderImageElement).toHaveClass('ds_feature-header__image'); }); test('image CSS class NOT added to other elements in Secondary', () => { render(

); const featureHeaderNonImageElement = screen.getByTestId('feature-header-non-image'); expect(featureHeaderNonImageElement).not.toHaveClass('ds_feature-header__image'); }); test('ds_wrapper class included when full width', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); const featureHeaderPrimaryElement = screen.getByTestId('feature-header-primary'); const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary'); const featureHeaderWrapperElement = featureHeaderElement.querySelector('.ds_wrapper'); expect(featureHeaderWrapperElement).toBeInTheDocument(); expect(featureHeaderWrapperElement?.parentElement).toEqual(featureHeaderElement); expect(featureHeaderPrimaryElement.parentElement).toEqual(featureHeaderWrapperElement); expect(featureHeaderSecondaryElement.parentElement).toEqual(featureHeaderWrapperElement); }); test('feature header has correct CSS class for secondary background', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement).toHaveClass('ds_feature-header--background-secondary'); }); test('feature header has correct CSS class for tertiary background', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement).toHaveClass('ds_feature-header--background-tertiary'); }); test('feature header has correct CSS class for brand background', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement).toHaveClass('ds_feature-header--background'); }); test('feature header does nothing with unrecognised background colours', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); const cleanedClass = featureHeaderElement.getAttribute('class')?.trim().replace(/\s+/g, ' '); expect(cleanedClass).toEqual('ds_feature-header'); }); test('feature header as HEADER element', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement.tagName).toEqual('HEADER'); }); test('feature header with wide text', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement).toHaveClass('ds_feature-header--wide'); }); test('feature header with top aligned image', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement).toHaveClass('ds_feature-header--top'); }); test('feature header with cover image', () => { render( ); const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary'); expect(featureHeaderSecondaryElement).toHaveClass('ds_feature-header__secondary--cover'); }); test('feature header with no image padding', () => { render( ); const featureHeaderSecondaryElement = screen.getByTestId('feature-header-secondary'); expect(featureHeaderSecondaryElement).toHaveClass('ds_feature-header__secondary--no-padding'); }); test('passing additional props', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement?.dataset.test).toEqual('foo'); }); test('passing additional CSS classes', () => { render( ); const featureHeaderElement = screen.getByTestId('feature-header'); expect(featureHeaderElement).toHaveClass('foo'); }); });