@transferwise/components 0.0.0-experimental-131773e → 0.0.0-experimental-1bec623

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/build/listItem/Button/ListItemButton.js +2 -2
  2. package/build/listItem/Button/ListItemButton.js.map +1 -1
  3. package/build/listItem/Button/ListItemButton.mjs +2 -2
  4. package/build/listItem/Button/ListItemButton.mjs.map +1 -1
  5. package/build/listItem/ListItem.js +1 -1
  6. package/build/listItem/ListItem.js.map +1 -1
  7. package/build/listItem/ListItem.mjs +1 -1
  8. package/build/listItem/ListItem.mjs.map +1 -1
  9. package/build/main.css +5 -0
  10. package/build/styles/listItem/ListItem.css +5 -0
  11. package/build/styles/main.css +5 -0
  12. package/build/types/listItem/Button/ListItemButton.d.ts.map +1 -1
  13. package/build/types/listItem/ListItem.d.ts.map +1 -1
  14. package/package.json +1 -1
  15. package/src/listItem/AdditionalInfo/ListItemAdditionalInfo.spec.tsx +56 -0
  16. package/src/listItem/AvatarLayout/ListItemAvatarLayout.spec.tsx +59 -0
  17. package/src/listItem/AvatarView/ListItemAvatarView.spec.tsx +75 -0
  18. package/src/listItem/AvatarView/ListItemAvatarView.story.tsx +2 -2
  19. package/src/listItem/Button/ListItemButton.tsx +2 -2
  20. package/src/listItem/Checkbox/ListItemCheckbox.spec.tsx +82 -0
  21. package/src/listItem/IconButton/ListItemIconButton.spec.tsx +119 -0
  22. package/src/listItem/Image/ListItemImage.spec.tsx +27 -0
  23. package/src/listItem/ListItem.css +5 -0
  24. package/src/listItem/ListItem.less +8 -1
  25. package/src/listItem/ListItem.spec.tsx +1406 -7
  26. package/src/listItem/ListItem.tsx +2 -1
  27. package/src/listItem/Navigation/ListItemNavigation.spec.tsx +59 -0
  28. package/src/listItem/Prompt/ListItemPrompt.spec.tsx +14 -27
  29. package/src/listItem/Prompt/ListItemPrompt.story.tsx +5 -3
  30. package/src/listItem/Radio/ListItemRadio.spec.tsx +66 -0
  31. package/src/listItem/Switch/ListItemSwitch.spec.tsx +47 -0
  32. package/src/listItem/_stories/ListItem.layout.test.story.tsx +21 -1
  33. package/src/listItem/_stories/ListItem.variants.test.story.tsx +1 -1
  34. package/src/main.css +5 -0
  35. package/src/test-utils/Parameters.d.ts +0 -77
@@ -1,22 +1,49 @@
1
- import { render, screen, mockMatchMedia } from '../test-utils';
2
- import ListItem from './ListItem';
1
+ import { mockMatchMedia, render, screen } from '../test-utils';
2
+ import { Edit } from '@transferwise/icons';
3
+ import Link from '../link';
4
+ import { ListItem } from './ListItem';
3
5
 
4
6
  mockMatchMedia();
5
7
 
