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');
});
});