import { mockMatchMedia, render, screen } from '../test-utils';
import { Edit } from '@transferwise/icons';
import Link from '../link';
import { ListItem } from './ListItem';
mockMatchMedia();
describe('ListItem', () => {
const cb = () => {};
const title = '__title__';
const subtitle = '__subtitle__';
const valueTitle = '__valueTitle__';
const valueSubtitle = '__valueSubtitle__';
const additionalInfo = '__additionalInfo__';
const additionalInfoAction = '__infoAction__';
const prompt = '__prompt__';
const disabledPromptMessage = '__disabledPromptMessage__';
const promptAction = '__promptAction__';
const promptWithLink = (
<>
{prompt}
{promptAction}
{prompt}
>
);
const promptWithButton = (
<>
{prompt}
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
{promptAction}
{prompt}
>
);
describe('aria and a11y attributes', () => {
it('sets id on the container', () => {
render();
expect(screen.getByRole('listitem')).toHaveAttribute('id', 'custom-id');
});
it('sets aria-describedby with correct IDs for fully interactive list item with prompt and additionalInfo', () => {
render(
Hello}
additionalInfo={Additional Info}
prompt={Hello}
/>,
);
const item = screen.getByRole('button');
const describedBy = item.getAttribute('aria-describedby') || '';
expect(describedBy).toMatch(/_additional-info/);
expect(describedBy).toMatch(/_prompt/);
});
it('sets aria-describedby with correct IDs for partially interactive list item with title, subtitle, value, subvalue, prompt and additionalInfo', () => {
render(
Hello}
additionalInfo={Additional Info}
prompt={Hello}
/>,
);
const item = screen.getByRole('button');
const describedBy = item.getAttribute('aria-describedby') || '';
expect(describedBy).toMatch(/_additional-info/);
expect(describedBy).toMatch(/_prompt/);
expect(describedBy).toMatch(/_title/);
expect(describedBy).toMatch(/_subtitle/);
expect(describedBy).toMatch(/_value/);
expect(describedBy).toMatch(/_value-subtitle/);
});
it('sets aria-disabled when disabled', () => {
render();
expect(screen.getByRole('listitem')).toHaveAttribute('aria-disabled', 'true');
});
describe('Switch', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(} />);
expect(screen.getByRole('switch')).toHaveAccessibleName(title);
});
it('title and subtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('switch')).toHaveAccessibleName(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
}
/>,
);
expect(screen.getByRole('switch')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('switch')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
}
/>,
);
expect(screen.getByRole('switch')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={}
/>,
);
const control = screen.getByRole('switch');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(additionalInfo);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={}
/>,
);
const control = screen.getByRole('switch');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={}
/>,
);
const control = screen.getByRole('switch');
expect(screen.getByRole('switch')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
});
});
describe('Radio', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(
}
/>,
);
expect(screen.getByRole('radio')).toHaveAccessibleName(title);
});
it('title and subtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('radio')).toHaveAccessibleName(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
}
/>,
);
expect(screen.getByRole('radio')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('radio')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
}
/>,
);
expect(screen.getByRole('radio')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={}
/>,
);
const control = screen.getByRole('radio');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(additionalInfo);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={}
/>,
);
const control = screen.getByRole('radio');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={}
/>,
);
const control = screen.getByRole('radio');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
});
});
describe('Navigation', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(} />);
expect(screen.getByRole('link')).toHaveAccessibleName(title);
});
it('title and subtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('link')).toHaveAccessibleName(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
}
/>,
);
expect(screen.getByRole('link')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('link')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
}
/>,
);
expect(screen.getByRole('link')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={}
/>,
);
const control = screen.getByRole('link');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(additionalInfo);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={}
/>,
);
const control = screen.getByRole('link');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={}
/>,
);
const control = screen.getByRole('link');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
});
});
describe('Checkbox', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(} />);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(title);
});
it('title and subtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
}
/>,
);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
}
/>,
);
expect(screen.getByRole('checkbox')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={}
/>,
);
const control = screen.getByRole('checkbox');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(additionalInfo);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={}
/>,
);
const control = screen.getByRole('checkbox');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={}
/>,
);
const control = screen.getByRole('checkbox');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
});
});
describe('IconButton', () => {
describe('Fully interactive', () => {
it('title', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(title);
});
it('title and subtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(additionalInfo);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
});
describe('Partially interactive', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(title);
});
it('title and subtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={
}
/>,
);
expect(screen.getByRole('button')).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(screen.getByRole('button')).toHaveAccessibleDescription(additionalInfo);
});
it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with link action', () => {
render(
{additionalInfo}
}
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(
`${additionalInfo} ${additionalInfoAction}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with button action', () => {
render(
{additionalInfo}
}
control={
}
/>,
);
const control = screen.getAllByRole('button')[0];
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(
`${additionalInfo} ${additionalInfoAction}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline link', () => {
render(
{additionalInfo}}
prompt={{promptWithLink}}
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(screen.getByRole('button')).toHaveAccessibleDescription(
`${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline button', () => {
render(
{additionalInfo}}
prompt={{promptWithButton}}
control={
}
/>,
);
const control = screen.getAllByRole('button')[0];
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(
`${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
});
});
});
});
describe('Button', () => {
describe('Fully interactive', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(
Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(title);
expect(control).toHaveAccessibleDescription(`Save`);
});
it('title and subtitle', () => {
render(
Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`${title} ${subtitle}`);
expect(control).toHaveAccessibleDescription(`Save`);
});
it('title, subtitle, and valueTitle', () => {
render(
Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`${title} ${subtitle} ${valueTitle}`);
expect(control).toHaveAccessibleDescription(`Save`);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`Save`);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`Save`);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`Save ${additionalInfo}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
expect(control).toHaveAccessibleDescription(`Save ${additionalInfo} ${prompt}`);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={Save}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
expect(control).toHaveAccessibleDescription(`Save ${additionalInfo} ${prompt}`);
});
});
});
describe('Partially interactive', () => {
describe('has accessible name when used with:', () => {
it('title', () => {
render(
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(title);
});
it('title and subtitle', () => {
render(
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(`${title} ${subtitle}`);
});
it('title, subtitle, and valueTitle', () => {
render(
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(`${title} ${subtitle} ${valueTitle}`);
});
it('title, subtitle, valueTitle, and valueSubtitle', () => {
render(
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
render(
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
render(
{additionalInfo}}
control={
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with link action', () => {
render(
{additionalInfo}
}
control={
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with button action', () => {
render(
{additionalInfo}
}
control={
Save
}
/>,
);
const control = screen.getAllByRole('button')[0];
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
render(
{additionalInfo}}
prompt={{prompt}}
control={
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline link', () => {
render(
{additionalInfo}}
prompt={{promptWithLink}}
control={
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline button', () => {
render(
{additionalInfo}}
prompt={{promptWithButton}}
control={
Save
}
/>,
);
const control = screen.getAllByRole('button')[0];
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
);
});
it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
render(
{additionalInfo}}
prompt={{prompt}}
inverted
control={
Save
}
/>,
);
const control = screen.getByRole('button');
expect(control).toHaveAccessibleName(`Save`);
expect(control).toHaveAccessibleDescription(
`${subtitle} ${title} ${valueSubtitle} ${valueTitle} ${additionalInfo} ${prompt}`,
);
});
});
});
});
});
describe('spotlight', () => {
it('only fully interactive variant can have spotlight:active', () => {
render(} />);
const listItem = screen.getByRole('listitem');
expect(listItem).toHaveClass('wds-list-item-interactive');
expect(listItem).toHaveClass('wds-list-item-spotlight-active');
expect(listItem.querySelector('.wds-list-item-spotlight__border')).not.toBeInTheDocument();
});
it('only fully interactive variant can have spotlight:inactive', () => {
render(
}
/>,
);
const listItem = screen.getByRole('listitem');
expect(listItem).toHaveClass('wds-list-item-interactive');
expect(listItem).toHaveClass('wds-list-item-spotlight-inactive');
expect(listItem.querySelector('.wds-list-item-spotlight__border')).toBeInTheDocument();
});
it('non interactive variant cannot have spotlight', () => {
render();
const listItem = screen.getByRole('listitem');
expect(listItem).toHaveClass('wds-list-item-non-interactive');
expect(listItem).not.toHaveClass('wds-list-item-interactive');
expect(listItem).not.toHaveClass('wds-list-item-spotlight-inactive');
expect(listItem).not.toHaveClass('wds-list-item-spotlight-active');
expect(listItem.querySelector('.wds-list-item-spotlight__border')).not.toBeInTheDocument();
});
});
describe('disable states', () => {
describe('short-lived', () => {
it('should override existing prompt if disabled and disabledPromptMessage are set', () => {
render(
{prompt}}
disabled
disabledPromptMessage={disabledPromptMessage}
/>,
);
expect(screen.queryByText(prompt)).not.toBeInTheDocument();
expect(screen.getByText(disabledPromptMessage)).toBeInTheDocument();
expect(
screen.getByTestId('InlinePrompt_Muted').parentNode?.parentNode?.parentNode,
).toHaveAttribute('id', expect.stringMatching(/_prompt$/));
});
it('should render muted prompt if disabled and disabledPromptMessage are set', () => {
render(
,
);
expect(screen.getByText(disabledPromptMessage)).toBeInTheDocument();
expect(
screen.getByTestId('InlinePrompt_Muted').parentNode?.parentNode?.parentNode,
).toHaveAttribute('id', expect.stringMatching(/_prompt$/));
});
});
});
});