@transferwise/components 0.0.0-experimental-e06e456 → 0.0.0-experimental-e3978a5

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 (201) hide show
  1. package/build/index.js +2 -0
  2. package/build/index.js.map +1 -1
  3. package/build/index.mjs +1 -0
  4. package/build/index.mjs.map +1 -1
  5. package/build/listItem/AdditionalInfo/ListItemAdditionalInfo.js +56 -0
  6. package/build/listItem/AdditionalInfo/ListItemAdditionalInfo.js.map +1 -0
  7. package/build/listItem/AdditionalInfo/ListItemAdditionalInfo.mjs +54 -0
  8. package/build/listItem/AdditionalInfo/ListItemAdditionalInfo.mjs.map +1 -0
  9. package/build/listItem/AvatarLayout/ListItemAvatarLayout.js +23 -0
  10. package/build/listItem/AvatarLayout/ListItemAvatarLayout.js.map +1 -0
  11. package/build/listItem/AvatarLayout/ListItemAvatarLayout.mjs +21 -0
  12. package/build/listItem/AvatarLayout/ListItemAvatarLayout.mjs.map +1 -0
  13. package/build/listItem/AvatarView/ListItemAvatarView.js +23 -0
  14. package/build/listItem/AvatarView/ListItemAvatarView.js.map +1 -0
  15. package/build/listItem/AvatarView/ListItemAvatarView.mjs +21 -0
  16. package/build/listItem/AvatarView/ListItemAvatarView.mjs.map +1 -0
  17. package/build/listItem/Button/ListItemButton.js +43 -0
  18. package/build/listItem/Button/ListItemButton.js.map +1 -0
  19. package/build/listItem/Button/ListItemButton.mjs +41 -0
  20. package/build/listItem/Button/ListItemButton.mjs.map +1 -0
  21. package/build/listItem/Checkbox/ListItemCheckbox.js +30 -0
  22. package/build/listItem/Checkbox/ListItemCheckbox.js.map +1 -0
  23. package/build/listItem/Checkbox/ListItemCheckbox.mjs +28 -0
  24. package/build/listItem/Checkbox/ListItemCheckbox.mjs.map +1 -0
  25. package/build/listItem/IconButton/ListItemIconButton.js +56 -0
  26. package/build/listItem/IconButton/ListItemIconButton.js.map +1 -0
  27. package/build/listItem/IconButton/ListItemIconButton.mjs +54 -0
  28. package/build/listItem/IconButton/ListItemIconButton.mjs.map +1 -0
  29. package/build/listItem/Image/ListItemImage.js +31 -0
  30. package/build/listItem/Image/ListItemImage.js.map +1 -0
  31. package/build/listItem/Image/ListItemImage.mjs +29 -0
  32. package/build/listItem/Image/ListItemImage.mjs.map +1 -0
  33. package/build/listItem/ListItem.js +313 -0
  34. package/build/listItem/ListItem.js.map +1 -0
  35. package/build/listItem/ListItem.mjs +308 -0
  36. package/build/listItem/ListItem.mjs.map +1 -0
  37. package/build/listItem/ListItemContext.js +8 -0
  38. package/build/listItem/ListItemContext.js.map +1 -0
  39. package/build/listItem/ListItemContext.mjs +6 -0
  40. package/build/listItem/ListItemContext.mjs.map +1 -0
  41. package/build/listItem/Navigation/ListItemNavigation.js +44 -0
  42. package/build/listItem/Navigation/ListItemNavigation.js.map +1 -0
  43. package/build/listItem/Navigation/ListItemNavigation.mjs +42 -0
  44. package/build/listItem/Navigation/ListItemNavigation.mjs.map +1 -0
  45. package/build/listItem/Prompt/ListItemPrompt.js +59 -0
  46. package/build/listItem/Prompt/ListItemPrompt.js.map +1 -0
  47. package/build/listItem/Prompt/ListItemPrompt.mjs +54 -0
  48. package/build/listItem/Prompt/ListItemPrompt.mjs.map +1 -0
  49. package/build/listItem/Radio/ListItemRadio.js +30 -0
  50. package/build/listItem/Radio/ListItemRadio.js.map +1 -0
  51. package/build/listItem/Radio/ListItemRadio.mjs +28 -0
  52. package/build/listItem/Radio/ListItemRadio.mjs.map +1 -0
  53. package/build/listItem/Switch/ListItemSwitch.js +30 -0
  54. package/build/listItem/Switch/ListItemSwitch.js.map +1 -0
  55. package/build/listItem/Switch/ListItemSwitch.mjs +28 -0
  56. package/build/listItem/Switch/ListItemSwitch.mjs.map +1 -0
  57. package/build/listItem/useListItemControl.js +22 -0
  58. package/build/listItem/useListItemControl.js.map +1 -0
  59. package/build/listItem/useListItemControl.mjs +20 -0
  60. package/build/listItem/useListItemControl.mjs.map +1 -0
  61. package/build/listItem/useListItemMedia.js +21 -0
  62. package/build/listItem/useListItemMedia.js.map +1 -0
  63. package/build/listItem/useListItemMedia.mjs +19 -0
  64. package/build/listItem/useListItemMedia.mjs.map +1 -0
  65. package/build/main.css +771 -1
  66. package/build/styles/button/Button.css +1 -1
  67. package/build/styles/listItem/ListItem.css +770 -0
  68. package/build/styles/listItem/ListItem.grid.css +370 -0
  69. package/build/styles/main.css +771 -1
  70. package/build/types/index.d.ts +2 -0
  71. package/build/types/index.d.ts.map +1 -1
  72. package/build/types/listItem/AdditionalInfo/ListItemAdditionalInfo.d.ts +15 -0
  73. package/build/types/listItem/AdditionalInfo/ListItemAdditionalInfo.d.ts.map +1 -0
  74. package/build/types/listItem/AdditionalInfo/index.d.ts +3 -0
  75. package/build/types/listItem/AdditionalInfo/index.d.ts.map +1 -0
  76. package/build/types/listItem/AvatarLayout/ListItemAvatarLayout.d.ts +18 -0
  77. package/build/types/listItem/AvatarLayout/ListItemAvatarLayout.d.ts.map +1 -0
  78. package/build/types/listItem/AvatarLayout/index.d.ts +3 -0
  79. package/build/types/listItem/AvatarLayout/index.d.ts.map +1 -0
  80. package/build/types/listItem/AvatarView/ListItemAvatarView.d.ts +16 -0
  81. package/build/types/listItem/AvatarView/ListItemAvatarView.d.ts.map +1 -0
  82. package/build/types/listItem/AvatarView/index.d.ts +3 -0
  83. package/build/types/listItem/AvatarView/index.d.ts.map +1 -0
  84. package/build/types/listItem/Button/ListItemButton.d.ts +20 -0
  85. package/build/types/listItem/Button/ListItemButton.d.ts.map +1 -0
  86. package/build/types/listItem/Button/index.d.ts +3 -0
  87. package/build/types/listItem/Button/index.d.ts.map +1 -0
  88. package/build/types/listItem/Checkbox/ListItemCheckbox.d.ts +14 -0
  89. package/build/types/listItem/Checkbox/ListItemCheckbox.d.ts.map +1 -0
  90. package/build/types/listItem/Checkbox/index.d.ts +3 -0
  91. package/build/types/listItem/Checkbox/index.d.ts.map +1 -0
  92. package/build/types/listItem/IconButton/ListItemIconButton.d.ts +18 -0
  93. package/build/types/listItem/IconButton/ListItemIconButton.d.ts.map +1 -0
  94. package/build/types/listItem/IconButton/index.d.ts +3 -0
  95. package/build/types/listItem/IconButton/index.d.ts.map +1 -0
  96. package/build/types/listItem/Image/ListItemImage.d.ts +25 -0
  97. package/build/types/listItem/Image/ListItemImage.d.ts.map +1 -0
  98. package/build/types/listItem/Image/index.d.ts +3 -0
  99. package/build/types/listItem/Image/index.d.ts.map +1 -0
  100. package/build/types/listItem/ListItem.d.ts +113 -0
  101. package/build/types/listItem/ListItem.d.ts.map +1 -0
  102. package/build/types/listItem/ListItemContext.d.ts +21 -0
  103. package/build/types/listItem/ListItemContext.d.ts.map +1 -0
  104. package/build/types/listItem/Navigation/ListItemNavigation.d.ts +15 -0
  105. package/build/types/listItem/Navigation/ListItemNavigation.d.ts.map +1 -0
  106. package/build/types/listItem/Navigation/index.d.ts +3 -0
  107. package/build/types/listItem/Navigation/index.d.ts.map +1 -0
  108. package/build/types/listItem/Prompt/ListItemPrompt.d.ts +16 -0
  109. package/build/types/listItem/Prompt/ListItemPrompt.d.ts.map +1 -0
  110. package/build/types/listItem/Prompt/index.d.ts +3 -0
  111. package/build/types/listItem/Prompt/index.d.ts.map +1 -0
  112. package/build/types/listItem/Radio/ListItemRadio.d.ts +14 -0
  113. package/build/types/listItem/Radio/ListItemRadio.d.ts.map +1 -0
  114. package/build/types/listItem/Radio/index.d.ts +3 -0
  115. package/build/types/listItem/Radio/index.d.ts.map +1 -0
  116. package/build/types/listItem/Switch/ListItemSwitch.d.ts +14 -0
  117. package/build/types/listItem/Switch/ListItemSwitch.d.ts.map +1 -0
  118. package/build/types/listItem/Switch/index.d.ts +3 -0
  119. package/build/types/listItem/Switch/index.d.ts.map +1 -0
  120. package/build/types/listItem/_stories/helpers.d.ts +27 -0
  121. package/build/types/listItem/_stories/helpers.d.ts.map +1 -0
  122. package/build/types/listItem/_stories/subcomponents.d.ts +18 -0
  123. package/build/types/listItem/_stories/subcomponents.d.ts.map +1 -0
  124. package/build/types/listItem/index.d.ts +14 -0
  125. package/build/types/listItem/index.d.ts.map +1 -0
  126. package/build/types/listItem/test-utils.d.ts +7 -0
  127. package/build/types/listItem/test-utils.d.ts.map +1 -0
  128. package/build/types/listItem/useListItemControl.d.ts +5 -0
  129. package/build/types/listItem/useListItemControl.d.ts.map +1 -0
  130. package/build/types/listItem/useListItemMedia.d.ts +6 -0
  131. package/build/types/listItem/useListItemMedia.d.ts.map +1 -0
  132. package/package.json +1 -1
  133. package/src/button/Button.css +1 -1
  134. package/src/button/Button.less +1 -1
  135. package/src/button/Button.story.tsx +4 -9
  136. package/src/index.ts +15 -0
  137. package/src/list/List.story.tsx +13 -3
  138. package/src/listItem/AdditionalInfo/ListItemAdditionalInfo.spec.tsx +56 -0
  139. package/src/listItem/AdditionalInfo/ListItemAdditionalInfo.story.tsx +198 -0
  140. package/src/listItem/AdditionalInfo/ListItemAdditionalInfo.tsx +36 -0
  141. package/src/listItem/AdditionalInfo/index.ts +2 -0
  142. package/src/listItem/AvatarLayout/ListItemAvatarLayout.spec.tsx +59 -0
  143. package/src/listItem/AvatarLayout/ListItemAvatarLayout.story.tsx +124 -0
  144. package/src/listItem/AvatarLayout/ListItemAvatarLayout.tsx +27 -0
  145. package/src/listItem/AvatarLayout/index.ts +2 -0
  146. package/src/listItem/AvatarView/ListItemAvatarView.spec.tsx +75 -0
  147. package/src/listItem/AvatarView/ListItemAvatarView.story.tsx +339 -0
  148. package/src/listItem/AvatarView/ListItemAvatarView.tsx +27 -0
  149. package/src/listItem/AvatarView/index.ts +2 -0
  150. package/src/listItem/Button/ListItemButton.spec.tsx +68 -0
  151. package/src/listItem/Button/ListItemButton.story.tsx +473 -0
  152. package/src/listItem/Button/ListItemButton.tsx +56 -0
  153. package/src/listItem/Button/index.ts +2 -0
  154. package/src/listItem/Checkbox/ListItemCheckbox.spec.tsx +82 -0
  155. package/src/listItem/Checkbox/ListItemCheckbox.story.tsx +128 -0
  156. package/src/listItem/Checkbox/ListItemCheckbox.tsx +33 -0
  157. package/src/listItem/Checkbox/index.ts +2 -0
  158. package/src/listItem/IconButton/ListItemIconButton.spec.tsx +119 -0
  159. package/src/listItem/IconButton/ListItemIconButton.story.tsx +284 -0
  160. package/src/listItem/IconButton/ListItemIconButton.tsx +73 -0
  161. package/src/listItem/IconButton/index.ts +2 -0
  162. package/src/listItem/Image/ListItemImage.spec.tsx +30 -0
  163. package/src/listItem/Image/ListItemImage.story.tsx +80 -0
  164. package/src/listItem/Image/ListItemImage.tsx +46 -0
  165. package/src/listItem/Image/index.ts +2 -0
  166. package/src/listItem/ListItem.css +770 -0
  167. package/src/listItem/ListItem.grid.css +370 -0
  168. package/src/listItem/ListItem.grid.less +622 -0
  169. package/src/listItem/ListItem.less +421 -0
  170. package/src/listItem/ListItem.spec.tsx +1521 -0
  171. package/src/listItem/ListItem.tsx +444 -0
  172. package/src/listItem/ListItemContext.tsx +26 -0
  173. package/src/listItem/Navigation/ListItemNavigation.spec.tsx +59 -0
  174. package/src/listItem/Navigation/ListItemNavigation.story.tsx +112 -0
  175. package/src/listItem/Navigation/ListItemNavigation.tsx +39 -0
  176. package/src/listItem/Navigation/index.ts +2 -0
  177. package/src/listItem/Prompt/ListItemPrompt.spec.tsx +36 -0
  178. package/src/listItem/Prompt/ListItemPrompt.story.tsx +204 -0
  179. package/src/listItem/Prompt/ListItemPrompt.tsx +32 -0
  180. package/src/listItem/Prompt/index.ts +2 -0
  181. package/src/listItem/Radio/ListItemRadio.spec.tsx +66 -0
  182. package/src/listItem/Radio/ListItemRadio.story.tsx +111 -0
  183. package/src/listItem/Radio/ListItemRadio.tsx +33 -0
  184. package/src/listItem/Radio/index.ts +2 -0
  185. package/src/listItem/Switch/ListItemSwitch.spec.tsx +47 -0
  186. package/src/listItem/Switch/ListItemSwitch.story.tsx +79 -0
  187. package/src/listItem/Switch/ListItemSwitch.tsx +33 -0
  188. package/src/listItem/Switch/index.ts +2 -0
  189. package/src/listItem/_stories/ListItem.focus.test.story.tsx +265 -0
  190. package/src/listItem/_stories/ListItem.layout.test.story.tsx +354 -0
  191. package/src/listItem/_stories/ListItem.scenarios.story.tsx +228 -0
  192. package/src/listItem/_stories/ListItem.story.tsx +775 -0
  193. package/src/listItem/_stories/ListItem.variants.test.story.tsx +271 -0
  194. package/src/listItem/_stories/helpers.tsx +53 -0
  195. package/src/listItem/_stories/subcomponents.tsx +139 -0
  196. package/src/listItem/index.ts +14 -0
  197. package/src/listItem/test-utils.tsx +33 -0
  198. package/src/listItem/useListItemControl.tsx +18 -0
  199. package/src/listItem/useListItemMedia.tsx +16 -0
  200. package/src/main.css +771 -1
  201. package/src/main.less +1 -0