6
8
  describe('ListItem', () => {
9
+ const cb = () => {};
10
+ const title = '__title__';
11
+ const subtitle = '__subtitle__';
12
+ const valueTitle = '__valueTitle__';
13
+ const valueSubtitle = '__valueSubtitle__';
14
+ const additionalInfo = '__additionalInfo__';
15
+ const additionalInfoAction = '__infoAction__';
16
+ const prompt = '__prompt__';
17
+ const promptAction = '__promptAction__';
18
+ const promptWithLink = (
19
+ <>
20
+ {prompt}
21
+ <Link href="wise.com">{promptAction}</Link>
22
+ {prompt}
23
+ </>
24
+ );
25
+ const promptWithButton = (
26
+ <>
27
+ {prompt}
28
+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
29
+ <Link onClick={cb}>{promptAction}</Link>
30
+ {prompt}
31
+ </>
32
+ );
33
+
7
34
  describe('aria and a11y attributes', () => {
8
35
  it('sets id on the container', () => {
9
- render(<ListItem id="custom-id" title="Test Title" />);
36
+ render(<ListItem id="custom-id" title={title} />);
10
37
  expect(screen.getByRole('listitem')).toHaveAttribute('id', 'custom-id');
11
38
  });
12
39
 
13
40
  it('sets custom role on the container', () => {
14
- render(<ListItem title="Test Title" role="button" />);
41
+ render(<ListItem title={title} role="button" />);
15
42
  expect(screen.getByRole('button')).toBeInTheDocument();
16
43
  });
17
44
 
18
45
  it('sets aria-labelledby when provided', () => {
19
- render(<ListItem title="Test Title" aria-labelledby="Accessible label" />);
46
+ render(<ListItem title={title} aria-labelledby="Accessible label" />);
20
47
  expect(screen.getByRole('listitem')).toHaveAttribute('aria-labelledby', 'Accessible label');
21
48
  });
22
49
 
@@ -59,9 +86,1381 @@ describe('ListItem', () => {
59
86
  });
60
87
 
61
88
  it('sets aria-disabled when disabled', () => {
62
- render(<ListItem title="Disabled" disabled />);
89
+ render(<ListItem title={title} disabled />);
63
90
  expect(screen.getByRole('listitem')).toHaveAttribute('aria-disabled', 'true');
64
91
  });
92
+
93
+ describe('Switch', () => {
94
+ describe('has accessible name when used with:', () => {
95
+ it('title', () => {
96
+ render(<ListItem title={title} control={<ListItem.Switch onClick={cb} />} />);
97
+
98
+ expect(screen.getByRole('switch')).toHaveAccessibleName(title);
99
+ });
100
+
101
+ it('title and subtitle', () => {
102
+ render(
103
+ <ListItem
104
+ title={title}
105
+ subtitle={subtitle}
106
+ control={<ListItem.Switch onClick={cb} />}
107
+ />,
108
+ );
109
+
110
+ expect(screen.getByRole('switch')).toHaveAccessibleName(`${title} ${subtitle}`);
111
+ });
112
+
113
+ it('title, subtitle, and valueTitle', () => {
114
+ render(
115
+ <ListItem
116
+ title={title}
117
+ subtitle={subtitle}
118
+ valueTitle={valueTitle}
119
+ control={<ListItem.Switch onClick={cb} />}
120
+ />,
121
+ );
122
+
123
+ expect(screen.getByRole('switch')).toHaveAccessibleName(
124
+ `${title} ${subtitle} ${valueTitle}`,
125
+ );
126
+ });
127
+
128
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
129
+ render(
130
+ <ListItem
131
+ title={title}
132
+ subtitle={subtitle}
133
+ valueTitle={valueTitle}
134
+ valueSubtitle={valueSubtitle}
135
+ control={<ListItem.Switch onClick={cb} />}
136
+ />,
137
+ );
138
+
139
+ expect(screen.getByRole('switch')).toHaveAccessibleName(
140
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
141
+ );
142
+ });
143
+
144
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
145
+ render(
146
+ <ListItem
147
+ title={title}
148
+ subtitle={subtitle}
149
+ valueTitle={valueTitle}
150
+ valueSubtitle={valueSubtitle}
151
+ inverted
152
+ control={<ListItem.Switch onClick={cb} />}
153
+ />,
154
+ );
155
+
156
+ expect(screen.getByRole('switch')).toHaveAccessibleName(
157
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
158
+ );
159
+ });
160
+
161
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
162
+ render(
163
+ <ListItem
164
+ title={title}
165
+ subtitle={subtitle}
166
+ valueTitle={valueTitle}
167
+ valueSubtitle={valueSubtitle}
168
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
169
+ control={<ListItem.Switch onClick={cb} />}
170
+ />,
171
+ );
172
+ const control = screen.getByRole('switch');
173
+ expect(control).toHaveAccessibleName(
174
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
175
+ );
176
+ expect(control).toHaveAccessibleDescription(additionalInfo);
177
+ });
178
+
179
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
180
+ render(
181
+ <ListItem
182
+ title={title}
183
+ subtitle={subtitle}
184
+ valueTitle={valueTitle}
185
+ valueSubtitle={valueSubtitle}
186
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
187
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
188
+ control={<ListItem.Switch onClick={cb} />}
189
+ />,
190
+ );
191
+
192
+ const control = screen.getByRole('switch');
193
+ expect(control).toHaveAccessibleName(
194
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
195
+ );
196
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
197
+ });
198
+
199
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
200
+ render(
201
+ <ListItem
202
+ title={title}
203
+ subtitle={subtitle}
204
+ valueTitle={valueTitle}
205
+ valueSubtitle={valueSubtitle}
206
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
207
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
208
+ inverted
209
+ control={<ListItem.Switch onClick={cb} />}
210
+ />,
211
+ );
212
+
213
+ const control = screen.getByRole('switch');
214
+ expect(screen.getByRole('switch')).toHaveAccessibleName(
215
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
216
+ );
217
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
218
+ });
219
+ });
220
+ });
221
+
222
+ describe('Radio', () => {
223
+ describe('has accessible name when used with:', () => {
224
+ it('title', () => {
225
+ render(
226
+ <ListItem
227
+ title={title}
228
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
229
+ />,
230
+ );
231
+
232
+ expect(screen.getByRole('radio')).toHaveAccessibleName(title);
233
+ });
234
+
235
+ it('title and subtitle', () => {
236
+ render(
237
+ <ListItem
238
+ title={title}
239
+ subtitle={subtitle}
240
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
241
+ />,
242
+ );
243
+
244
+ expect(screen.getByRole('radio')).toHaveAccessibleName(`${title} ${subtitle}`);
245
+ });
246
+
247
+ it('title, subtitle, and valueTitle', () => {
248
+ render(
249
+ <ListItem
250
+ title={title}
251
+ subtitle={subtitle}
252
+ valueTitle={valueTitle}
253
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
254
+ />,
255
+ );
256
+
257
+ expect(screen.getByRole('radio')).toHaveAccessibleName(
258
+ `${title} ${subtitle} ${valueTitle}`,
259
+ );
260
+ });
261
+
262
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
263
+ render(
264
+ <ListItem
265
+ title={title}
266
+ subtitle={subtitle}
267
+ valueTitle={valueTitle}
268
+ valueSubtitle={valueSubtitle}
269
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
270
+ />,
271
+ );
272
+
273
+ expect(screen.getByRole('radio')).toHaveAccessibleName(
274
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
275
+ );
276
+ });
277
+
278
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
279
+ render(
280
+ <ListItem
281
+ title={title}
282
+ subtitle={subtitle}
283
+ valueTitle={valueTitle}
284
+ valueSubtitle={valueSubtitle}
285
+ inverted
286
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
287
+ />,
288
+ );
289
+
290
+ expect(screen.getByRole('radio')).toHaveAccessibleName(
291
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
292
+ );
293
+ });
294
+
295
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
296
+ render(
297
+ <ListItem
298
+ title={title}
299
+ subtitle={subtitle}
300
+ valueTitle={valueTitle}
301
+ valueSubtitle={valueSubtitle}
302
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
303
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
304
+ />,
305
+ );
306
+
307
+ const control = screen.getByRole('radio');
308
+ expect(control).toHaveAccessibleName(
309
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
310
+ );
311
+ expect(control).toHaveAccessibleDescription(additionalInfo);
312
+ });
313
+
314
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
315
+ render(
316
+ <ListItem
317
+ title={title}
318
+ subtitle={subtitle}
319
+ valueTitle={valueTitle}
320
+ valueSubtitle={valueSubtitle}
321
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
322
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
323
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
324
+ />,
325
+ );
326
+
327
+ const control = screen.getByRole('radio');
328
+ expect(control).toHaveAccessibleName(
329
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
330
+ );
331
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
332
+ });
333
+
334
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
335
+ render(
336
+ <ListItem
337
+ title={title}
338
+ subtitle={subtitle}
339
+ valueTitle={valueTitle}
340
+ valueSubtitle={valueSubtitle}
341
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
342
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
343
+ inverted
344
+ control={<ListItem.Radio name="payment" value="card" onChange={cb} />}
345
+ />,
346
+ );
347
+
348
+ const control = screen.getByRole('radio');
349
+ expect(control).toHaveAccessibleName(
350
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
351
+ );
352
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
353
+ });
354
+ });
355
+ });
356
+
357
+ describe('Navigation', () => {
358
+ describe('has accessible name when used with:', () => {
359
+ it('title', () => {
360
+ render(<ListItem title={title} control={<ListItem.Navigation href="/settings" />} />);
361
+
362
+ expect(screen.getByRole('link')).toHaveAccessibleName(title);
363
+ });
364
+
365
+ it('title and subtitle', () => {
366
+ render(
367
+ <ListItem
368
+ title={title}
369
+ subtitle={subtitle}
370
+ control={<ListItem.Navigation href="/settings" />}
371
+ />,
372
+ );
373
+
374
+ expect(screen.getByRole('link')).toHaveAccessibleName(`${title} ${subtitle}`);
375
+ });
376
+
377
+ it('title, subtitle, and valueTitle', () => {
378
+ render(
379
+ <ListItem
380
+ title={title}
381
+ subtitle={subtitle}
382
+ valueTitle={valueTitle}
383
+ control={<ListItem.Navigation href="/settings" />}
384
+ />,
385
+ );
386
+
387
+ expect(screen.getByRole('link')).toHaveAccessibleName(
388
+ `${title} ${subtitle} ${valueTitle}`,
389
+ );
390
+ });
391
+
392
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
393
+ render(
394
+ <ListItem
395
+ title={title}
396
+ subtitle={subtitle}
397
+ valueTitle={valueTitle}
398
+ valueSubtitle={valueSubtitle}
399
+ control={<ListItem.Navigation href="/settings" />}
400
+ />,
401
+ );
402
+
403
+ expect(screen.getByRole('link')).toHaveAccessibleName(
404
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
405
+ );
406
+ });
407
+
408
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
409
+ render(
410
+ <ListItem
411
+ title={title}
412
+ subtitle={subtitle}
413
+ valueTitle={valueTitle}
414
+ valueSubtitle={valueSubtitle}
415
+ inverted
416
+ control={<ListItem.Navigation href="/settings" />}
417
+ />,
418
+ );
419
+
420
+ expect(screen.getByRole('link')).toHaveAccessibleName(
421
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
422
+ );
423
+ });
424
+
425
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
426
+ render(
427
+ <ListItem
428
+ title={title}
429
+ subtitle={subtitle}
430
+ valueTitle={valueTitle}
431
+ valueSubtitle={valueSubtitle}
432
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
433
+ control={<ListItem.Navigation href="/settings" />}
434
+ />,
435
+ );
436
+
437
+ const control = screen.getByRole('link');
438
+ expect(control).toHaveAccessibleName(
439
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
440
+ );
441
+ expect(control).toHaveAccessibleDescription(additionalInfo);
442
+ });
443
+
444
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
445
+ render(
446
+ <ListItem
447
+ title={title}
448
+ subtitle={subtitle}
449
+ valueTitle={valueTitle}
450
+ valueSubtitle={valueSubtitle}
451
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
452
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
453
+ control={<ListItem.Navigation href="/settings" />}
454
+ />,
455
+ );
456
+
457
+ const control = screen.getByRole('link');
458
+ expect(control).toHaveAccessibleName(
459
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
460
+ );
461
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
462
+ });
463
+
464
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
465
+ render(
466
+ <ListItem
467
+ title={title}
468
+ subtitle={subtitle}
469
+ valueTitle={valueTitle}
470
+ valueSubtitle={valueSubtitle}
471
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
472
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
473
+ inverted
474
+ control={<ListItem.Navigation href="/settings" />}
475
+ />,
476
+ );
477
+
478
+ const control = screen.getByRole('link');
479
+ expect(control).toHaveAccessibleName(
480
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
481
+ );
482
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
483
+ });
484
+ });
485
+ });
486
+
487
+ describe('Checkbox', () => {
488
+ describe('has accessible name when used with:', () => {
489
+ it('title', () => {
490
+ render(<ListItem title={title} control={<ListItem.Checkbox onChange={cb} />} />);
491
+
492
+ expect(screen.getByRole('checkbox')).toHaveAccessibleName(title);
493
+ });
494
+
495
+ it('title and subtitle', () => {
496
+ render(
497
+ <ListItem
498
+ title={title}
499
+ subtitle={subtitle}
500
+ control={<ListItem.Checkbox onChange={cb} />}
501
+ />,
502
+ );
503
+
504
+ expect(screen.getByRole('checkbox')).toHaveAccessibleName(`${title} ${subtitle}`);
505
+ });
506
+
507
+ it('title, subtitle, and valueTitle', () => {
508
+ render(
509
+ <ListItem
510
+ title={title}
511
+ subtitle={subtitle}
512
+ valueTitle={valueTitle}
513
+ control={<ListItem.Checkbox onChange={cb} />}
514
+ />,
515
+ );
516
+
517
+ expect(screen.getByRole('checkbox')).toHaveAccessibleName(
518
+ `${title} ${subtitle} ${valueTitle}`,
519
+ );
520
+ });
521
+
522
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
523
+ render(
524
+ <ListItem
525
+ title={title}
526
+ subtitle={subtitle}
527
+ valueTitle={valueTitle}
528
+ valueSubtitle={valueSubtitle}
529
+ control={<ListItem.Checkbox onChange={cb} />}
530
+ />,
531
+ );
532
+
533
+ expect(screen.getByRole('checkbox')).toHaveAccessibleName(
534
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
535
+ );
536
+ });
537
+
538
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
539
+ render(
540
+ <ListItem
541
+ title={title}
542
+ subtitle={subtitle}
543
+ valueTitle={valueTitle}
544
+ valueSubtitle={valueSubtitle}
545
+ inverted
546
+ control={<ListItem.Checkbox onChange={cb} />}
547
+ />,
548
+ );
549
+
550
+ expect(screen.getByRole('checkbox')).toHaveAccessibleName(
551
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
552
+ );
553
+ });
554
+
555
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
556
+ render(
557
+ <ListItem
558
+ title={title}
559
+ subtitle={subtitle}
560
+ valueTitle={valueTitle}
561
+ valueSubtitle={valueSubtitle}
562
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
563
+ control={<ListItem.Checkbox onChange={cb} />}
564
+ />,
565
+ );
566
+
567
+ const control = screen.getByRole('checkbox');
568
+ expect(control).toHaveAccessibleName(
569
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
570
+ );
571
+ expect(control).toHaveAccessibleDescription(additionalInfo);
572
+ });
573
+
574
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
575
+ render(
576
+ <ListItem
577
+ title={title}
578
+ subtitle={subtitle}
579
+ valueTitle={valueTitle}
580
+ valueSubtitle={valueSubtitle}
581
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
582
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
583
+ control={<ListItem.Checkbox onChange={cb} />}
584
+ />,
585
+ );
586
+
587
+ const control = screen.getByRole('checkbox');
588
+ expect(control).toHaveAccessibleName(
589
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
590
+ );
591
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
592
+ });
593
+
594
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
595
+ render(
596
+ <ListItem
597
+ title={title}
598
+ subtitle={subtitle}
599
+ valueTitle={valueTitle}
600
+ valueSubtitle={valueSubtitle}
601
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
602
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
603
+ inverted
604
+ control={<ListItem.Checkbox onChange={cb} />}
605
+ />,
606
+ );
607
+
608
+ const control = screen.getByRole('checkbox');
609
+ expect(control).toHaveAccessibleName(
610
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
611
+ );
612
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
613
+ });
614
+ });
615
+ });
616
+
617
+ describe('IconButton', () => {
618
+ describe('Fully interactive', () => {
619
+ it('title', () => {
620
+ render(
621
+ <ListItem
622
+ title={title}
623
+ control={
624
+ <ListItem.IconButton onClick={cb}>
625
+ <Edit />
626
+ </ListItem.IconButton>
627
+ }
628
+ />,
629
+ );
630
+
631
+ expect(screen.getByRole('button')).toHaveAccessibleName(title);
632
+ });
633
+
634
+ it('title and subtitle', () => {
635
+ render(
636
+ <ListItem
637
+ title={title}
638
+ subtitle={subtitle}
639
+ control={
640
+ <ListItem.IconButton onClick={cb}>
641
+ <Edit />
642
+ </ListItem.IconButton>
643
+ }
644
+ />,
645
+ );
646
+
647
+ expect(screen.getByRole('button')).toHaveAccessibleName(`${title} ${subtitle}`);
648
+ });
649
+
650
+ it('title, subtitle, and valueTitle', () => {
651
+ render(
652
+ <ListItem
653
+ title={title}
654
+ subtitle={subtitle}
655
+ valueTitle={valueTitle}
656
+ control={
657
+ <ListItem.IconButton onClick={cb}>
658
+ <Edit />
659
+ </ListItem.IconButton>
660
+ }
661
+ />,
662
+ );
663
+
664
+ expect(screen.getByRole('button')).toHaveAccessibleName(
665
+ `${title} ${subtitle} ${valueTitle}`,
666
+ );
667
+ });
668
+
669
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
670
+ render(
671
+ <ListItem
672
+ title={title}
673
+ subtitle={subtitle}
674
+ valueTitle={valueTitle}
675
+ valueSubtitle={valueSubtitle}
676
+ control={
677
+ <ListItem.IconButton onClick={cb}>
678
+ <Edit />
679
+ </ListItem.IconButton>
680
+ }
681
+ />,
682
+ );
683
+
684
+ expect(screen.getByRole('button')).toHaveAccessibleName(
685
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
686
+ );
687
+ });
688
+
689
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
690
+ render(
691
+ <ListItem
692
+ title={title}
693
+ subtitle={subtitle}
694
+ valueTitle={valueTitle}
695
+ valueSubtitle={valueSubtitle}
696
+ inverted
697
+ control={
698
+ <ListItem.IconButton onClick={cb}>
699
+ <Edit />
700
+ </ListItem.IconButton>
701
+ }
702
+ />,
703
+ );
704
+
705
+ expect(screen.getByRole('button')).toHaveAccessibleName(
706
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
707
+ );
708
+ });
709
+
710
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
711
+ render(
712
+ <ListItem
713
+ title={title}
714
+ subtitle={subtitle}
715
+ valueTitle={valueTitle}
716
+ valueSubtitle={valueSubtitle}
717
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
718
+ control={
719
+ <ListItem.IconButton onClick={cb}>
720
+ <Edit />
721
+ </ListItem.IconButton>
722
+ }
723
+ />,
724
+ );
725
+
726
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
727
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo}`,
728
+ );
729
+ });
730
+
731
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
732
+ render(
733
+ <ListItem
734
+ title={title}
735
+ subtitle={subtitle}
736
+ valueTitle={valueTitle}
737
+ valueSubtitle={valueSubtitle}
738
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
739
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
740
+ control={
741
+ <ListItem.IconButton onClick={cb}>
742
+ <Edit />
743
+ </ListItem.IconButton>
744
+ }
745
+ />,
746
+ );
747
+
748
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
749
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt}`,
750
+ );
751
+ });
752
+
753
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
754
+ render(
755
+ <ListItem
756
+ title={title}
757
+ subtitle={subtitle}
758
+ valueTitle={valueTitle}
759
+ valueSubtitle={valueSubtitle}
760
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
761
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
762
+ inverted
763
+ control={
764
+ <ListItem.IconButton onClick={cb}>
765
+ <Edit />
766
+ </ListItem.IconButton>
767
+ }
768
+ />,
769
+ );
770
+
771
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
772
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle} ${additionalInfo} ${prompt}`,
773
+ );
774
+ });
775
+ });
776
+
777
+ describe('Partially interactive', () => {
778
+ describe('has accessible name when used with:', () => {
779
+ it('title', () => {
780
+ render(
781
+ <ListItem
782
+ title={title}
783
+ control={
784
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
785
+ <Edit />
786
+ </ListItem.IconButton>
787
+ }
788
+ />,
789
+ );
790
+
791
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(title);
792
+ });
793
+
794
+ it('title and subtitle', () => {
795
+ render(
796
+ <ListItem
797
+ title={title}
798
+ subtitle={subtitle}
799
+ control={
800
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
801
+ <Edit />
802
+ </ListItem.IconButton>
803
+ }
804
+ />,
805
+ );
806
+
807
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(`${title} ${subtitle}`);
808
+ });
809
+
810
+ it('title, subtitle, and valueTitle', () => {
811
+ render(
812
+ <ListItem
813
+ title={title}
814
+ subtitle={subtitle}
815
+ valueTitle={valueTitle}
816
+ control={
817
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
818
+ <Edit />
819
+ </ListItem.IconButton>
820
+ }
821
+ />,
822
+ );
823
+
824
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
825
+ `${title} ${subtitle} ${valueTitle}`,
826
+ );
827
+ });
828
+
829
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
830
+ render(
831
+ <ListItem
832
+ title={title}
833
+ subtitle={subtitle}
834
+ valueTitle={valueTitle}
835
+ valueSubtitle={valueSubtitle}
836
+ control={
837
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
838
+ <Edit />
839
+ </ListItem.IconButton>
840
+ }
841
+ />,
842
+ );
843
+
844
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
845
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
846
+ );
847
+ });
848
+
849
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
850
+ render(
851
+ <ListItem
852
+ title={title}
853
+ subtitle={subtitle}
854
+ valueTitle={valueTitle}
855
+ valueSubtitle={valueSubtitle}
856
+ inverted
857
+ control={
858
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
859
+ <Edit />
860
+ </ListItem.IconButton>
861
+ }
862
+ />,
863
+ );
864
+
865
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
866
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
867
+ );
868
+ });
869
+
870
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
871
+ render(
872
+ <ListItem
873
+ title={title}
874
+ subtitle={subtitle}
875
+ valueTitle={valueTitle}
876
+ valueSubtitle={valueSubtitle}
877
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
878
+ control={
879
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
880
+ <Edit />
881
+ </ListItem.IconButton>
882
+ }
883
+ />,
884
+ );
885
+
886
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
887
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo}`,
888
+ );
889
+ });
890
+
891
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with link action', () => {
892
+ render(
893
+ <ListItem
894
+ title={title}
895
+ subtitle={subtitle}
896
+ valueTitle={valueTitle}
897
+ valueSubtitle={valueSubtitle}
898
+ additionalInfo={
899
+ <ListItem.AdditionalInfo
900
+ action={{
901
+ label: additionalInfoAction,
902
+ href: 'wise.com',
903
+ }}
904
+ >
905
+ {additionalInfo}
906
+ </ListItem.AdditionalInfo>
907
+ }
908
+ control={
909
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
910
+ <Edit />
911
+ </ListItem.IconButton>
912
+ }
913
+ />,
914
+ );
915
+
916
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
917
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
918
+ );
919
+ });
920
+
921
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with button action', () => {
922
+ render(
923
+ <ListItem
924
+ title={title}
925
+ subtitle={subtitle}
926
+ valueTitle={valueTitle}
927
+ valueSubtitle={valueSubtitle}
928
+ additionalInfo={
929
+ <ListItem.AdditionalInfo action={{ label: additionalInfoAction, onClick: cb }}>
930
+ {additionalInfo}
931
+ </ListItem.AdditionalInfo>
932
+ }
933
+ control={
934
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
935
+ <Edit />
936
+ </ListItem.IconButton>
937
+ }
938
+ />,
939
+ );
940
+
941
+ expect(screen.getAllByRole('button')[0]).toHaveAccessibleDescription(
942
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
943
+ );
944
+ });
945
+
946
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
947
+ render(
948
+ <ListItem
949
+ title={title}
950
+ subtitle={subtitle}
951
+ valueTitle={valueTitle}
952
+ valueSubtitle={valueSubtitle}
953
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
954
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
955
+ control={
956
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
957
+ <Edit />
958
+ </ListItem.IconButton>
959
+ }
960
+ />,
961
+ );
962
+
963
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
964
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt}`,
965
+ );
966
+ });
967
+
968
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline link', () => {
969
+ render(
970
+ <ListItem
971
+ title={title}
972
+ subtitle={subtitle}
973
+ valueTitle={valueTitle}
974
+ valueSubtitle={valueSubtitle}
975
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
976
+ prompt={<ListItem.Prompt>{promptWithLink}</ListItem.Prompt>}
977
+ control={
978
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
979
+ <Edit />
980
+ </ListItem.IconButton>
981
+ }
982
+ />,
983
+ );
984
+
985
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
986
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
987
+ );
988
+ });
989
+
990
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline button', () => {
991
+ render(
992
+ <ListItem
993
+ title={title}
994
+ subtitle={subtitle}
995
+ valueTitle={valueTitle}
996
+ valueSubtitle={valueSubtitle}
997
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
998
+ prompt={<ListItem.Prompt>{promptWithButton}</ListItem.Prompt>}
999
+ control={
1000
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
1001
+ <Edit />
1002
+ </ListItem.IconButton>
1003
+ }
1004
+ />,
1005
+ );
1006
+
1007
+ expect(screen.getAllByRole('button')[0]).toHaveAccessibleDescription(
1008
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1009
+ );
1010
+ });
1011
+
1012
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
1013
+ render(
1014
+ <ListItem
1015
+ title={title}
1016
+ subtitle={subtitle}
1017
+ valueTitle={valueTitle}
1018
+ valueSubtitle={valueSubtitle}
1019
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1020
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1021
+ inverted
1022
+ control={
1023
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
1024
+ <Edit />
1025
+ </ListItem.IconButton>
1026
+ }
1027
+ />,
1028
+ );
1029
+
1030
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
1031
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle} ${additionalInfo} ${prompt}`,
1032
+ );
1033
+ });
1034
+ });
1035
+ });
1036
+ });
1037
+
1038
+ describe('Button', () => {
1039
+ describe('Fully interactive', () => {
1040
+ describe('has accessible name when used with:', () => {
1041
+ it('title', () => {
1042
+ render(
1043
+ <ListItem
1044
+ title={title}
1045
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1046
+ />,
1047
+ );
1048
+
1049
+ const control = screen.getByRole('button');
1050
+ expect(control).toHaveAccessibleName(title);
1051
+ expect(control).toHaveAccessibleDescription(`Save`);
1052
+ });
1053
+
1054
+ it('title and subtitle', () => {
1055
+ render(
1056
+ <ListItem
1057
+ title={title}
1058
+ subtitle={subtitle}
1059
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1060
+ />,
1061
+ );
1062
+
1063
+ const control = screen.getByRole('button');
1064
+ expect(control).toHaveAccessibleName(`${title} ${subtitle}`);
1065
+ expect(control).toHaveAccessibleDescription(`Save`);
1066
+ });
1067
+
1068
+ it('title, subtitle, and valueTitle', () => {
1069
+ render(
1070
+ <ListItem
1071
+ title={title}
1072
+ subtitle={subtitle}
1073
+ valueTitle={valueTitle}
1074
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1075
+ />,
1076
+ );
1077
+
1078
+ const control = screen.getByRole('button');
1079
+ expect(control).toHaveAccessibleName(`${title} ${subtitle} ${valueTitle}`);
1080
+ expect(control).toHaveAccessibleDescription(`Save`);
1081
+ });
1082
+
1083
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
1084
+ render(
1085
+ <ListItem
1086
+ title={title}
1087
+ subtitle={subtitle}
1088
+ valueTitle={valueTitle}
1089
+ valueSubtitle={valueSubtitle}
1090
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1091
+ />,
1092
+ );
1093
+
1094
+ const control = screen.getByRole('button');
1095
+ expect(control).toHaveAccessibleName(
1096
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1097
+ );
1098
+ expect(control).toHaveAccessibleDescription(`Save`);
1099
+ });
1100
+
1101
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
1102
+ render(
1103
+ <ListItem
1104
+ title={title}
1105
+ subtitle={subtitle}
1106
+ valueTitle={valueTitle}
1107
+ valueSubtitle={valueSubtitle}
1108
+ inverted
1109
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1110
+ />,
1111
+ );
1112
+
1113
+ const control = screen.getByRole('button');
1114
+ expect(control).toHaveAccessibleName(
1115
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1116
+ );
1117
+ expect(control).toHaveAccessibleDescription(`Save`);
1118
+ });
1119
+
1120
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
1121
+ render(
1122
+ <ListItem
1123
+ title={title}
1124
+ subtitle={subtitle}
1125
+ valueTitle={valueTitle}
1126
+ valueSubtitle={valueSubtitle}
1127
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1128
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1129
+ />,
1130
+ );
1131
+
1132
+ const control = screen.getByRole('button');
1133
+ expect(control).toHaveAccessibleName(
1134
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1135
+ );
1136
+ expect(control).toHaveAccessibleDescription(`Save ${additionalInfo}`);
1137
+ });
1138
+
1139
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
1140
+ render(
1141
+ <ListItem
1142
+ title={title}
1143
+ subtitle={subtitle}
1144
+ valueTitle={valueTitle}
1145
+ valueSubtitle={valueSubtitle}
1146
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1147
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1148
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1149
+ />,
1150
+ );
1151
+
1152
+ const control = screen.getByRole('button');
1153
+ expect(control).toHaveAccessibleName(
1154
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1155
+ );
1156
+ expect(control).toHaveAccessibleDescription(`Save ${additionalInfo} ${prompt}`);
1157
+ });
1158
+
1159
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
1160
+ render(
1161
+ <ListItem
1162
+ title={title}
1163
+ subtitle={subtitle}
1164
+ valueTitle={valueTitle}
1165
+ valueSubtitle={valueSubtitle}
1166
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1167
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1168
+ inverted
1169
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1170
+ />,
1171
+ );
1172
+
1173
+ const control = screen.getByRole('button');
1174
+ expect(control).toHaveAccessibleName(
1175
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1176
+ );
1177
+ expect(control).toHaveAccessibleDescription(`Save ${additionalInfo} ${prompt}`);
1178
+ });
1179
+ });
1180
+ });
1181
+
1182
+ describe('Partially interactive', () => {
1183
+ describe('has accessible name when used with:', () => {
1184
+ it('title', () => {
1185
+ render(
1186
+ <ListItem
1187
+ title={title}
1188
+ control={
1189
+ <ListItem.Button partiallyInteractive onClick={cb}>
1190
+ Save
1191
+ </ListItem.Button>
1192
+ }
1193
+ />,
1194
+ );
1195
+
1196
+ const control = screen.getByRole('button');
1197
+ expect(control).toHaveAccessibleName(`Save`);
1198
+ expect(control).toHaveAccessibleDescription(title);
1199
+ });
1200
+
1201
+ it('title and subtitle', () => {
1202
+ render(
1203
+ <ListItem
1204
+ title={title}
1205
+ subtitle={subtitle}
1206
+ control={
1207
+ <ListItem.Button partiallyInteractive onClick={cb}>
1208
+ Save
1209
+ </ListItem.Button>
1210
+ }
1211
+ />,
1212
+ );
1213
+
1214
+ const control = screen.getByRole('button');
1215
+ expect(control).toHaveAccessibleName(`Save`);
1216
+ expect(control).toHaveAccessibleDescription(`${title} ${subtitle}`);
1217
+ });
1218
+
1219
+ it('title, subtitle, and valueTitle', () => {
1220
+ render(
1221
+ <ListItem
1222
+ title={title}
1223
+ subtitle={subtitle}
1224
+ valueTitle={valueTitle}
1225
+ control={
1226
+ <ListItem.Button partiallyInteractive onClick={cb}>
1227
+ Save
1228
+ </ListItem.Button>
1229
+ }
1230
+ />,
1231
+ );
1232
+
1233
+ const control = screen.getByRole('button');
1234
+ expect(control).toHaveAccessibleName(`Save`);
1235
+ expect(control).toHaveAccessibleDescription(`${title} ${subtitle} ${valueTitle}`);
1236
+ });
1237
+
1238
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
1239
+ render(
1240
+ <ListItem
1241
+ title={title}
1242
+ subtitle={subtitle}
1243
+ valueTitle={valueTitle}
1244
+ valueSubtitle={valueSubtitle}
1245
+ control={
1246
+ <ListItem.Button partiallyInteractive onClick={cb}>
1247
+ Save
1248
+ </ListItem.Button>
1249
+ }
1250
+ />,
1251
+ );
1252
+
1253
+ const control = screen.getByRole('button');
1254
+ expect(control).toHaveAccessibleName(`Save`);
1255
+ expect(control).toHaveAccessibleDescription(
1256
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1257
+ );
1258
+ });
1259
+
1260
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
1261
+ render(
1262
+ <ListItem
1263
+ title={title}
1264
+ subtitle={subtitle}
1265
+ valueTitle={valueTitle}
1266
+ valueSubtitle={valueSubtitle}
1267
+ inverted
1268
+ control={
1269
+ <ListItem.Button partiallyInteractive onClick={cb}>
1270
+ Save
1271
+ </ListItem.Button>
1272
+ }
1273
+ />,
1274
+ );
1275
+
1276
+ const control = screen.getByRole('button');
1277
+ expect(control).toHaveAccessibleName(`Save`);
1278
+ expect(control).toHaveAccessibleDescription(
1279
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1280
+ );
1281
+ });
1282
+
1283
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
1284
+ render(
1285
+ <ListItem
1286
+ title={title}
1287
+ subtitle={subtitle}
1288
+ valueTitle={valueTitle}
1289
+ valueSubtitle={valueSubtitle}
1290
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1291
+ control={
1292
+ <ListItem.Button partiallyInteractive onClick={cb}>
1293
+ Save
1294
+ </ListItem.Button>
1295
+ }
1296
+ />,
1297
+ );
1298
+
1299
+ const control = screen.getByRole('button');
1300
+ expect(control).toHaveAccessibleName(`Save`);
1301
+ expect(control).toHaveAccessibleDescription(
1302
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo}`,
1303
+ );
1304
+ });
1305
+
1306
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with link action', () => {
1307
+ render(
1308
+ <ListItem
1309
+ title={title}
1310
+ subtitle={subtitle}
1311
+ valueTitle={valueTitle}
1312
+ valueSubtitle={valueSubtitle}
1313
+ additionalInfo={
1314
+ <ListItem.AdditionalInfo
1315
+ action={{
1316
+ label: additionalInfoAction,
1317
+ href: 'wise.com',
1318
+ }}
1319
+ >
1320
+ {additionalInfo}
1321
+ </ListItem.AdditionalInfo>
1322
+ }
1323
+ control={
1324
+ <ListItem.Button partiallyInteractive onClick={cb}>
1325
+ Save
1326
+ </ListItem.Button>
1327
+ }
1328
+ />,
1329
+ );
1330
+ screen.debug(undefined, 99999999);
1331
+ const control = screen.getByRole('button');
1332
+ expect(control).toHaveAccessibleName(`Save`);
1333
+ expect(control).toHaveAccessibleDescription(
1334
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
1335
+ );
1336
+ });
1337
+
1338
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with button action', () => {
1339
+ render(
1340
+ <ListItem
1341
+ title={title}
1342
+ subtitle={subtitle}
1343
+ valueTitle={valueTitle}
1344
+ valueSubtitle={valueSubtitle}
1345
+ additionalInfo={
1346
+ <ListItem.AdditionalInfo action={{ label: additionalInfoAction, onClick: cb }}>
1347
+ {additionalInfo}
1348
+ </ListItem.AdditionalInfo>
1349
+ }
1350
+ control={
1351
+ <ListItem.Button partiallyInteractive onClick={cb}>
1352
+ Save
1353
+ </ListItem.Button>
1354
+ }
1355
+ />,
1356
+ );
1357
+
1358
+ const control = screen.getAllByRole('button')[0];
1359
+ expect(control).toHaveAccessibleName(`Save`);
1360
+ expect(control).toHaveAccessibleDescription(
1361
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
1362
+ );
1363
+ });
1364
+
1365
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
1366
+ render(
1367
+ <ListItem
1368
+ title={title}
1369
+ subtitle={subtitle}
1370
+ valueTitle={valueTitle}
1371
+ valueSubtitle={valueSubtitle}
1372
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1373
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1374
+ control={
1375
+ <ListItem.Button partiallyInteractive onClick={cb}>
1376
+ Save
1377
+ </ListItem.Button>
1378
+ }
1379
+ />,
1380
+ );
1381
+
1382
+ const control = screen.getByRole('button');
1383
+ expect(control).toHaveAccessibleName(`Save`);
1384
+ expect(control).toHaveAccessibleDescription(
1385
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt}`,
1386
+ );
1387
+ });
1388
+
1389
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline link', () => {
1390
+ render(
1391
+ <ListItem
1392
+ title={title}
1393
+ subtitle={subtitle}
1394
+ valueTitle={valueTitle}
1395
+ valueSubtitle={valueSubtitle}
1396
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1397
+ prompt={<ListItem.Prompt>{promptWithLink}</ListItem.Prompt>}
1398
+ control={
1399
+ <ListItem.Button partiallyInteractive onClick={cb}>
1400
+ Save
1401
+ </ListItem.Button>
1402
+ }
1403
+ />,
1404
+ );
1405
+
1406
+ const control = screen.getByRole('button');
1407
+ expect(control).toHaveAccessibleName(`Save`);
1408
+ expect(control).toHaveAccessibleDescription(
1409
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1410
+ );
1411
+ });
1412
+
1413
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline button', () => {
1414
+ render(
1415
+ <ListItem
1416
+ title={title}
1417
+ subtitle={subtitle}
1418
+ valueTitle={valueTitle}
1419
+ valueSubtitle={valueSubtitle}
1420
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1421
+ prompt={<ListItem.Prompt>{promptWithButton}</ListItem.Prompt>}
1422
+ control={
1423
+ <ListItem.Button partiallyInteractive onClick={cb}>
1424
+ Save
1425
+ </ListItem.Button>
1426
+ }
1427
+ />,
1428
+ );
1429
+
1430
+ const control = screen.getAllByRole('button')[0];
1431
+ expect(control).toHaveAccessibleName(`Save`);
1432
+ expect(control).toHaveAccessibleDescription(
1433
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1434
+ );
1435
+ });
1436
+
1437
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
1438
+ render(
1439
+ <ListItem
1440
+ title={title}
1441
+ subtitle={subtitle}
1442
+ valueTitle={valueTitle}
1443
+ valueSubtitle={valueSubtitle}
1444
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1445
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1446
+ inverted
1447
+ control={
1448
+ <ListItem.Button partiallyInteractive onClick={cb}>
1449
+ Save
1450
+ </ListItem.Button>
1451
+ }
1452
+ />,
1453
+ );
1454
+
1455
+ const control = screen.getByRole('button');
1456
+ expect(control).toHaveAccessibleName(`Save`);
1457
+ expect(control).toHaveAccessibleDescription(
1458
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle} ${additionalInfo} ${prompt}`,
1459
+ );
1460
+ });
1461
+ });
1462
+ });
1463
+ });
65
1464
  });
66
1465
 
67
1466
  describe('spotlight', () => {
@@ -77,7 +1476,7 @@ describe('ListItem', () => {
77
1476
  <ListItem
78
1477
  title="Test Title"
79
1478
  spotlight="inactive"
80
- control={<ListItem.Switch onClick={() => {}} />}
1479
+ control={<ListItem.Switch onClick={cb} />}
81
1480
  />,
82
1481
  );
83
1482
  const listItem = screen.getByRole('listitem');