import { test, expect } from 'vitest';
import { render, screen, within } from '@testing-library/react';
import Question from './Question';
test('question renders correctly (basic q, just a wrapper, invalid example)', () => {
render(
);
const questionElement = document.querySelector('.ds_question');
expect(questionElement).toBeInTheDocument();
expect(questionElement?.tagName).toEqual('DIV');
});
test('fieldset question with legend', () => {
const LEGEND_TEXT = 'My legend';
render(
);
const questionElement = screen.getByRole('group');
const legendElement = within(questionElement).getByText(LEGEND_TEXT);
expect(questionElement?.tagName).toEqual('FIELDSET');
expect(legendElement.tagName).toEqual('LEGEND');
});
test('question with hint text', () => {
const HINT_TEXT = 'My hint text';
render(
);
const questionElement = document.querySelector('.ds_question');
const hintTextElement = screen.getByRole('paragraph');
const firstQuestionChild = document.querySelector('.ds_question')?.childNodes[0]
expect(hintTextElement).toHaveClass('ds_hint-text');
expect(hintTextElement.textContent).toEqual(HINT_TEXT);
expect(hintTextElement).toBe(firstQuestionChild);
expect(hintTextElement).toHaveAttribute('id');
expect(questionElement).not.toHaveAttribute('aria-describedby');
});
test('question with error', () => {
const ERROR_MESSAGE_TEXT = 'My error message';
render(
);
const questionElement = document.querySelector('.ds_question');
const errorMessageElement = questionElement?.querySelector('.ds_question__error-message');
expect(questionElement).toHaveClass('ds_question--error');
expect(errorMessageElement).toBeInTheDocument();
expect(errorMessageElement?.textContent).toEqual(ERROR_MESSAGE_TEXT);
});
test('fieldset question with hint text', () => {
const HINT_TEXT = 'My hint text';
render(
);
const questionElement = document.querySelector('.ds_question');
const fieldsetElement = questionElement?.querySelector('fieldset');
const hintTextElement = screen.getByRole('paragraph');
expect(hintTextElement).toHaveAttribute('id');
expect(fieldsetElement).toHaveAttribute('aria-describedby', hintTextElement.id);
});
test('fieldset question with error', () => {
const ERROR_MESSAGE_TEXT = 'My error message';
render(
);
const questionElement = document.querySelector('.ds_question');
const fieldsetElement = questionElement?.querySelector('fieldset');
const errorMessageElement = questionElement?.querySelector('.ds_question__error-message');
expect(errorMessageElement).toHaveAttribute('id');
expect(fieldsetElement).toHaveAttribute('aria-describedby', errorMessageElement?.id);
});
test('passing additional props', () => {
render(
)
const questionElement = document.querySelector('.ds_question') as HTMLElement;
expect(questionElement?.dataset.test).toEqual('foo');
});
test('passing additional CSS classes', () => {
render(
)
const questionElement = document.querySelector('.ds_question');
expect(questionElement).toHaveClass('foo', 'ds_question');
});