@@ -0,0 +1,1521 @@
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 custom role on the container', () => {
41
+ render(<ListItem title={title} role="button" />);
42
+ expect(screen.getByRole('button')).toBeInTheDocument();
43
+ });
44
+
45
+ it('sets aria-labelledby when provided', () => {
46
+ render(<ListItem title={title} aria-labelledby="Accessible label" />);
47
+ expect(screen.getByRole('listitem')).toHaveAttribute('aria-labelledby', 'Accessible label');
48
+ });
49
+
50
+ it('sets aria-describedby with correct IDs for fully interactive list item with prompt and additionalInfo', () => {
51
+ render(
52
+ <ListItem
53
+ title="Title"
54
+ subtitle="Subtitle"
55
+ control={<ListItem.Button>Hello</ListItem.Button>}
56
+ additionalInfo={<ListItem.AdditionalInfo>Additional Info</ListItem.AdditionalInfo>}
57
+ prompt={<ListItem.Prompt sentiment="positive">Hello</ListItem.Prompt>}
58
+ />,
59
+ );
60
+ const item = screen.getByRole('button');
61
+ const describedBy = item.getAttribute('aria-describedby') || '';
62
+ expect(describedBy).toMatch(/_additional-info/);
63
+ expect(describedBy).toMatch(/_prompt/);
64
+ });
65
+
66
+ it('sets aria-describedby with correct IDs for partially interactive list item with title, subtitle, value, subvalue, prompt and additionalInfo', () => {
67
+ render(
68
+ <ListItem
69
+ title="Title"
70
+ subtitle="Subtitle"
71
+ valueTitle="100"
72
+ valueSubtitle="200"
73
+ control={<ListItem.Button partiallyInteractive>Hello</ListItem.Button>}
74
+ additionalInfo={<ListItem.AdditionalInfo>Additional Info</ListItem.AdditionalInfo>}
75
+ prompt={<ListItem.Prompt sentiment="negative">Hello</ListItem.Prompt>}
76
+ />,
77
+ );
78
+ const item = screen.getByRole('button');
79
+ const describedBy = item.getAttribute('aria-describedby') || '';
80
+ expect(describedBy).toMatch(/_additional-info/);
81
+ expect(describedBy).toMatch(/_prompt/);
82
+ expect(describedBy).toMatch(/_title/);
83
+ expect(describedBy).toMatch(/_subtitle/);
84
+ expect(describedBy).toMatch(/_value/);
85
+ expect(describedBy).toMatch(/_value-subtitle/);
86
+ });
87
+
88
+ it('sets aria-disabled when disabled', () => {
89
+ render(<ListItem title={title} disabled />);
90
+ expect(screen.getByRole('listitem')).toHaveAttribute('aria-disabled', 'true');
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
+ const control = screen.getByRole('button');
727
+ expect(control).toHaveAccessibleName(
728
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
729
+ );
730
+ expect(control).toHaveAccessibleDescription(additionalInfo);
731
+ });
732
+
733
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
734
+ render(
735
+ <ListItem
736
+ title={title}
737
+ subtitle={subtitle}
738
+ valueTitle={valueTitle}
739
+ valueSubtitle={valueSubtitle}
740
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
741
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
742
+ control={
743
+ <ListItem.IconButton onClick={cb}>
744
+ <Edit />
745
+ </ListItem.IconButton>
746
+ }
747
+ />,
748
+ );
749
+
750
+ const control = screen.getByRole('button');
751
+ expect(control).toHaveAccessibleName(
752
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
753
+ );
754
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
755
+ });
756
+
757
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
758
+ render(
759
+ <ListItem
760
+ title={title}
761
+ subtitle={subtitle}
762
+ valueTitle={valueTitle}
763
+ valueSubtitle={valueSubtitle}
764
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
765
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
766
+ inverted
767
+ control={
768
+ <ListItem.IconButton onClick={cb}>
769
+ <Edit />
770
+ </ListItem.IconButton>
771
+ }
772
+ />,
773
+ );
774
+
775
+ const control = screen.getByRole('button');
776
+ expect(control).toHaveAccessibleName(
777
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
778
+ );
779
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
780
+ });
781
+ });
782
+
783
+ describe('Partially interactive', () => {
784
+ describe('has accessible name when used with:', () => {
785
+ it('title', () => {
786
+ render(
787
+ <ListItem
788
+ title={title}
789
+ control={
790
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
791
+ <Edit />
792
+ </ListItem.IconButton>
793
+ }
794
+ />,
795
+ );
796
+
797
+ expect(screen.getByRole('button')).toHaveAccessibleName(title);
798
+ });
799
+
800
+ it('title and subtitle', () => {
801
+ render(
802
+ <ListItem
803
+ title={title}
804
+ subtitle={subtitle}
805
+ control={
806
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
807
+ <Edit />
808
+ </ListItem.IconButton>
809
+ }
810
+ />,
811
+ );
812
+
813
+ expect(screen.getByRole('button')).toHaveAccessibleName(`${title} ${subtitle}`);
814
+ });
815
+
816
+ it('title, subtitle, and valueTitle', () => {
817
+ render(
818
+ <ListItem
819
+ title={title}
820
+ subtitle={subtitle}
821
+ valueTitle={valueTitle}
822
+ control={
823
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
824
+ <Edit />
825
+ </ListItem.IconButton>
826
+ }
827
+ />,
828
+ );
829
+
830
+ expect(screen.getByRole('button')).toHaveAccessibleName(
831
+ `${title} ${subtitle} ${valueTitle}`,
832
+ );
833
+ });
834
+
835
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
836
+ render(
837
+ <ListItem
838
+ title={title}
839
+ subtitle={subtitle}
840
+ valueTitle={valueTitle}
841
+ valueSubtitle={valueSubtitle}
842
+ control={
843
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
844
+ <Edit />
845
+ </ListItem.IconButton>
846
+ }
847
+ />,
848
+ );
849
+
850
+ expect(screen.getByRole('button')).toHaveAccessibleName(
851
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
852
+ );
853
+ });
854
+
855
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
856
+ render(
857
+ <ListItem
858
+ title={title}
859
+ subtitle={subtitle}
860
+ valueTitle={valueTitle}
861
+ valueSubtitle={valueSubtitle}
862
+ inverted
863
+ control={
864
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
865
+ <Edit />
866
+ </ListItem.IconButton>
867
+ }
868
+ />,
869
+ );
870
+
871
+ expect(screen.getByRole('button')).toHaveAccessibleName(
872
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
873
+ );
874
+ });
875
+
876
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
877
+ render(
878
+ <ListItem
879
+ title={title}
880
+ subtitle={subtitle}
881
+ valueTitle={valueTitle}
882
+ valueSubtitle={valueSubtitle}
883
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
884
+ control={
885
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
886
+ <Edit />
887
+ </ListItem.IconButton>
888
+ }
889
+ />,
890
+ );
891
+
892
+ expect(screen.getByRole('button')).toHaveAccessibleName(
893
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
894
+ );
895
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(additionalInfo);
896
+ });
897
+
898
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with link action', () => {
899
+ render(
900
+ <ListItem
901
+ title={title}
902
+ subtitle={subtitle}
903
+ valueTitle={valueTitle}
904
+ valueSubtitle={valueSubtitle}
905
+ additionalInfo={
906
+ <ListItem.AdditionalInfo
907
+ action={{
908
+ label: additionalInfoAction,
909
+ href: 'wise.com',
910
+ }}
911
+ >
912
+ {additionalInfo}
913
+ </ListItem.AdditionalInfo>
914
+ }
915
+ control={
916
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
917
+ <Edit />
918
+ </ListItem.IconButton>
919
+ }
920
+ />,
921
+ );
922
+
923
+ const control = screen.getByRole('button');
924
+ expect(control).toHaveAccessibleName(
925
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
926
+ );
927
+ expect(control).toHaveAccessibleDescription(
928
+ `${additionalInfo} ${additionalInfoAction}`,
929
+ );
930
+ });
931
+
932
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with button action', () => {
933
+ render(
934
+ <ListItem
935
+ title={title}
936
+ subtitle={subtitle}
937
+ valueTitle={valueTitle}
938
+ valueSubtitle={valueSubtitle}
939
+ additionalInfo={
940
+ <ListItem.AdditionalInfo action={{ label: additionalInfoAction, onClick: cb }}>
941
+ {additionalInfo}
942
+ </ListItem.AdditionalInfo>
943
+ }
944
+ control={
945
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
946
+ <Edit />
947
+ </ListItem.IconButton>
948
+ }
949
+ />,
950
+ );
951
+
952
+ const control = screen.getAllByRole('button')[0];
953
+ expect(control).toHaveAccessibleName(
954
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
955
+ );
956
+ expect(control).toHaveAccessibleDescription(
957
+ `${additionalInfo} ${additionalInfoAction}`,
958
+ );
959
+ });
960
+
961
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
962
+ render(
963
+ <ListItem
964
+ title={title}
965
+ subtitle={subtitle}
966
+ valueTitle={valueTitle}
967
+ valueSubtitle={valueSubtitle}
968
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
969
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
970
+ control={
971
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
972
+ <Edit />
973
+ </ListItem.IconButton>
974
+ }
975
+ />,
976
+ );
977
+ const control = screen.getByRole('button');
978
+ expect(control).toHaveAccessibleName(
979
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
980
+ );
981
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
982
+ });
983
+
984
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline link', () => {
985
+ render(
986
+ <ListItem
987
+ title={title}
988
+ subtitle={subtitle}
989
+ valueTitle={valueTitle}
990
+ valueSubtitle={valueSubtitle}
991
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
992
+ prompt={<ListItem.Prompt>{promptWithLink}</ListItem.Prompt>}
993
+ control={
994
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
995
+ <Edit />
996
+ </ListItem.IconButton>
997
+ }
998
+ />,
999
+ );
1000
+ const control = screen.getByRole('button');
1001
+ expect(control).toHaveAccessibleName(
1002
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1003
+ );
1004
+ expect(screen.getByRole('button')).toHaveAccessibleDescription(
1005
+ `${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1006
+ );
1007
+ });
1008
+
1009
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline button', () => {
1010
+ render(
1011
+ <ListItem
1012
+ title={title}
1013
+ subtitle={subtitle}
1014
+ valueTitle={valueTitle}
1015
+ valueSubtitle={valueSubtitle}
1016
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1017
+ prompt={<ListItem.Prompt>{promptWithButton}</ListItem.Prompt>}
1018
+ control={
1019
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
1020
+ <Edit />
1021
+ </ListItem.IconButton>
1022
+ }
1023
+ />,
1024
+ );
1025
+
1026
+ const control = screen.getAllByRole('button')[0];
1027
+ expect(control).toHaveAccessibleName(
1028
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1029
+ );
1030
+ expect(control).toHaveAccessibleDescription(
1031
+ `${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1032
+ );
1033
+ });
1034
+
1035
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
1036
+ render(
1037
+ <ListItem
1038
+ title={title}
1039
+ subtitle={subtitle}
1040
+ valueTitle={valueTitle}
1041
+ valueSubtitle={valueSubtitle}
1042
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1043
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1044
+ inverted
1045
+ control={
1046
+ <ListItem.IconButton partiallyInteractive onClick={cb}>
1047
+ <Edit />
1048
+ </ListItem.IconButton>
1049
+ }
1050
+ />,
1051
+ );
1052
+
1053
+ const control = screen.getByRole('button');
1054
+ expect(control).toHaveAccessibleName(
1055
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1056
+ );
1057
+ expect(control).toHaveAccessibleDescription(`${additionalInfo} ${prompt}`);
1058
+ });
1059
+ });
1060
+ });
1061
+ });
1062
+
1063
+ describe('Button', () => {
1064
+ describe('Fully interactive', () => {
1065
+ describe('has accessible name when used with:', () => {
1066
+ it('title', () => {
1067
+ render(
1068
+ <ListItem
1069
+ title={title}
1070
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1071
+ />,
1072
+ );
1073
+
1074
+ const control = screen.getByRole('button');
1075
+ expect(control).toHaveAccessibleName(title);
1076
+ expect(control).toHaveAccessibleDescription(`Save`);
1077
+ });
1078
+
1079
+ it('title and subtitle', () => {
1080
+ render(
1081
+ <ListItem
1082
+ title={title}
1083
+ subtitle={subtitle}
1084
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1085
+ />,
1086
+ );
1087
+
1088
+ const control = screen.getByRole('button');
1089
+ expect(control).toHaveAccessibleName(`${title} ${subtitle}`);
1090
+ expect(control).toHaveAccessibleDescription(`Save`);
1091
+ });
1092
+
1093
+ it('title, subtitle, and valueTitle', () => {
1094
+ render(
1095
+ <ListItem
1096
+ title={title}
1097
+ subtitle={subtitle}
1098
+ valueTitle={valueTitle}
1099
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1100
+ />,
1101
+ );
1102
+
1103
+ const control = screen.getByRole('button');
1104
+ expect(control).toHaveAccessibleName(`${title} ${subtitle} ${valueTitle}`);
1105
+ expect(control).toHaveAccessibleDescription(`Save`);
1106
+ });
1107
+
1108
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
1109
+ render(
1110
+ <ListItem
1111
+ title={title}
1112
+ subtitle={subtitle}
1113
+ valueTitle={valueTitle}
1114
+ valueSubtitle={valueSubtitle}
1115
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1116
+ />,
1117
+ );
1118
+
1119
+ const control = screen.getByRole('button');
1120
+ expect(control).toHaveAccessibleName(
1121
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1122
+ );
1123
+ expect(control).toHaveAccessibleDescription(`Save`);
1124
+ });
1125
+
1126
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
1127
+ render(
1128
+ <ListItem
1129
+ title={title}
1130
+ subtitle={subtitle}
1131
+ valueTitle={valueTitle}
1132
+ valueSubtitle={valueSubtitle}
1133
+ inverted
1134
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1135
+ />,
1136
+ );
1137
+
1138
+ const control = screen.getByRole('button');
1139
+ expect(control).toHaveAccessibleName(
1140
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1141
+ );
1142
+ expect(control).toHaveAccessibleDescription(`Save`);
1143
+ });
1144
+
1145
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
1146
+ render(
1147
+ <ListItem
1148
+ title={title}
1149
+ subtitle={subtitle}
1150
+ valueTitle={valueTitle}
1151
+ valueSubtitle={valueSubtitle}
1152
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1153
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1154
+ />,
1155
+ );
1156
+
1157
+ const control = screen.getByRole('button');
1158
+ expect(control).toHaveAccessibleName(
1159
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1160
+ );
1161
+ expect(control).toHaveAccessibleDescription(`Save ${additionalInfo}`);
1162
+ });
1163
+
1164
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
1165
+ render(
1166
+ <ListItem
1167
+ title={title}
1168
+ subtitle={subtitle}
1169
+ valueTitle={valueTitle}
1170
+ valueSubtitle={valueSubtitle}
1171
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1172
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1173
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1174
+ />,
1175
+ );
1176
+
1177
+ const control = screen.getByRole('button');
1178
+ expect(control).toHaveAccessibleName(
1179
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1180
+ );
1181
+ expect(control).toHaveAccessibleDescription(`Save ${additionalInfo} ${prompt}`);
1182
+ });
1183
+
1184
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
1185
+ render(
1186
+ <ListItem
1187
+ title={title}
1188
+ subtitle={subtitle}
1189
+ valueTitle={valueTitle}
1190
+ valueSubtitle={valueSubtitle}
1191
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1192
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1193
+ inverted
1194
+ control={<ListItem.Button onClick={cb}>Save</ListItem.Button>}
1195
+ />,
1196
+ );
1197
+
1198
+ const control = screen.getByRole('button');
1199
+ expect(control).toHaveAccessibleName(
1200
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1201
+ );
1202
+ expect(control).toHaveAccessibleDescription(`Save ${additionalInfo} ${prompt}`);
1203
+ });
1204
+ });
1205
+ });
1206
+
1207
+ describe('Partially interactive', () => {
1208
+ describe('has accessible name when used with:', () => {
1209
+ it('title', () => {
1210
+ render(
1211
+ <ListItem
1212
+ title={title}
1213
+ control={
1214
+ <ListItem.Button partiallyInteractive onClick={cb}>
1215
+ Save
1216
+ </ListItem.Button>
1217
+ }
1218
+ />,
1219
+ );
1220
+
1221
+ const control = screen.getByRole('button');
1222
+ expect(control).toHaveAccessibleName(`Save`);
1223
+ expect(control).toHaveAccessibleDescription(title);
1224
+ });
1225
+
1226
+ it('title and subtitle', () => {
1227
+ render(
1228
+ <ListItem
1229
+ title={title}
1230
+ subtitle={subtitle}
1231
+ control={
1232
+ <ListItem.Button partiallyInteractive onClick={cb}>
1233
+ Save
1234
+ </ListItem.Button>
1235
+ }
1236
+ />,
1237
+ );
1238
+
1239
+ const control = screen.getByRole('button');
1240
+ expect(control).toHaveAccessibleName(`Save`);
1241
+ expect(control).toHaveAccessibleDescription(`${title} ${subtitle}`);
1242
+ });
1243
+
1244
+ it('title, subtitle, and valueTitle', () => {
1245
+ render(
1246
+ <ListItem
1247
+ title={title}
1248
+ subtitle={subtitle}
1249
+ valueTitle={valueTitle}
1250
+ control={
1251
+ <ListItem.Button partiallyInteractive onClick={cb}>
1252
+ Save
1253
+ </ListItem.Button>
1254
+ }
1255
+ />,
1256
+ );
1257
+
1258
+ const control = screen.getByRole('button');
1259
+ expect(control).toHaveAccessibleName(`Save`);
1260
+ expect(control).toHaveAccessibleDescription(`${title} ${subtitle} ${valueTitle}`);
1261
+ });
1262
+
1263
+ it('title, subtitle, valueTitle, and valueSubtitle', () => {
1264
+ render(
1265
+ <ListItem
1266
+ title={title}
1267
+ subtitle={subtitle}
1268
+ valueTitle={valueTitle}
1269
+ valueSubtitle={valueSubtitle}
1270
+ control={
1271
+ <ListItem.Button partiallyInteractive onClick={cb}>
1272
+ Save
1273
+ </ListItem.Button>
1274
+ }
1275
+ />,
1276
+ );
1277
+
1278
+ const control = screen.getByRole('button');
1279
+ expect(control).toHaveAccessibleName(`Save`);
1280
+ expect(control).toHaveAccessibleDescription(
1281
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle}`,
1282
+ );
1283
+ });
1284
+
1285
+ it('title, subtitle, valueTitle, valueSubtitle and inverted layout', () => {
1286
+ render(
1287
+ <ListItem
1288
+ title={title}
1289
+ subtitle={subtitle}
1290
+ valueTitle={valueTitle}
1291
+ valueSubtitle={valueSubtitle}
1292
+ inverted
1293
+ control={
1294
+ <ListItem.Button partiallyInteractive onClick={cb}>
1295
+ Save
1296
+ </ListItem.Button>
1297
+ }
1298
+ />,
1299
+ );
1300
+
1301
+ const control = screen.getByRole('button');
1302
+ expect(control).toHaveAccessibleName(`Save`);
1303
+ expect(control).toHaveAccessibleDescription(
1304
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle}`,
1305
+ );
1306
+ });
1307
+
1308
+ it('title, subtitle, valueTitle, valueSubtitle, and non-interactive additionalInfo', () => {
1309
+ render(
1310
+ <ListItem
1311
+ title={title}
1312
+ subtitle={subtitle}
1313
+ valueTitle={valueTitle}
1314
+ valueSubtitle={valueSubtitle}
1315
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1316
+ control={
1317
+ <ListItem.Button partiallyInteractive onClick={cb}>
1318
+ Save
1319
+ </ListItem.Button>
1320
+ }
1321
+ />,
1322
+ );
1323
+
1324
+ const control = screen.getByRole('button');
1325
+ expect(control).toHaveAccessibleName(`Save`);
1326
+ expect(control).toHaveAccessibleDescription(
1327
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo}`,
1328
+ );
1329
+ });
1330
+
1331
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with link action', () => {
1332
+ render(
1333
+ <ListItem
1334
+ title={title}
1335
+ subtitle={subtitle}
1336
+ valueTitle={valueTitle}
1337
+ valueSubtitle={valueSubtitle}
1338
+ additionalInfo={
1339
+ <ListItem.AdditionalInfo
1340
+ action={{
1341
+ label: additionalInfoAction,
1342
+ href: 'wise.com',
1343
+ }}
1344
+ >
1345
+ {additionalInfo}
1346
+ </ListItem.AdditionalInfo>
1347
+ }
1348
+ control={
1349
+ <ListItem.Button partiallyInteractive onClick={cb}>
1350
+ Save
1351
+ </ListItem.Button>
1352
+ }
1353
+ />,
1354
+ );
1355
+
1356
+ const control = screen.getByRole('button');
1357
+ expect(control).toHaveAccessibleName(`Save`);
1358
+ expect(control).toHaveAccessibleDescription(
1359
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
1360
+ );
1361
+ });
1362
+
1363
+ it('title, subtitle, valueTitle, valueSubtitle, and additionalInfo with button action', () => {
1364
+ render(
1365
+ <ListItem
1366
+ title={title}
1367
+ subtitle={subtitle}
1368
+ valueTitle={valueTitle}
1369
+ valueSubtitle={valueSubtitle}
1370
+ additionalInfo={
1371
+ <ListItem.AdditionalInfo action={{ label: additionalInfoAction, onClick: cb }}>
1372
+ {additionalInfo}
1373
+ </ListItem.AdditionalInfo>
1374
+ }
1375
+ control={
1376
+ <ListItem.Button partiallyInteractive onClick={cb}>
1377
+ Save
1378
+ </ListItem.Button>
1379
+ }
1380
+ />,
1381
+ );
1382
+
1383
+ const control = screen.getAllByRole('button')[0];
1384
+ expect(control).toHaveAccessibleName(`Save`);
1385
+ expect(control).toHaveAccessibleDescription(
1386
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${additionalInfoAction}`,
1387
+ );
1388
+ });
1389
+
1390
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt', () => {
1391
+ render(
1392
+ <ListItem
1393
+ title={title}
1394
+ subtitle={subtitle}
1395
+ valueTitle={valueTitle}
1396
+ valueSubtitle={valueSubtitle}
1397
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1398
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1399
+ control={
1400
+ <ListItem.Button partiallyInteractive onClick={cb}>
1401
+ Save
1402
+ </ListItem.Button>
1403
+ }
1404
+ />,
1405
+ );
1406
+
1407
+ const control = screen.getByRole('button');
1408
+ expect(control).toHaveAccessibleName(`Save`);
1409
+ expect(control).toHaveAccessibleDescription(
1410
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt}`,
1411
+ );
1412
+ });
1413
+
1414
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline link', () => {
1415
+ render(
1416
+ <ListItem
1417
+ title={title}
1418
+ subtitle={subtitle}
1419
+ valueTitle={valueTitle}
1420
+ valueSubtitle={valueSubtitle}
1421
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1422
+ prompt={<ListItem.Prompt>{promptWithLink}</ListItem.Prompt>}
1423
+ control={
1424
+ <ListItem.Button partiallyInteractive onClick={cb}>
1425
+ Save
1426
+ </ListItem.Button>
1427
+ }
1428
+ />,
1429
+ );
1430
+
1431
+ const control = screen.getByRole('button');
1432
+ expect(control).toHaveAccessibleName(`Save`);
1433
+ expect(control).toHaveAccessibleDescription(
1434
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1435
+ );
1436
+ });
1437
+
1438
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, and prompt with inline button', () => {
1439
+ render(
1440
+ <ListItem
1441
+ title={title}
1442
+ subtitle={subtitle}
1443
+ valueTitle={valueTitle}
1444
+ valueSubtitle={valueSubtitle}
1445
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1446
+ prompt={<ListItem.Prompt>{promptWithButton}</ListItem.Prompt>}
1447
+ control={
1448
+ <ListItem.Button partiallyInteractive onClick={cb}>
1449
+ Save
1450
+ </ListItem.Button>
1451
+ }
1452
+ />,
1453
+ );
1454
+
1455
+ const control = screen.getAllByRole('button')[0];
1456
+ expect(control).toHaveAccessibleName(`Save`);
1457
+ expect(control).toHaveAccessibleDescription(
1458
+ `${title} ${subtitle} ${valueTitle} ${valueSubtitle} ${additionalInfo} ${prompt} ${promptAction} ${prompt}`,
1459
+ );
1460
+ });
1461
+
1462
+ it('title, subtitle, valueTitle, valueSubtitle, non-interactive additionalInfo, prompt, and inverted layout', () => {
1463
+ render(
1464
+ <ListItem
1465
+ title={title}
1466
+ subtitle={subtitle}
1467
+ valueTitle={valueTitle}
1468
+ valueSubtitle={valueSubtitle}
1469
+ additionalInfo={<ListItem.AdditionalInfo>{additionalInfo}</ListItem.AdditionalInfo>}
1470
+ prompt={<ListItem.Prompt>{prompt}</ListItem.Prompt>}
1471
+ inverted
1472
+ control={
1473
+ <ListItem.Button partiallyInteractive onClick={cb}>
1474
+ Save
1475
+ </ListItem.Button>
1476
+ }
1477
+ />,
1478
+ );
1479
+
1480
+ const control = screen.getByRole('button');
1481
+ expect(control).toHaveAccessibleName(`Save`);
1482
+ expect(control).toHaveAccessibleDescription(
1483
+ `${subtitle} ${title} ${valueSubtitle} ${valueTitle} ${additionalInfo} ${prompt}`,
1484
+ );
1485
+ });
1486
+ });
1487
+ });
1488
+ });
1489
+ });
1490
+
1491
+ describe('spotlight', () => {
1492
+ it('only fully interactive variant can have spotlight:active', () => {
1493
+ render(<ListItem title="Test Title" spotlight="active" control={<ListItem.Navigation />} />);
1494
+ const listItem = screen.getByRole('listitem');
1495
+ expect(listItem).toHaveClass('wds-list-item-interactive');
1496
+ expect(listItem).toHaveClass('wds-list-item-spotlight-active');
1497
+ });
1498
+
1499
+ it('only fully interactive variant can have spotlight:inactive', () => {
1500
+ render(
1501
+ <ListItem
1502
+ title="Test Title"
1503
+ spotlight="inactive"
1504
+ control={<ListItem.Switch onClick={cb} />}
1505
+ />,
1506
+ );
1507
+ const listItem = screen.getByRole('listitem');
1508
+ expect(listItem).toHaveClass('wds-list-item-interactive');
1509
+ expect(listItem).toHaveClass('wds-list-item-spotlight-inactive');
1510
+ });
1511
+
1512
+ it('non interactive variant can have spotlight', () => {
1513
+ render(<ListItem title="Test Title" spotlight="inactive" />);
1514
+ const listItem = screen.getByRole('listitem');
1515
+ expect(listItem).toHaveClass('wds-list-item-non-interactive');
1516
+ expect(listItem).not.toHaveClass('wds-list-item-interactive');
1517
+ expect(listItem).not.toHaveClass('wds-list-item-spotlight-inactive');
1518
+ expect(listItem).not.toHaveClass('wds-list-item-spotlight-active');
1519
+ });
1520
+ });
1521
+ });