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$/)); }); }); }); });