@transferwise/components 46.103.1 → 46.105.0

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