@ons/design-system 70.0.6 → 70.0.8

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 (308) hide show
  1. package/README.md +11 -17
  2. package/components/access-code/_macro.spec.js +145 -145
  3. package/components/access-code/access-code.dom.js +5 -5
  4. package/components/access-code/access-code.js +16 -16
  5. package/components/access-code/access-code.scss +22 -22
  6. package/components/access-code/access-code.spec.js +17 -17
  7. package/components/accordion/_macro.spec.js +154 -154
  8. package/components/accordion/accordion.dom.js +10 -10
  9. package/components/accordion/accordion.js +50 -50
  10. package/components/accordion/accordion.spec.js +104 -104
  11. package/components/address-input/_macro.spec.js +420 -420
  12. package/components/address-input/autosuggest.address.dom.js +5 -5
  13. package/components/address-input/autosuggest.address.error.js +77 -77
  14. package/components/address-input/autosuggest.address.js +357 -357
  15. package/components/address-input/autosuggest.address.setter.js +95 -95
  16. package/components/address-input/autosuggest.address.spec.js +668 -651
  17. package/components/address-input/example-address-input-editable.njk +1 -1
  18. package/components/address-input/example-address-input.njk +1 -1
  19. package/components/address-output/_address-output.scss +3 -3
  20. package/components/address-output/_macro.spec.js +84 -84
  21. package/components/autosuggest/_autosuggest.scss +114 -114
  22. package/components/autosuggest/_macro.spec.js +255 -255
  23. package/components/autosuggest/autosuggest.dom.js +5 -5
  24. package/components/autosuggest/autosuggest.helpers.js +11 -11
  25. package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
  26. package/components/autosuggest/autosuggest.js +20 -20
  27. package/components/autosuggest/autosuggest.spec.js +542 -536
  28. package/components/autosuggest/autosuggest.ui.js +478 -475
  29. package/components/autosuggest/fuse-config.js +17 -17
  30. package/components/back-to-top/_back-to-top.scss +27 -27
  31. package/components/back-to-top/_macro.spec.js +49 -49
  32. package/components/back-to-top/back-to-top.dom.js +5 -5
  33. package/components/back-to-top/back-to-top.js +52 -52
  34. package/components/back-to-top/back-to-top.spec.js +106 -106
  35. package/components/back-to-top/example-back-to-top.njk +6 -6
  36. package/components/breadcrumbs/_breadcrumbs.scss +63 -65
  37. package/components/breadcrumbs/_macro.spec.js +91 -91
  38. package/components/browser-banner/_browser-banner.scss +23 -23
  39. package/components/browser-banner/_macro.spec.js +92 -92
  40. package/components/button/_button.scss +482 -483
  41. package/components/button/_macro.spec.js +363 -363
  42. package/components/button/button.dom.js +15 -15
  43. package/components/button/button.js +53 -53
  44. package/components/button/button.spec.js +248 -240
  45. package/components/call-to-action/_call-to-action.scss +5 -5
  46. package/components/call-to-action/_macro.spec.js +28 -28
  47. package/components/card/_card.scss +23 -23
  48. package/components/card/_macro.spec.js +180 -180
  49. package/components/char-check-limit/_macro.spec.js +48 -48
  50. package/components/char-check-limit/character-check.js +58 -58
  51. package/components/char-check-limit/character-check.spec.js +173 -173
  52. package/components/char-check-limit/character-limit.js +40 -40
  53. package/components/checkboxes/_checkbox-macro.spec.js +355 -355
  54. package/components/checkboxes/_checkbox.scss +180 -180
  55. package/components/checkboxes/_checkboxes.scss +37 -27
  56. package/components/checkboxes/_macro.spec.js +261 -261
  57. package/components/checkboxes/checkbox-with-autoselect.js +32 -32
  58. package/components/checkboxes/checkbox-with-fieldset.js +21 -21
  59. package/components/checkboxes/checkboxes-with-reveal.js +10 -10
  60. package/components/checkboxes/checkboxes.dom.js +27 -27
  61. package/components/checkboxes/checkboxes.spec.js +183 -183
  62. package/components/content-pagination/_content-pagination.scss +41 -41
  63. package/components/content-pagination/_macro.spec.js +159 -159
  64. package/components/cookies-banner/_cookies-banner.scss +22 -22
  65. package/components/cookies-banner/_macro.spec.js +177 -177
  66. package/components/cookies-banner/cookies-banner.dom.js +7 -7
  67. package/components/cookies-banner/cookies-banner.js +76 -76
  68. package/components/cookies-banner/cookies-banner.spec.js +72 -68
  69. package/components/date-input/_macro.spec.js +338 -338
  70. package/components/description-list/_description-list.scss +23 -23
  71. package/components/description-list/_macro.spec.js +144 -144
  72. package/components/details/_details.scss +109 -109
  73. package/components/details/_macro.spec.js +132 -132
  74. package/components/details/details.dom.js +6 -6
  75. package/components/details/details.js +60 -60
  76. package/components/details/details.spec.js +106 -106
  77. package/components/document-list/_macro.spec.js +444 -444
  78. package/components/document-list/document-list.scss +145 -149
  79. package/components/download-resources/_download-resources.scss +109 -108
  80. package/components/download-resources/download-resources.js +907 -900
  81. package/components/download-resources/download-resources.spec.js +461 -461
  82. package/components/duration/_macro.spec.js +291 -291
  83. package/components/error/_macro.spec.js +72 -72
  84. package/components/external-link/_external-link.scss +19 -19
  85. package/components/external-link/_macro.spec.js +68 -68
  86. package/components/feedback/_feedback.scss +31 -31
  87. package/components/feedback/_macro.spec.js +72 -72
  88. package/components/field/_field-group.scss +10 -10
  89. package/components/field/_field.scss +16 -16
  90. package/components/field/_macro.spec.js +80 -80
  91. package/components/fieldset/_fieldset.scss +27 -27
  92. package/components/fieldset/_macro.spec.js +161 -161
  93. package/components/footer/_footer.scss +45 -45
  94. package/components/footer/_macro.spec.js +452 -452
  95. package/components/header/_header.scss +202 -202
  96. package/components/header/_macro.spec.js +833 -829
  97. package/components/helpers/_grid.scss +4 -4
  98. package/components/hero/_hero.scss +48 -48
  99. package/components/hero/_macro.spec.js +59 -59
  100. package/components/icon/_icon.scss +44 -44
  101. package/components/icon/_macro.spec.js +110 -110
  102. package/components/image/_image.scss +11 -11
  103. package/components/image/_macro.spec.js +81 -81
  104. package/components/input/_input-type.scss +86 -89
  105. package/components/input/_input.scss +123 -124
  106. package/components/input/_macro.spec.js +604 -604
  107. package/components/input/character-check.dom.js +5 -5
  108. package/components/input/input.dom.js +5 -5
  109. package/components/input/input.js +10 -10
  110. package/components/input/input.spec.js +18 -18
  111. package/components/label/_label.scss +24 -24
  112. package/components/label/_macro.spec.js +173 -170
  113. package/components/language-selector/_macro.spec.js +97 -97
  114. package/components/language-selector/language.scss +7 -7
  115. package/components/list/_list.scss +84 -84
  116. package/components/list/_macro.njk +2 -2
  117. package/components/list/_macro.spec.js +583 -583
  118. package/components/message/_macro.njk +5 -5
  119. package/components/message/_macro.spec.js +74 -74
  120. package/components/message/_message.scss +39 -39
  121. package/components/message-list/_macro.spec.js +86 -86
  122. package/components/message-list/_message-list.scss +16 -16
  123. package/components/modal/_macro.spec.js +69 -69
  124. package/components/modal/_modal.scss +36 -36
  125. package/components/modal/modal.dom.js +6 -6
  126. package/components/modal/modal.js +89 -89
  127. package/components/modal/modal.spec.js +50 -50
  128. package/components/mutually-exclusive/_macro.spec.js +140 -140
  129. package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
  130. package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
  131. package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
  132. package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
  133. package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
  134. package/components/mutually-exclusive/mutually-exclusive.js +137 -137
  135. package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
  136. package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
  137. package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
  138. package/components/navigation/_macro.spec.js +360 -354
  139. package/components/navigation/_navigation.scss +122 -123
  140. package/components/navigation/navigation.dom.js +35 -35
  141. package/components/navigation/navigation.js +49 -49
  142. package/components/navigation/navigation.spec.js +249 -249
  143. package/components/pagination/_macro.spec.js +342 -335
  144. package/components/pagination/_pagination.scss +58 -58
  145. package/components/panel/_macro.spec.js +372 -372
  146. package/components/panel/_panel.scss +200 -199
  147. package/components/password/_macro.spec.js +95 -95
  148. package/components/password/password.dom.js +5 -5
  149. package/components/password/password.js +10 -10
  150. package/components/password/password.spec.js +26 -26
  151. package/components/phase-banner/_macro.spec.js +86 -86
  152. package/components/phase-banner/_phase-banner.scss +16 -16
  153. package/components/question/_macro.spec.js +235 -235
  154. package/components/question/_question.scss +24 -24
  155. package/components/quote/_macro.spec.js +52 -52
  156. package/components/quote/_quote.scss +24 -24
  157. package/components/radios/_macro.spec.js +524 -524
  158. package/components/radios/_radio.scss +49 -48
  159. package/components/radios/_radios.scss +14 -20
  160. package/components/radios/check-radios.js +21 -21
  161. package/components/radios/clear-radios.js +45 -45
  162. package/components/radios/radio-with-fieldset.js +22 -22
  163. package/components/radios/radios.dom.js +32 -32
  164. package/components/radios/radios.spec.js +251 -251
  165. package/components/related-content/_macro.spec.js +109 -109
  166. package/components/related-content/_related-content.scss +12 -12
  167. package/components/related-content/_section-macro.spec.js +20 -20
  168. package/components/relationships/_macro.spec.js +94 -94
  169. package/components/relationships/_relationships.scss +9 -9
  170. package/components/relationships/relationships.dom.js +5 -5
  171. package/components/relationships/relationships.js +18 -18
  172. package/components/relationships/relationships.spec.js +71 -71
  173. package/components/reply/_macro.spec.js +47 -47
  174. package/components/reply/reply-input.js +15 -15
  175. package/components/reply/reply.dom.js +5 -5
  176. package/components/reply/reply.spec.js +57 -57
  177. package/components/section-navigation/_macro.spec.js +210 -210
  178. package/components/section-navigation/_section-navigation.scss +76 -76
  179. package/components/select/_macro.spec.js +166 -166
  180. package/components/share-page/_macro.spec.js +68 -68
  181. package/components/skip-to-content/_macro.spec.js +54 -54
  182. package/components/skip-to-content/_skip.scss +30 -30
  183. package/components/skip-to-content/skip-to-content.dom.js +6 -6
  184. package/components/skip-to-content/skip-to-content.js +7 -7
  185. package/components/skip-to-content/skip-to-content.spec.js +21 -21
  186. package/components/status/_macro.spec.js +53 -53
  187. package/components/status/_status.scss +32 -32
  188. package/components/summary/_macro.spec.js +551 -535
  189. package/components/summary/_summary.scss +191 -195
  190. package/components/table/_macro.spec.js +499 -499
  191. package/components/table/_table.scss +204 -201
  192. package/components/table/scrollable-table.dom.js +5 -5
  193. package/components/table/scrollable-table.js +60 -60
  194. package/components/table/sortable-table.dom.js +5 -5
  195. package/components/table/sortable-table.js +135 -135
  196. package/components/table/table.spec.js +144 -140
  197. package/components/table-of-contents/_macro.spec.js +125 -125
  198. package/components/table-of-contents/_toc.scss +9 -9
  199. package/components/table-of-contents/toc.dom.js +5 -5
  200. package/components/table-of-contents/toc.js +30 -30
  201. package/components/table-of-contents/toc.spec.js +88 -88
  202. package/components/tabs/_macro.spec.js +92 -92
  203. package/components/tabs/_tabs.scss +120 -115
  204. package/components/tabs/tabs.dom.js +5 -5
  205. package/components/tabs/tabs.js +266 -266
  206. package/components/tabs/tabs.spec.js +268 -268
  207. package/components/text-indent/_macro.spec.js +33 -33
  208. package/components/text-indent/_text-indent.scss +3 -3
  209. package/components/textarea/_macro.spec.js +238 -238
  210. package/components/textarea/textarea.dom.js +5 -5
  211. package/components/textarea/textarea.spec.js +78 -74
  212. package/components/timeline/_macro.spec.js +83 -83
  213. package/components/timeline/_timeline.scss +26 -26
  214. package/components/timeout-modal/_macro.spec.js +47 -47
  215. package/components/timeout-modal/timeout-modal.dom.js +9 -9
  216. package/components/timeout-modal/timeout-modal.js +66 -66
  217. package/components/timeout-modal/timeout-modal.spec.js +157 -157
  218. package/components/timeout-panel/_macro.spec.js +41 -41
  219. package/components/timeout-panel/timeout-panel.dom.js +8 -8
  220. package/components/timeout-panel/timeout-panel.spec.js +118 -118
  221. package/components/upload/_macro.spec.js +52 -52
  222. package/components/upload/_upload.scss +28 -28
  223. package/components/video/_macro.spec.js +42 -42
  224. package/components/video/_video.scss +16 -16
  225. package/components/video/video.dom.js +5 -5
  226. package/components/video/video.js +32 -32
  227. package/components/video/video.spec.js +103 -97
  228. package/css/main.css +1 -1
  229. package/favicons/android-chrome-192x192.png +0 -0
  230. package/favicons/android-chrome-512x512.png +0 -0
  231. package/favicons/apple-touch-icon.png +0 -0
  232. package/favicons/favicon-16x16.png +0 -0
  233. package/favicons/favicon-32x32.png +0 -0
  234. package/favicons/favicon.ico +0 -0
  235. package/favicons/manifest.json +25 -25
  236. package/favicons/maskable_icon.png +0 -0
  237. package/favicons/opengraph.png +0 -0
  238. package/favicons/twitter.png +0 -0
  239. package/img/large/alison-pritchard-featured.jpg +0 -0
  240. package/img/large/alison-pritchard.jpg +0 -0
  241. package/img/large/census-monuments-lights-featured.jpg +0 -0
  242. package/img/large/census-monuments-lights.jpg +0 -0
  243. package/img/large/mother-and-daughter-in-ireland.jpg +0 -0
  244. package/img/large/mum-and-child-healthcare-belfast.jpg +0 -0
  245. package/img/large/ons-award-winners.jpg +0 -0
  246. package/img/large/placeholder-card.png +0 -0
  247. package/img/large/placeholder-news-medium.png +0 -0
  248. package/img/large/placeholder-news.png +0 -0
  249. package/img/large/placeholder-portrait.png +0 -0
  250. package/img/large/students.jpg +0 -0
  251. package/img/large/woman-in-purple-dress-shirt.jpg +0 -0
  252. package/img/small/alison-pritchard-featured.jpg +0 -0
  253. package/img/small/alison-pritchard.jpg +0 -0
  254. package/img/small/census-monuments-lights-featured.jpg +0 -0
  255. package/img/small/census-monuments-lights.jpg +0 -0
  256. package/img/small/mother-and-daughter-in-ireland.jpg +0 -0
  257. package/img/small/mum-and-child-healthcare-belfast.jpg +0 -0
  258. package/img/small/ons-award-winners.jpg +0 -0
  259. package/img/small/placeholder-card.png +0 -0
  260. package/img/small/placeholder-news-medium.png +0 -0
  261. package/img/small/placeholder-news.png +0 -0
  262. package/img/small/placeholder-portrait.png +0 -0
  263. package/img/small/students.jpg +0 -0
  264. package/img/small/woman-in-purple-dress-shirt.jpg +0 -0
  265. package/js/abortable-fetch.js +23 -23
  266. package/js/analytics.js +53 -53
  267. package/js/cookies-functions.js +135 -135
  268. package/js/cookies-settings.dom.js +7 -7
  269. package/js/cookies-settings.js +77 -77
  270. package/js/cookies-settings.spec.js +106 -106
  271. package/js/domready.js +8 -8
  272. package/js/fetch.js +14 -14
  273. package/js/inpagelink.dom.js +5 -5
  274. package/js/inpagelink.js +19 -19
  275. package/js/polyfills.js +0 -1
  276. package/js/print-button.js +6 -6
  277. package/js/timeout.js +211 -211
  278. package/layout/_template.njk +5 -7
  279. package/package.json +131 -127
  280. package/scripts/main.es5.js +1 -1
  281. package/scripts/main.js +1 -1
  282. package/scss/base/_forms.scss +10 -10
  283. package/scss/base/_global.scss +45 -44
  284. package/scss/base/_typography.scss +20 -20
  285. package/scss/helpers/_functions.scss +18 -15
  286. package/scss/helpers/_mixins.scss +59 -53
  287. package/scss/helpers/_mq.scss +62 -65
  288. package/scss/objects/_container.scss +20 -20
  289. package/scss/objects/_page.scss +33 -33
  290. package/scss/objects/_spacing.scss +10 -10
  291. package/scss/overrides/hcm.scss +237 -237
  292. package/scss/overrides/rtl.scss +95 -95
  293. package/scss/print.scss +47 -47
  294. package/scss/utilities/_border.scss +7 -7
  295. package/scss/utilities/_colors.scss +6 -6
  296. package/scss/utilities/_display.scss +8 -8
  297. package/scss/utilities/_float.scss +7 -7
  298. package/scss/utilities/_grid.scss +144 -144
  299. package/scss/utilities/_highlight.scss +4 -4
  300. package/scss/utilities/_margin.scss +17 -17
  301. package/scss/utilities/_pad.scss +15 -15
  302. package/scss/utilities/_typography.scss +35 -33
  303. package/scss/utilities/_utilities.scss +8 -8
  304. package/scss/utilities/_visibility.scss +25 -25
  305. package/scss/vars/_colors.scss +116 -116
  306. package/scss/vars/_forms.scss +22 -22
  307. package/scss/vars/_grid.scss +11 -9
  308. package/scss/vars/_typography.scss +54 -54
