import { test, expect, vi } from 'vitest';
import { within, render, screen } from '@testing-library/react';
import SummaryList from './SummaryList';
const ONCLICK_FUNCTION = vi.fn();
const TITLE = 'Name';
const VALUE_1 = 'Jane Smith';
const VALUE_2 = 'Tony Brown';
test('summary list renders correctly', () => {
render(
value
value2
value3
foo
true}>bar
);
const summaryList = screen.getByTestId('summarylist');
expect(summaryList).toHaveClass('ds_summary-list');
expect(summaryList.tagName).toEqual('OL');
});
test('summary list without border', () => {
render(
);
const summaryList = screen.getAllByRole('list')[0];
expect(summaryList).toHaveClass('ds_summary-list--no-border');
});
test('summary list item renders correctly', () => {
render(
{VALUE_1}
);
const item = screen.getAllByRole('listitem')[0];
const key = item.querySelector('.ds_summary-list__key');
const value = item.querySelector('.ds_summary-list__value');
const answer = value?.children[0];
const actions = item.querySelector('.ds_summary-list__actions');
expect(item).toHaveClass('ds_summary-list__item');
expect(key?.tagName).toEqual('SPAN');
expect(key?.textContent).toEqual(TITLE);
expect(value?.tagName).toEqual('SPAN');
expect(answer).toHaveClass('ds_summary-list__answer');
expect(answer?.tagName).toEqual('Q');
expect(actions?.tagName).toEqual('DIV');
expect(actions?.querySelector('.ds_link')).toHaveAttribute('aria-describedby', key?.id);
});
test('summary list item with multiple values', () => {
render(
{VALUE_1}
{VALUE_2}
);
const item = screen.getAllByRole('listitem')[0];
const value = item.querySelector('.ds_summary-list__value');
const valueList = value?.children[0];
const valueListItems = valueList?.children as HTMLCollection;
expect(valueList).toHaveClass('ds_no-bullets');
expect(valueList?.tagName).toEqual('UL');
expect(valueListItems[0].tagName).toEqual('LI');
expect(valueListItems[0].innerHTML).toEqual(`${VALUE_1}
`);
});
test('summary list item with no value', () => {
render(
);
const item = screen.getAllByRole('listitem')[0];
const value = item.querySelector('.ds_summary-list__value');
expect(value?.textContent).toEqual('');
});
test('summary list item with multiple actions', () => {
const ITEM_ACTIONS = [
{
title: 'Change',
href: '#foo'
},
{
title: 'Delete',
onclick: ONCLICK_FUNCTION
}
];
render(
{VALUE_1}
{ITEM_ACTIONS[0].title}
{ITEM_ACTIONS[1].title}
);
const item = screen.getAllByRole('listitem')[0];
const actionsElement = item.querySelector('.ds_summary-list__actions');
const actionsList = within(actionsElement as HTMLElement).getByRole('list')
expect(actionsList).toHaveClass('ds_summary-list__actions-list');
expect(actionsList.tagName).toEqual('UL');
expect(actionsList?.children.length).toEqual(2);
expect(actionsList?.children[0]).toHaveClass('ds_summary-list__actions-list-item');
expect(actionsList?.children[0].tagName).toEqual('LI');
expect(actionsList?.children[0].textContent).toEqual(ITEM_ACTIONS[0].title);
expect(actionsList?.children[1].textContent).toEqual(ITEM_ACTIONS[1].title);
});
test('summary list item with no actions has no actions container', () => {
render(
{VALUE_1}
);
const item = screen.getAllByRole('listitem')[0];
const actions = item.querySelector('.ds_summary-list__actions');
expect(actions).not.toBeInTheDocument();
});
test('passing additional props', () => {
render(
);
const summaryList = screen.getAllByRole('list')[0];
expect(summaryList?.dataset.test).toEqual('foo');
});
test('passing additional CSS classes', () => {
render(
);
const summaryList = screen.getAllByRole('list')[0];
expect(summaryList).toHaveClass('foo', 'ds_summary-list');
});