@@ -2,678 +2,684 @@ import { getNodeAttributes, PuppeteerEndpointFaker } from '../../tests/helpers/p
2
2
  import { renderComponent, setTestPage } from '../../tests/helpers/rendering';
3
3
 
4
4
  const EXAMPLE_AUTOSUGGEST = {
5
- id: 'country-of-birth',
6
- input: {
7
- label: {
8
- text: 'Current name of country',
9
- description: 'Enter your own answer or select from suggestions',
10
- id: 'country-of-birth-label',
11
- classes: 'extra-label-class',
5
+ id: 'country-of-birth',
6
+ input: {
7
+ label: {
8
+ text: 'Current name of country',
9
+ description: 'Enter your own answer or select from suggestions',
10
+ id: 'country-of-birth-label',
11
+ classes: 'extra-label-class',
12
+ },
13
+ autocomplete: 'off',
12
14
  },
13
- autocomplete: 'off',
14
- },
15
- instructions: 'Use up and down keys to navigate.',
16
- ariaYouHaveSelected: 'You have selected',
17
- ariaMinChars: 'Enter 3 or more characters for suggestions.',
18
- minChars: 3,
19
- ariaResultsLabel: 'Country suggestions',
20
- ariaOneResult: 'There is one suggestion available.',
21
- ariaNResults: 'There are {n} suggestions available.',
22
- ariaLimitedResults: 'Type more characters to improve your search',
23
- moreResults: 'Continue entering to improve suggestions',
24
- resultsTitle: 'Suggestions',
25
- resultsTitleId: 'country-of-birth-suggestions',
26
- noResults: 'No suggestions found.',
27
- typeMore: 'Continue entering to get suggestions',
28
- autosuggestData: '/test/fake/api/countries',
15
+ instructions: 'Use up and down keys to navigate.',
16
+ ariaYouHaveSelected: 'You have selected',
17
+ ariaMinChars: 'Enter 3 or more characters for suggestions.',
18
+ minChars: 3,
19
+ ariaResultsLabel: 'Country suggestions',
20
+ ariaOneResult: 'There is one suggestion available.',
21
+ ariaNResults: 'There are {n} suggestions available.',
22
+ ariaLimitedResults: 'Type more characters to improve your search',
23
+ moreResults: 'Continue entering to improve suggestions',
24
+ resultsTitle: 'Suggestions',
25
+ resultsTitleId: 'country-of-birth-suggestions',
26
+ noResults: 'No suggestions found.',
27
+ typeMore: 'Continue entering to get suggestions',
28
+ autosuggestData: '/test/fake/api/countries',
29
29
  };
30
30
  const EXAMPLE_AUTOSUGGEST_WITH_LANGUAGE = {
31
- id: 'country-of-birth',
32
- label: {
33
- text: 'Current name of country',
34
- description: 'Enter your own answer or select from suggestions',
35
- id: 'country-of-birth-label',
36
- classes: 'extra-label-class',
37
- },
38
- autocomplete: 'off',
39
- instructions: 'Use up and down keys to navigate.',
40
- ariaYouHaveSelected: 'You have selected',
41
- ariaMinChars: 'Enter 3 or more characters for suggestions.',
42
- minChars: 3,
43
- ariaResultsLabel: 'Country suggestions',
44
- ariaOneResult: 'There is one suggestion available.',
45
- ariaNResults: 'There are {n} suggestions available.',
46
- ariaLimitedResults: 'Type more characters to improve your search',
47
- moreResults: 'Continue entering to improve suggestions',
48
- resultsTitle: 'Suggestions',
49
- resultsTitleId: 'country-of-birth-suggestions',
50
- noResults: 'No suggestions found.',
51
- typeMore: 'Continue entering to get suggestions',
52
- autosuggestData: '/test/fake/api/countries',
53
- language: 'en-gb',
31
+ id: 'country-of-birth',
32
+ label: {
33
+ text: 'Current name of country',
34
+ description: 'Enter your own answer or select from suggestions',
35
+ id: 'country-of-birth-label',
36
+ classes: 'extra-label-class',
37
+ },
38
+ autocomplete: 'off',
39
+ instructions: 'Use up and down keys to navigate.',
40
+ ariaYouHaveSelected: 'You have selected',
41
+ ariaMinChars: 'Enter 3 or more characters for suggestions.',
42
+ minChars: 3,
43
+ ariaResultsLabel: 'Country suggestions',
44
+ ariaOneResult: 'There is one suggestion available.',
45
+ ariaNResults: 'There are {n} suggestions available.',
46
+ ariaLimitedResults: 'Type more characters to improve your search',
47
+ moreResults: 'Continue entering to improve suggestions',
48
+ resultsTitle: 'Suggestions',
49
+ resultsTitleId: 'country-of-birth-suggestions',
50
+ noResults: 'No suggestions found.',
51
+ typeMore: 'Continue entering to get suggestions',
52
+ autosuggestData: '/test/fake/api/countries',
53
+ language: 'en-gb',
54
54
  };
55
55
 
56
56
  describe('script: autosuggest', () => {
57
- const apiFaker = new PuppeteerEndpointFaker('/test/fake/api');
58
-
59
- apiFaker.setOverride('/countries', {
60
- data: [
61
- { en: 'England' },
62
- { en: 'Wales' },
63
- { en: 'Scotland' },
64
- { en: 'United States of America' },
65
- { en: 'United States Virgin Islands' },
66
- { en: 'Åland Islands' },
67
- ],
68
- });
69
-
70
- beforeAll(async () => {
71
- await apiFaker.setup(page);
72
- });
73
-
74
- beforeEach(async () => {
75
- await apiFaker.reset();
76
- });
77
-
78
- describe('when the component initialises', () => {
79
- it('the input should be given the correct aria attributes', async () => {
80
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
81
-
82
- const attributes = await getNodeAttributes(page, '.ons-js-autosuggest-input');
83
- expect(attributes['aria-autocomplete']).toBe('list');
84
- expect(attributes['aria-controls']).toBe('country-of-birth-listbox');
85
- expect(attributes['aria-describedby']).toBe('country-of-birth-instructions');
86
- expect(attributes['aria-haspopup']).toBe('true');
87
- expect(attributes['aria-owns']).toBe('country-of-birth-listbox');
88
- expect(attributes['aria-expanded']).toBe('false');
89
- expect(attributes['role']).toBe('combobox');
57
+ const apiFaker = new PuppeteerEndpointFaker('/test/fake/api');
58
+
59
+ apiFaker.setOverride('/countries', {
60
+ data: [
61
+ { en: 'England' },
62
+ { en: 'Wales' },
63
+ { en: 'Scotland' },
64
+ { en: 'United States of America' },
65
+ { en: 'United States Virgin Islands' },
66
+ { en: 'Åland Islands' },
67
+ ],
90
68
  });
91
69
 
92
- it('the autocomplete attribute be set to be not set to on', async () => {
93
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
70
+ beforeAll(async () => {
71
+ await apiFaker.setup(page);
72
+ });
94
73
 
95
- const attributes = await getNodeAttributes(page, '.ons-js-autosuggest-input');
96
- expect(attributes['autocomplete']).not.toBe('on');
74
+ beforeEach(async () => {
75
+ await apiFaker.reset();
97
76
  });
98
77
 
99
- it('the instructions, listbox, and status should become visible', async () => {
100
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
78
+ describe('when the component initialises', () => {
79
+ it('the input should be given the correct aria attributes', async () => {
80
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
101
81
 
102
- const instructionsDisplayStyle = await page.$eval('.ons-js-autosuggest-instructions', (node) => getComputedStyle(node).display);
103
- expect(instructionsDisplayStyle).toBe('block');
104
- const listboxDisplayStyle = await page.$eval('.ons-js-autosuggest-listbox', (node) => getComputedStyle(node).display);
105
- expect(listboxDisplayStyle).toBe('block');
106
- const statusDisplayStyle = await page.$eval('.ons-js-autosuggest-aria-status', (node) => getComputedStyle(node).display);
107
- expect(statusDisplayStyle).toBe('block');
108
- });
109
- });
82
+ const attributes = await getNodeAttributes(page, '.ons-js-autosuggest-input');
83
+ expect(attributes['aria-autocomplete']).toBe('list');
84
+ expect(attributes['aria-controls']).toBe('country-of-birth-listbox');
85
+ expect(attributes['aria-describedby']).toBe('country-of-birth-instructions');
86
+ expect(attributes['aria-haspopup']).toBe('true');
87
+ expect(attributes['aria-owns']).toBe('country-of-birth-listbox');
88
+ expect(attributes['aria-expanded']).toBe('false');
89
+ expect(attributes['role']).toBe('combobox');
90
+ });
110
91
 
111
- describe('when the user presses the "Down" arrow key', () => {
112
- it('navigates to the first suggestion initially', async () => {
113
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
92
+ it('the autocomplete attribute be set to be not set to on', async () => {
93
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
94
+
95
+ const attributes = await getNodeAttributes(page, '.ons-js-autosuggest-input');
96
+ expect(attributes['autocomplete']).not.toBe('on');
97
+ });
114
98
 
115
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
116
- await page.keyboard.press('ArrowDown');
99
+ it('the instructions, listbox, and status should become visible', async () => {
100
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
117
101
 
118
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
119
- expect(selectedOption.trim()).toBe('United States of America');
102
+ const instructionsDisplayStyle = await page.$eval('.ons-js-autosuggest-instructions', (node) => getComputedStyle(node).display);
103
+ expect(instructionsDisplayStyle).toBe('block');
104
+ const listboxDisplayStyle = await page.$eval('.ons-js-autosuggest-listbox', (node) => getComputedStyle(node).display);
105
+ expect(listboxDisplayStyle).toBe('block');
106
+ const statusDisplayStyle = await page.$eval('.ons-js-autosuggest-aria-status', (node) => getComputedStyle(node).display);
107
+ expect(statusDisplayStyle).toBe('block');
108
+ });
120
109
  });
121
110
 
122
- it('navigates to the suggestion below the current suggestion', async () => {
123
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
111
+ describe('when the user presses the "Down" arrow key', () => {
112
+ it('navigates to the first suggestion initially', async () => {
113
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
124
114
 
125
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
126
- await page.keyboard.press('ArrowDown');
127
- await page.keyboard.press('ArrowDown');
115
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
116
+ await page.keyboard.press('ArrowDown');
128
117
 
129
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
130
- expect(selectedOption.trim()).toBe('United States Virgin Islands');
131
- });
118
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
119
+ expect(selectedOption.trim()).toBe('United States of America');
120
+ });
132
121
 
133
- it('marks suggestion as being selected', async () => {
134
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
122
+ it('navigates to the suggestion below the current suggestion', async () => {
123
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
135
124
 
136
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
137
- await page.keyboard.press('ArrowDown');
138
- await page.keyboard.press('ArrowDown');
125
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
126
+ await page.keyboard.press('ArrowDown');
127
+ await page.keyboard.press('ArrowDown');
139
128
 
140
- const ariaSelectedValue = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('aria-selected'));
141
- expect(ariaSelectedValue).toBe('true');
129
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
130
+ expect(selectedOption.trim()).toBe('United States Virgin Islands');
131
+ });
142
132
 
143
- const selectedOptionId = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('id'));
144
- const ariaActiveDescendant = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-activedescendant'));
145
- expect(ariaActiveDescendant).toBe(selectedOptionId);
146
- });
133
+ it('marks suggestion as being selected', async () => {
134
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
147
135
 
148
- it('sets aria status to a message showing the selected result', async () => {
149
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
136
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
137
+ await page.keyboard.press('ArrowDown');
138
+ await page.keyboard.press('ArrowDown');
150
139
 
151
- await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
152
- await page.keyboard.press('ArrowDown');
140
+ const ariaSelectedValue = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('aria-selected'));
141
+ expect(ariaSelectedValue).toBe('true');
153
142
 
154
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
155
- expect(statusMessage.trim()).toBe('England');
156
- });
143
+ const selectedOptionId = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('id'));
144
+ const ariaActiveDescendant = await page.$eval('.ons-js-autosuggest-input', (node) =>
145
+ node.getAttribute('aria-activedescendant'),
146
+ );
147
+ expect(ariaActiveDescendant).toBe(selectedOptionId);
148
+ });
157
149
 
158
- it('does not mark other suggestions as being selected', async () => {
159
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
150
+ it('sets aria status to a message showing the selected result', async () => {
151
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
160
152
 
161
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
162
- await page.keyboard.press('ArrowDown');
163
- await page.keyboard.press('ArrowDown');
153
+ await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
154
+ await page.keyboard.press('ArrowDown');
164
155
 
165
- const selectedSuggestionCount = await page.$$eval('.ons-autosuggest__option[aria-selected=true]', (nodes) => nodes.length);
166
- expect(selectedSuggestionCount).toBe(1);
167
- });
156
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
157
+ expect(statusMessage.trim()).toBe('England');
158
+ });
168
159
 
169
- it('does not affect suggestion selection when already on last item', async () => {
170
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
160
+ it('does not mark other suggestions as being selected', async () => {
161
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
171
162
 
172
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
173
- await page.keyboard.press('ArrowDown');
174
- await page.keyboard.press('ArrowDown');
175
- await page.keyboard.press('ArrowDown');
163
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
164
+ await page.keyboard.press('ArrowDown');
165
+ await page.keyboard.press('ArrowDown');
176
166
 
177
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
178
- expect(selectedOption.trim()).toBe('United States Virgin Islands');
179
- });
167
+ const selectedSuggestionCount = await page.$$eval('.ons-autosuggest__option[aria-selected=true]', (nodes) => nodes.length);
168
+ expect(selectedSuggestionCount).toBe(1);
169
+ });
180
170
 
181
- // The down arrow will typically move caret to the end of an input field. This should
182
- // not occur when suggestions are presented.
183
- it('does not interfere with text input', async () => {
184
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
171
+ it('does not affect suggestion selection when already on last item', async () => {
172
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
185
173
 
186
- await page.type('.ons-js-autosuggest-input', 'nited', { delay: 20 });
187
- // Move to start of input to verify if the down arrow moves the caret to the end.
188
- await page.keyboard.press('Home');
189
- await page.keyboard.press('ArrowDown');
190
- await page.keyboard.press('U');
174
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
175
+ await page.keyboard.press('ArrowDown');
176
+ await page.keyboard.press('ArrowDown');
177
+ await page.keyboard.press('ArrowDown');
191
178
 
192
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
193
- expect(inputValue).toBe('United');
194
- });
195
- });
179
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
180
+ expect(selectedOption.trim()).toBe('United States Virgin Islands');
181
+ });
196
182
 
197
- describe('when the user presses the "Up" arrow key', () => {
198
- it('navigates to the first suggestion initially', async () => {
199
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
183
+ // The down arrow will typically move caret to the end of an input field. This should
184
+ // not occur when suggestions are presented.
185
+ it('does not interfere with text input', async () => {
186
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
200
187
 
201
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
202
- await page.keyboard.press('ArrowUp');
188
+ await page.type('.ons-js-autosuggest-input', 'nited', { delay: 20 });
189
+ // Move to start of input to verify if the down arrow moves the caret to the end.
190
+ await page.keyboard.press('Home');
191
+ await page.keyboard.press('ArrowDown');
192
+ await page.keyboard.press('U');
203
193
 
204
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
205
- expect(selectedOption.trim()).toBe('United States of America');
194
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
195
+ expect(inputValue).toBe('United');
196
+ });
206
197
  });
207
198
 
208
- it('navigates to the suggestion above the current suggestion', async () => {
209
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
199
+ describe('when the user presses the "Up" arrow key', () => {
200
+ it('navigates to the first suggestion initially', async () => {
201
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
210
202
 
211
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
212
- await page.keyboard.press('ArrowDown');
213
- await page.keyboard.press('ArrowDown');
214
- await page.keyboard.press('ArrowUp');
203
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
204
+ await page.keyboard.press('ArrowUp');
215
205
 
216
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
217
- expect(selectedOption.trim()).toBe('United States of America');
218
- });
206
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
207
+ expect(selectedOption.trim()).toBe('United States of America');
208
+ });
219
209
 
220
- it('marks suggestion as being selected', async () => {
221
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
210
+ it('navigates to the suggestion above the current suggestion', async () => {
211
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
222
212
 
223
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
224
- await page.keyboard.press('ArrowDown');
225
- await page.keyboard.press('ArrowDown');
226
- await page.keyboard.press('ArrowUp');
213
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
214
+ await page.keyboard.press('ArrowDown');
215
+ await page.keyboard.press('ArrowDown');
216
+ await page.keyboard.press('ArrowUp');
227
217
 
228
- const ariaSelectedValue = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('aria-selected'));
229
- expect(ariaSelectedValue).toBe('true');
218
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
219
+ expect(selectedOption.trim()).toBe('United States of America');
220
+ });
230
221
 
231
- const selectedOptionId = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('id'));
232
- const ariaActiveDescendant = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-activedescendant'));
233
- expect(ariaActiveDescendant).toBe(selectedOptionId);
234
- });
222
+ it('marks suggestion as being selected', async () => {
223
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
235
224
 
236
- it('does not mark other suggestions as being selected', async () => {
237
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
225
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
226
+ await page.keyboard.press('ArrowDown');
227
+ await page.keyboard.press('ArrowDown');
228
+ await page.keyboard.press('ArrowUp');
238
229
 
239
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
240
- await page.keyboard.press('ArrowDown');
241
- await page.keyboard.press('ArrowDown');
242
- await page.keyboard.press('ArrowUp');
230
+ const ariaSelectedValue = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('aria-selected'));
231
+ expect(ariaSelectedValue).toBe('true');
243
232
 
244
- const selectedSuggestionCount = await page.$$eval('.ons-autosuggest__option[aria-selected=true]', (nodes) => nodes.length);
245
- expect(selectedSuggestionCount).toBe(1);
246
- });
233
+ const selectedOptionId = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('id'));
234
+ const ariaActiveDescendant = await page.$eval('.ons-js-autosuggest-input', (node) =>
235
+ node.getAttribute('aria-activedescendant'),
236
+ );
237
+ expect(ariaActiveDescendant).toBe(selectedOptionId);
238
+ });
247
239
 
248
- it('does not affect suggestion selection when already on first item', async () => {
249
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
240
+ it('does not mark other suggestions as being selected', async () => {
241
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
250
242
 
251
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
252
- await page.keyboard.press('ArrowUp');
253
- await page.keyboard.press('ArrowUp');
243
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
244
+ await page.keyboard.press('ArrowDown');
245
+ await page.keyboard.press('ArrowDown');
246
+ await page.keyboard.press('ArrowUp');
254
247
 
255
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
256
- expect(selectedOption.trim()).toBe('United States of America');
257
- });
248
+ const selectedSuggestionCount = await page.$$eval('.ons-autosuggest__option[aria-selected=true]', (nodes) => nodes.length);
249
+ expect(selectedSuggestionCount).toBe(1);
250
+ });
251
+
252
+ it('does not affect suggestion selection when already on first item', async () => {
253
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
254
+
255
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
256
+ await page.keyboard.press('ArrowUp');
257
+ await page.keyboard.press('ArrowUp');
258
+
259
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
260
+ expect(selectedOption.trim()).toBe('United States of America');
261
+ });
258
262
 
259
- // The down arrow will typically move caret to the start of an input field. This
260
- // should not occur when suggestions are presented.
261
- it('does not interfere with text input', async () => {
262
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
263
+ // The down arrow will typically move caret to the start of an input field. This
264
+ // should not occur when suggestions are presented.
265
+ it('does not interfere with text input', async () => {
266
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
263
267
 
264
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
265
- await page.keyboard.press('ArrowUp');
266
- await page.keyboard.press('d');
268
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
269
+ await page.keyboard.press('ArrowUp');
270
+ await page.keyboard.press('d');
267
271
 
268
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
269
- expect(inputValue).toBe('United');
272
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
273
+ expect(inputValue).toBe('United');
274
+ });
270
275
  });
271
- });
272
276
 
273
- describe('when the user presses the "Enter" key', () => {
274
- it('accepts the selected suggestion', async () => {
275
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
277
+ describe('when the user presses the "Enter" key', () => {
278
+ it('accepts the selected suggestion', async () => {
279
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
276
280
 
277
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
278
- await page.keyboard.press('ArrowDown');
279
- await page.keyboard.press('ArrowDown');
280
- await page.keyboard.press('Enter');
281
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
282
+ await page.keyboard.press('ArrowDown');
283
+ await page.keyboard.press('ArrowDown');
284
+ await page.keyboard.press('Enter');
281
285
 
282
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
283
- expect(inputValue).toBe('United States Virgin Islands');
286
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
287
+ expect(inputValue).toBe('United States Virgin Islands');
288
+ });
284
289
  });
285
- });
286
290
 
287
- describe('when the user blurs the input', () => {
288
- it('suggestions should remain visible for 300ms', async () => {
289
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
291
+ describe('when the user blurs the input', () => {
292
+ it('suggestions should remain visible for 300ms', async () => {
293
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
290
294
 
291
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
292
- await page.keyboard.press('Tab');
295
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
296
+ await page.keyboard.press('Tab');
293
297
 
294
- const suggestionCountSample1 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
295
- expect(suggestionCountSample1).toBe(2);
298
+ const suggestionCountSample1 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
299
+ expect(suggestionCountSample1).toBe(2);
296
300
 
297
- await page.waitForTimeout(200);
298
- const suggestionCountSample2 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
299
- expect(suggestionCountSample2).toBe(2);
301
+ await page.waitForTimeout(200);
302
+ const suggestionCountSample2 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
303
+ expect(suggestionCountSample2).toBe(2);
300
304
 
301
- await page.waitForTimeout(320);
302
- const suggestionCountSample3 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
303
- expect(suggestionCountSample3).toBe(0);
304
- });
305
+ await page.waitForTimeout(320);
306
+ const suggestionCountSample3 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
307
+ expect(suggestionCountSample3).toBe(0);
308
+ });
305
309
 
306
- it('clears innerHTML of listbox', async () => {
307
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
310
+ it('clears innerHTML of listbox', async () => {
311
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
308
312
 
309
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
310
- await page.keyboard.press('Tab');
311
- await page.waitForTimeout(320);
313
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
314
+ await page.keyboard.press('Tab');
315
+ await page.waitForTimeout(320);
312
316
 
313
- const listboxInnerHTML = await page.$eval('.ons-js-autosuggest-listbox', (node) => node.innerHTML);
314
- expect(listboxInnerHTML).toBe('');
315
- });
317
+ const listboxInnerHTML = await page.$eval('.ons-js-autosuggest-listbox', (node) => node.innerHTML);
318
+ expect(listboxInnerHTML).toBe('');
319
+ });
316
320
 
317
- it('clears `has-results` modifier of autosuggest component', async () => {
318
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
321
+ it('clears `has-results` modifier of autosuggest component', async () => {
322
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
319
323
 
320
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
321
- await page.keyboard.press('Tab');
322
- await page.waitForTimeout(320);
324
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
325
+ await page.keyboard.press('Tab');
326
+ await page.waitForTimeout(320);
323
327
 
324
- const hasClass = await page.$eval('.ons-autosuggest', (node) => node.classList.contains('ons-autosuggest--has-results'));
325
- expect(hasClass).toBe(false);
326
- });
328
+ const hasClass = await page.$eval('.ons-autosuggest', (node) => node.classList.contains('ons-autosuggest--has-results'));
329
+ expect(hasClass).toBe(false);
330
+ });
327
331
 
328
- it('clears aria attributes of input element', async () => {
329
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
332
+ it('clears aria attributes of input element', async () => {
333
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
330
334
 
331
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
332
- await page.keyboard.press('Tab');
333
- await page.waitForTimeout(320);
335
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
336
+ await page.keyboard.press('Tab');
337
+ await page.waitForTimeout(320);
334
338
 
335
- const attributes = await getNodeAttributes(page, '.ons-js-autosuggest-input');
336
- expect(attributes['aria-activedescendant']).toBeUndefined();
337
- expect(attributes['aria-expanded']).toBe('false');
339
+ const attributes = await getNodeAttributes(page, '.ons-js-autosuggest-input');
340
+ expect(attributes['aria-activedescendant']).toBeUndefined();
341
+ expect(attributes['aria-expanded']).toBe('false');
342
+ });
338
343
  });
339
- });
340
344
 
341
- describe('when the user clicks on a result', () => {
342
- it('accepts the suggestion', async () => {
343
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
345
+ describe('when the user clicks on a result', () => {
346
+ it('accepts the suggestion', async () => {
347
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
344
348
 
345
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
346
- await page.click('.ons-autosuggest__option:nth-child(2)');
349
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
350
+ await page.click('.ons-autosuggest__option:nth-child(2)');
347
351
 
348
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
349
- expect(inputValue).toBe('United States Virgin Islands');
352
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
353
+ expect(inputValue).toBe('United States Virgin Islands');
354
+ });
350
355
  });
351
- });
352
356
 
353
- describe('when the user inputs text', () => {
354
- it('does not show suggestions when input length < minimum characters', async () => {
355
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
357
+ describe('when the user inputs text', () => {
358
+ it('does not show suggestions when input length < minimum characters', async () => {
359
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
356
360
 
357
- await page.type('.ons-js-autosuggest-input', 'En', { delay: 20 });
361
+ await page.type('.ons-js-autosuggest-input', 'En', { delay: 20 });
358
362
 
359
- const suggestionCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
360
- expect(suggestionCount).toBe(0);
361
- });
363
+ const suggestionCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
364
+ expect(suggestionCount).toBe(0);
365
+ });
362
366
 
363
- it('shows suggestions when input length >= minimum characters', async () => {
364
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
367
+ it('shows suggestions when input length >= minimum characters', async () => {
368
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
365
369
 
366
- await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
370
+ await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
367
371
 
368
- const suggestionCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
369
- expect(suggestionCount).toBe(1);
370
- });
372
+ const suggestionCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
373
+ expect(suggestionCount).toBe(1);
374
+ });
371
375
 
372
- it('gets the language if set', async () => {
373
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST_WITH_LANGUAGE));
376
+ it('gets the language if set', async () => {
377
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST_WITH_LANGUAGE));
374
378
 
375
- await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
379
+ await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
376
380
 
377
- const attributes = await getNodeAttributes(page, '.ons-js-autosuggest');
378
- expect(attributes['data-lang']).toBe('en-gb');
381
+ const attributes = await getNodeAttributes(page, '.ons-js-autosuggest');
382
+ expect(attributes['data-lang']).toBe('en-gb');
383
+ });
379
384
  });
380
- });
381
385
 
382
- describe('when the mouse moves over a result and a suggestion is focused', () => {
383
- it('removes the focused class', async () => {
384
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
386
+ describe('when the mouse moves over a result and a suggestion is focused', () => {
387
+ it('removes the focused class', async () => {
388
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
385
389
 
386
- await page.type('.ons-js-autosuggest-input', 'state', { delay: 20 });
387
- await page.keyboard.press('ArrowDown');
388
- await page.hover('.ons-autosuggest__option:nth-child(2)');
390
+ await page.type('.ons-js-autosuggest-input', 'state', { delay: 20 });
391
+ await page.keyboard.press('ArrowDown');
392
+ await page.hover('.ons-autosuggest__option:nth-child(2)');
389
393
 
390
- const focusedClassCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
391
- expect(focusedClassCount).toBe(0);
392
- });
393
- });
394
-
395
- describe('when the mouse moves off a result and a suggestion was focused', () => {
396
- it('restores the focused class', async () => {
397
- await setTestPage(
398
- '/test',
399
- `
400
- ${renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST)}
401
- <a id="dummy">Dummy</a>
402
- `,
403
- );
404
-
405
- await page.type('.ons-js-autosuggest-input', 'state', { delay: 20 });
406
- await page.keyboard.press('ArrowDown');
407
- await page.hover('.ons-autosuggest__option:nth-child(2)');
408
- await page.hover('#dummy');
409
-
410
- const focusedClassCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
411
- expect(focusedClassCount).toBe(1);
394
+ const focusedClassCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
395
+ expect(focusedClassCount).toBe(0);
396
+ });
412
397
  });
413
- });
414
398
 
415
- describe('when there are results', () => {
416
- it('un-highlights a previously highlighted suggestion', async () => {
417
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
399
+ describe('when the mouse moves off a result and a suggestion was focused', () => {
400
+ it('restores the focused class', async () => {
401
+ await setTestPage(
402
+ '/test',
403
+ `
404
+ ${renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST)}
405
+ <a id="dummy">Dummy</a>
406
+ `,
407
+ );
418
408
 
419
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
420
- await page.keyboard.press('ArrowDown');
421
- await page.type('.ons-js-autosuggest-input', 'd', { delay: 20 });
409
+ await page.type('.ons-js-autosuggest-input', 'state', { delay: 20 });
410
+ await page.keyboard.press('ArrowDown');
411
+ await page.hover('.ons-autosuggest__option:nth-child(2)');
412
+ await page.hover('#dummy');
422
413
 
423
- const focusedNodeCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
424
- expect(focusedNodeCount).toBe(0);
414
+ const focusedClassCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
415
+ expect(focusedClassCount).toBe(1);
416
+ });
425
417
  });
426
418
 
427
- it('decorates input element with `aria-expanded` attribute', async () => {
428
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
419
+ describe('when there are results', () => {
420
+ it('un-highlights a previously highlighted suggestion', async () => {
421
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
429
422
 
430
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
423
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
424
+ await page.keyboard.press('ArrowDown');
425
+ await page.type('.ons-js-autosuggest-input', 'd', { delay: 20 });
431
426
 
432
- const ariaExpandedValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-expanded'));
433
- expect(ariaExpandedValue).toBe('true');
434
- });
427
+ const focusedNodeCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
428
+ expect(focusedNodeCount).toBe(0);
429
+ });
435
430
 
436
- it('emboldens matched suggestion text', async () => {
437
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
431
+ it('decorates input element with `aria-expanded` attribute', async () => {
432
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
438
433
 
439
- await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
434
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
440
435
 
441
- const emboldened = await page.$$eval('.ons-autosuggest__option strong', (nodes) => nodes.map((node) => node.textContent));
442
- expect(emboldened).toEqual(['Unite', 'Unite']);
443
- });
436
+ const ariaExpandedValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-expanded'));
437
+ expect(ariaExpandedValue).toBe('true');
438
+ });
444
439
 
445
- it('does not embolden anything when suggestion does not contain query text', async () => {
446
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
440
+ it('emboldens matched suggestion text', async () => {
441
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
447
442
 
448
- await page.type('.ons-js-autosuggest-input', 'tland', { delay: 20 });
443
+ await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
449
444
 
450
- const matchCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
451
- expect(matchCount).toBe(2);
452
- const emboldened = await page.$$eval('.ons-autosuggest__option strong', (nodes) => nodes.map((node) => node.textContent));
453
- expect(emboldened).toEqual(['tland']);
454
- });
445
+ const emboldened = await page.$$eval('.ons-autosuggest__option strong', (nodes) => nodes.map((node) => node.textContent));
446
+ expect(emboldened).toEqual(['Unite', 'Unite']);
447
+ });
455
448
 
456
- it('sets aria status to a message asking for more characters to be input', async () => {
457
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
449
+ it('does not embolden anything when suggestion does not contain query text', async () => {
450
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
458
451
 
459
- await page.type('.ons-js-autosuggest-input', 'st', { delay: 20 });
452
+ await page.type('.ons-js-autosuggest-input', 'tland', { delay: 20 });
460
453
 
461
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
462
- expect(statusMessage.trim()).toBe('Enter 3 or more characters for suggestions.');
463
- });
454
+ const matchCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
455
+ expect(matchCount).toBe(2);
456
+ const emboldened = await page.$$eval('.ons-autosuggest__option strong', (nodes) => nodes.map((node) => node.textContent));
457
+ expect(emboldened).toEqual(['tland']);
458
+ });
464
459
 
465
- it('sets aria status to a message indicating a count of one suggestion', async () => {
466
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
460
+ it('sets aria status to a message asking for more characters to be input', async () => {
461
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
467
462
 
468
- await page.type('.ons-js-autosuggest-input', 'Engla', { delay: 20 });
463
+ await page.type('.ons-js-autosuggest-input', 'st', { delay: 20 });
469
464
 
470
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
471
- expect(statusMessage.trim()).toBe('There is one suggestion available.');
472
- });
465
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
466
+ expect(statusMessage.trim()).toBe('Enter 3 or more characters for suggestions.');
467
+ });
468
+
469
+ it('sets aria status to a message indicating a count of one suggestion', async () => {
470
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
471
+
472
+ await page.type('.ons-js-autosuggest-input', 'Engla', { delay: 20 });
473
473
 
474
- it('sets aria status to a message indicating the count of suggestions', async () => {
475
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
474
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
475
+ expect(statusMessage.trim()).toBe('There is one suggestion available.');
476
+ });
477
+
478
+ it('sets aria status to a message indicating the count of suggestions', async () => {
479
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
476
480
 
477
- await page.type('.ons-js-autosuggest-input', 'sta', { delay: 20 });
481
+ await page.type('.ons-js-autosuggest-input', 'sta', { delay: 20 });
478
482
 
479
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
480
- expect(statusMessage.trim()).toBe('There are 2 suggestions available.');
483
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
484
+ expect(statusMessage.trim()).toBe('There are 2 suggestions available.');
485
+ });
481
486
  });
482
- });
483
487
 
484
- describe('when there are no results', () => {
485
- describe('where `noResults` content is provided', () => {
486
- it('outputs `noResults` content', async () => {
487
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
488
+ describe('when there are no results', () => {
489
+ describe('where `noResults` content is provided', () => {
490
+ it('outputs `noResults` content', async () => {
491
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
488
492
 
489
- await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
493
+ await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
490
494
 
491
- const noResultsContent = await page.$eval('.ons-autosuggest__option--no-results', (node) => node.textContent);
492
- expect(noResultsContent).toBe('No suggestions found.');
493
- });
495
+ const noResultsContent = await page.$eval('.ons-autosuggest__option--no-results', (node) => node.textContent);
496
+ expect(noResultsContent).toBe('No suggestions found.');
497
+ });
494
498
 
495
- it('decorates input element with `aria-expanded` attribute', async () => {
496
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
499
+ it('decorates input element with `aria-expanded` attribute', async () => {
500
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
497
501
 
498
- await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
502
+ await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
499
503
 
500
- const ariaExpandedValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-expanded'));
501
- expect(ariaExpandedValue).toBe('true');
502
- });
504
+ const ariaExpandedValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-expanded'));
505
+ expect(ariaExpandedValue).toBe('true');
506
+ });
503
507
 
504
- it('sets aria status to a message indicating that query is too short for suggestions', async () => {
505
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
508
+ it('sets aria status to a message indicating that query is too short for suggestions', async () => {
509
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
506
510
 
507
- await page.type('.ons-js-autosuggest-input', 'ab', { delay: 20 });
511
+ await page.type('.ons-js-autosuggest-input', 'ab', { delay: 20 });
508
512
 
509
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
510
- expect(statusMessage.trim()).toBe('Enter 3 or more characters for suggestions.');
511
- });
513
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
514
+ expect(statusMessage.trim()).toBe('Enter 3 or more characters for suggestions.');
515
+ });
512
516
 
513
- it('sets aria status to a message indicating the zero count of suggestions', async () => {
514
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
517
+ it('sets aria status to a message indicating the zero count of suggestions', async () => {
518
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
515
519
 
516
- await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
520
+ await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
517
521
 
518
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
519
- expect(statusMessage.trim()).toBe('No suggestions found.: "abc"');
520
- });
521
- });
522
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
523
+ expect(statusMessage.trim()).toBe('No suggestions found.: "abc"');
524
+ });
525
+ });
522
526
 
523
- describe('where `noResults` content is not provided', () => {
524
- it('has an empty listbox', async () => {
525
- await setTestPage(
526
- '/test',
527
- renderComponent('autosuggest', {
528
- ...EXAMPLE_AUTOSUGGEST,
529
- noResults: undefined,
530
- }),
531
- );
532
-
533
- await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
534
-
535
- const matchCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
536
- expect(matchCount).toBe(0);
537
- });
538
-
539
- it('decorates input element with `aria-expanded` attribute', async () => {
540
- await setTestPage(
541
- '/test',
542
- renderComponent('autosuggest', {
543
- ...EXAMPLE_AUTOSUGGEST,
544
- noResults: undefined,
545
- }),
546
- );
547
-
548
- await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
549
-
550
- const ariaExpandedValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-expanded'));
551
- expect(ariaExpandedValue).toBe('false');
552
- });
527
+ describe('where `noResults` content is not provided', () => {
528
+ it('has an empty listbox', async () => {
529
+ await setTestPage(
530
+ '/test',
531
+ renderComponent('autosuggest', {
532
+ ...EXAMPLE_AUTOSUGGEST,
533
+ noResults: undefined,
534
+ }),
535
+ );
536
+
537
+ await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
538
+
539
+ const matchCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
540
+ expect(matchCount).toBe(0);
541
+ });
542
+
543
+ it('decorates input element with `aria-expanded` attribute', async () => {
544
+ await setTestPage(
545
+ '/test',
546
+ renderComponent('autosuggest', {
547
+ ...EXAMPLE_AUTOSUGGEST,
548
+ noResults: undefined,
549
+ }),
550
+ );
551
+
552
+ await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
553
+
554
+ const ariaExpandedValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.getAttribute('aria-expanded'));
555
+ expect(ariaExpandedValue).toBe('false');
556
+ });
557
+ });
553
558
  });
554
- });
555
559
 
556
- describe('when there are no results due to an error', () => {
557
- describe('when the status code is 400', () => {
558
- beforeEach(async () => {
559
- apiFaker.setTemporaryOverride('/countries', {
560
- status: 400,
561
- data: {},
562
- });
560
+ describe('when there are no results due to an error', () => {
561
+ describe('when the status code is 400', () => {
562
+ beforeEach(async () => {
563
+ apiFaker.setTemporaryOverride('/countries', {
564
+ status: 400,
565
+ data: {},
566
+ });
563
567
 
564
- await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
568
+ await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
565
569
 
566
- await page.focus('.ons-js-autosuggest-input');
567
- await page.type('.ons-js-autosuggest-input', 'tes', { delay: 20 });
568
- });
570
+ await page.focus('.ons-js-autosuggest-input');
571
+ await page.type('.ons-js-autosuggest-input', 'tes', { delay: 20 });
572
+ });
569
573
 
570
- it('shows the type more message', async () => {
571
- const listItemCount = await page.$$eval('.ons-js-autosuggest-listbox > *', (nodes) => nodes.length);
572
- expect(listItemCount).toBe(1);
573
- const noResultsText = await page.$eval('.ons-autosuggest__option--no-results', (node) => node.innerText);
574
- expect(noResultsText.trim()).toBe('Continue entering to get suggestions');
575
- });
576
- });
574
+ it('shows the type more message', async () => {
575
+ const listItemCount = await page.$$eval('.ons-js-autosuggest-listbox > *', (nodes) => nodes.length);
576
+ expect(listItemCount).toBe(1);
577
+ const noResultsText = await page.$eval('.ons-autosuggest__option--no-results', (node) => node.innerText);
578
+ expect(noResultsText.trim()).toBe('Continue entering to get suggestions');
579
+ });
580
+ });
577
581
 
578
- describe.each([
579
- ['when the status code is greater than 400', {}, 401],
580
- ['when there is no status code', null, undefined],
581
- ])('%s', (_, fakeAutosuggestData, fakeStatusCode) => {
582
- beforeEach(async () => {
583
- apiFaker.setTemporaryOverride('/countries', {
584
- status: fakeStatusCode,
585
- data: fakeAutosuggestData,
586
- });
587
-
588
- await setTestPage(
589
- '/test',
590
- renderComponent('autosuggest', {
591
- ...EXAMPLE_AUTOSUGGEST,
592
- errorTitle: 'There is a problem with your answer',
593
- errorMessage: 'Enter an address ',
594
- errorMessageAPI: 'Sorry, there is a problem.',
595
- }),
596
- );
597
-
598
- await page.type('.ons-js-autosuggest-input', 'tes', { delay: 20 });
599
- });
600
-
601
- it('shows the API error message', async () => {
602
- const resultsItemCount = await page.$$eval('.ons-js-autosuggest-results > *', (nodes) => nodes.length);
603
- expect(resultsItemCount).toBe(1);
604
- const warningText = await page.$eval('.ons-autosuggest__warning', (node) => node.textContent);
605
- expect(warningText.trim()).toBe('!Sorry, there is a problem.');
606
- });
607
-
608
- it('the list and results element should be removed from the page', async () => {
609
- const hasListBox = await page.$eval('.ons-autosuggest', (node) => node.classList.contains('.ons-js-autosuggest-listbox'));
610
- const hasResultsTitle = await page.$eval('.ons-autosuggest', (node) => node.classList.contains('.ons-autosuggest__results-title'));
611
-
612
- expect(hasListBox).toBe(false);
613
- expect(hasResultsTitle).toBe(false);
614
- });
615
-
616
- it('the input should be disabled', async () => {
617
- const hasDisabledAttribute = await page.$eval('.ons-js-autosuggest-input', (node) => node.hasAttribute('disabled'));
618
- expect(hasDisabledAttribute).toBe(true);
619
- });
620
-
621
- it('the input value should be empty', async () => {
622
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
623
- expect(inputValue).toBe('');
624
- });
625
-
626
- it('the label class should be added', async () => {
627
- const hasClass = await page.$eval('.ons-label', (node) => node.classList.contains('ons-u-lighter'));
628
- expect(hasClass).toBe(true);
629
- });
630
-
631
- it('the aria status should be set', async () => {
632
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
633
- expect(statusMessage.trim()).toBe('Sorry, there is a problem.');
634
- });
635
- });
636
- });
637
-
638
- describe('when the component initialises with the allowMultiple parameter', () => {
639
- describe('when a result is selected', () => {
640
- it('the input value should contain a comma when focused', async () => {
641
- await setTestPage(
642
- '/test',
643
- renderComponent('autosuggest', {
644
- ...EXAMPLE_AUTOSUGGEST,
645
- allowMultiple: true,
646
- }),
647
- );
648
-
649
- await page.type('.ons-js-autosuggest-input', 'England', { delay: 20 });
650
- await page.keyboard.press('ArrowUp');
651
- await page.keyboard.press('Enter');
652
- // Defocus the autosuggest input.
653
- await page.keyboard.press('Tab');
654
- await page.focus('.ons-js-autosuggest-input');
655
-
656
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
657
- expect(inputValue).toBe('England, ');
658
- });
582
+ describe.each([
583
+ ['when the status code is greater than 400', {}, 401],
584
+ ['when there is no status code', null, undefined],
585
+ ])('%s', (_, fakeAutosuggestData, fakeStatusCode) => {
586
+ beforeEach(async () => {
587
+ apiFaker.setTemporaryOverride('/countries', {
588
+ status: fakeStatusCode,
589
+ data: fakeAutosuggestData,
590
+ });
591
+
592
+ await setTestPage(
593
+ '/test',
594
+ renderComponent('autosuggest', {
595
+ ...EXAMPLE_AUTOSUGGEST,
596
+ errorTitle: 'There is a problem with your answer',
597
+ errorMessage: 'Enter an address ',
598
+ errorMessageAPI: 'Sorry, there is a problem.',
599
+ }),
600
+ );
601
+
602
+ await page.type('.ons-js-autosuggest-input', 'tes', { delay: 20 });
603
+ });
604
+
605
+ it('shows the API error message', async () => {
606
+ const resultsItemCount = await page.$$eval('.ons-js-autosuggest-results > *', (nodes) => nodes.length);
607
+ expect(resultsItemCount).toBe(1);
608
+ const warningText = await page.$eval('.ons-autosuggest__warning', (node) => node.textContent);
609
+ expect(warningText.trim()).toBe('!Sorry, there is a problem.');
610
+ });
611
+
612
+ it('the list and results element should be removed from the page', async () => {
613
+ const hasListBox = await page.$eval('.ons-autosuggest', (node) => node.classList.contains('.ons-js-autosuggest-listbox'));
614
+ const hasResultsTitle = await page.$eval('.ons-autosuggest', (node) =>
615
+ node.classList.contains('.ons-autosuggest__results-title'),
616
+ );
617
+
618
+ expect(hasListBox).toBe(false);
619
+ expect(hasResultsTitle).toBe(false);
620
+ });
621
+
622
+ it('the input should be disabled', async () => {
623
+ const hasDisabledAttribute = await page.$eval('.ons-js-autosuggest-input', (node) => node.hasAttribute('disabled'));
624
+ expect(hasDisabledAttribute).toBe(true);
625
+ });
626
+
627
+ it('the input value should be empty', async () => {
628
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
629
+ expect(inputValue).toBe('');
630
+ });
631
+
632
+ it('the label class should be added', async () => {
633
+ const hasClass = await page.$eval('.ons-label', (node) => node.classList.contains('ons-u-lighter'));
634
+ expect(hasClass).toBe(true);
635
+ });
636
+
637
+ it('the aria status should be set', async () => {
638
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
639
+ expect(statusMessage.trim()).toBe('Sorry, there is a problem.');
640
+ });
641
+ });
659
642
  });
660
643
 
661
- describe('when the user blurs the input', () => {
662
- it('the input value should not contain a comma', async () => {
663
- await setTestPage(
664
- '/test',
665
- renderComponent('autosuggest', {
666
- ...EXAMPLE_AUTOSUGGEST,
667
- allowMultiple: true,
668
- }),
669
- );
670
-
671
- await page.type('.ons-js-autosuggest-input', 'England, ', { delay: 20 });
672
- await page.keyboard.press('Tab');
673
-
674
- const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
675
- expect(inputValue).toBe('England');
676
- });
644
+ describe('when the component initialises with the allowMultiple parameter', () => {
645
+ describe('when a result is selected', () => {
646
+ it('the input value should contain a comma when focused', async () => {
647
+ await setTestPage(
648
+ '/test',
649
+ renderComponent('autosuggest', {
650
+ ...EXAMPLE_AUTOSUGGEST,
651
+ allowMultiple: true,
652
+ }),
653
+ );
654
+
655
+ await page.type('.ons-js-autosuggest-input', 'England', { delay: 20 });
656
+ await page.keyboard.press('ArrowUp');
657
+ await page.keyboard.press('Enter');
658
+ // Defocus the autosuggest input.
659
+ await page.keyboard.press('Tab');
660
+ await page.focus('.ons-js-autosuggest-input');
661
+
662
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
663
+ expect(inputValue).toBe('England, ');
664
+ });
665
+ });
666
+
667
+ describe('when the user blurs the input', () => {
668
+ it('the input value should not contain a comma', async () => {
669
+ await setTestPage(
670
+ '/test',
671
+ renderComponent('autosuggest', {
672
+ ...EXAMPLE_AUTOSUGGEST,
673
+ allowMultiple: true,
674
+ }),
675
+ );
676
+
677
+ await page.type('.ons-js-autosuggest-input', 'England, ', { delay: 20 });
678
+ await page.keyboard.press('Tab');
679
+
680
+ const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
681
+ expect(inputValue).toBe('England');
682
+ });
683
+ });
677
684
  });
678
- });
679
685
  });