@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.
- package/README.md +11 -17
- package/components/access-code/_macro.spec.js +145 -145
- package/components/access-code/access-code.dom.js +5 -5
- package/components/access-code/access-code.js +16 -16
- package/components/access-code/access-code.scss +22 -22
- package/components/access-code/access-code.spec.js +17 -17
- package/components/accordion/_macro.spec.js +154 -154
- package/components/accordion/accordion.dom.js +10 -10
- package/components/accordion/accordion.js +50 -50
- package/components/accordion/accordion.spec.js +104 -104
- package/components/address-input/_macro.spec.js +420 -420
- package/components/address-input/autosuggest.address.dom.js +5 -5
- package/components/address-input/autosuggest.address.error.js +77 -77
- package/components/address-input/autosuggest.address.js +357 -357
- package/components/address-input/autosuggest.address.setter.js +95 -95
- package/components/address-input/autosuggest.address.spec.js +668 -651
- package/components/address-input/example-address-input-editable.njk +1 -1
- package/components/address-input/example-address-input.njk +1 -1
- package/components/address-output/_address-output.scss +3 -3
- package/components/address-output/_macro.spec.js +84 -84
- package/components/autosuggest/_autosuggest.scss +114 -114
- package/components/autosuggest/_macro.spec.js +255 -255
- package/components/autosuggest/autosuggest.dom.js +5 -5
- package/components/autosuggest/autosuggest.helpers.js +11 -11
- package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
- package/components/autosuggest/autosuggest.js +20 -20
- package/components/autosuggest/autosuggest.spec.js +542 -536
- package/components/autosuggest/autosuggest.ui.js +478 -475
- package/components/autosuggest/fuse-config.js +17 -17
- package/components/back-to-top/_back-to-top.scss +27 -27
- package/components/back-to-top/_macro.spec.js +49 -49
- package/components/back-to-top/back-to-top.dom.js +5 -5
- package/components/back-to-top/back-to-top.js +52 -52
- package/components/back-to-top/back-to-top.spec.js +106 -106
- package/components/back-to-top/example-back-to-top.njk +6 -6
- package/components/breadcrumbs/_breadcrumbs.scss +63 -65
- package/components/breadcrumbs/_macro.spec.js +91 -91
- package/components/browser-banner/_browser-banner.scss +23 -23
- package/components/browser-banner/_macro.spec.js +92 -92
- package/components/button/_button.scss +482 -483
- package/components/button/_macro.spec.js +363 -363
- package/components/button/button.dom.js +15 -15
- package/components/button/button.js +53 -53
- package/components/button/button.spec.js +248 -240
- package/components/call-to-action/_call-to-action.scss +5 -5
- package/components/call-to-action/_macro.spec.js +28 -28
- package/components/card/_card.scss +23 -23
- package/components/card/_macro.spec.js +180 -180
- package/components/char-check-limit/_macro.spec.js +48 -48
- package/components/char-check-limit/character-check.js +58 -58
- package/components/char-check-limit/character-check.spec.js +173 -173
- package/components/char-check-limit/character-limit.js +40 -40
- package/components/checkboxes/_checkbox-macro.spec.js +355 -355
- package/components/checkboxes/_checkbox.scss +180 -180
- package/components/checkboxes/_checkboxes.scss +37 -27
- package/components/checkboxes/_macro.spec.js +261 -261
- package/components/checkboxes/checkbox-with-autoselect.js +32 -32
- package/components/checkboxes/checkbox-with-fieldset.js +21 -21
- package/components/checkboxes/checkboxes-with-reveal.js +10 -10
- package/components/checkboxes/checkboxes.dom.js +27 -27
- package/components/checkboxes/checkboxes.spec.js +183 -183
- package/components/content-pagination/_content-pagination.scss +41 -41
- package/components/content-pagination/_macro.spec.js +159 -159
- package/components/cookies-banner/_cookies-banner.scss +22 -22
- package/components/cookies-banner/_macro.spec.js +177 -177
- package/components/cookies-banner/cookies-banner.dom.js +7 -7
- package/components/cookies-banner/cookies-banner.js +76 -76
- package/components/cookies-banner/cookies-banner.spec.js +72 -68
- package/components/date-input/_macro.spec.js +338 -338
- package/components/description-list/_description-list.scss +23 -23
- package/components/description-list/_macro.spec.js +144 -144
- package/components/details/_details.scss +109 -109
- package/components/details/_macro.spec.js +132 -132
- package/components/details/details.dom.js +6 -6
- package/components/details/details.js +60 -60
- package/components/details/details.spec.js +106 -106
- package/components/document-list/_macro.spec.js +444 -444
- package/components/document-list/document-list.scss +145 -149
- package/components/download-resources/_download-resources.scss +109 -108
- package/components/download-resources/download-resources.js +907 -900
- package/components/download-resources/download-resources.spec.js +461 -461
- package/components/duration/_macro.spec.js +291 -291
- package/components/error/_macro.spec.js +72 -72
- package/components/external-link/_external-link.scss +19 -19
- package/components/external-link/_macro.spec.js +68 -68
- package/components/feedback/_feedback.scss +31 -31
- package/components/feedback/_macro.spec.js +72 -72
- package/components/field/_field-group.scss +10 -10
- package/components/field/_field.scss +16 -16
- package/components/field/_macro.spec.js +80 -80
- package/components/fieldset/_fieldset.scss +27 -27
- package/components/fieldset/_macro.spec.js +161 -161
- package/components/footer/_footer.scss +45 -45
- package/components/footer/_macro.spec.js +452 -452
- package/components/header/_header.scss +202 -202
- package/components/header/_macro.spec.js +833 -829
- package/components/helpers/_grid.scss +4 -4
- package/components/hero/_hero.scss +48 -48
- package/components/hero/_macro.spec.js +59 -59
- package/components/icon/_icon.scss +44 -44
- package/components/icon/_macro.spec.js +110 -110
- package/components/image/_image.scss +11 -11
- package/components/image/_macro.spec.js +81 -81
- package/components/input/_input-type.scss +86 -89
- package/components/input/_input.scss +123 -124
- package/components/input/_macro.spec.js +604 -604
- package/components/input/character-check.dom.js +5 -5
- package/components/input/input.dom.js +5 -5
- package/components/input/input.js +10 -10
- package/components/input/input.spec.js +18 -18
- package/components/label/_label.scss +24 -24
- package/components/label/_macro.spec.js +173 -170
- package/components/language-selector/_macro.spec.js +97 -97
- package/components/language-selector/language.scss +7 -7
- package/components/list/_list.scss +84 -84
- package/components/list/_macro.njk +2 -2
- package/components/list/_macro.spec.js +583 -583
- package/components/message/_macro.njk +5 -5
- package/components/message/_macro.spec.js +74 -74
- package/components/message/_message.scss +39 -39
- package/components/message-list/_macro.spec.js +86 -86
- package/components/message-list/_message-list.scss +16 -16
- package/components/modal/_macro.spec.js +69 -69
- package/components/modal/_modal.scss +36 -36
- package/components/modal/modal.dom.js +6 -6
- package/components/modal/modal.js +89 -89
- package/components/modal/modal.spec.js +50 -50
- package/components/mutually-exclusive/_macro.spec.js +140 -140
- package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
- package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
- package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
- package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
- package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
- package/components/mutually-exclusive/mutually-exclusive.js +137 -137
- package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
- package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
- package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
- package/components/navigation/_macro.spec.js +360 -354
- package/components/navigation/_navigation.scss +122 -123
- package/components/navigation/navigation.dom.js +35 -35
- package/components/navigation/navigation.js +49 -49
- package/components/navigation/navigation.spec.js +249 -249
- package/components/pagination/_macro.spec.js +342 -335
- package/components/pagination/_pagination.scss +58 -58
- package/components/panel/_macro.spec.js +372 -372
- package/components/panel/_panel.scss +200 -199
- package/components/password/_macro.spec.js +95 -95
- package/components/password/password.dom.js +5 -5
- package/components/password/password.js +10 -10
- package/components/password/password.spec.js +26 -26
- package/components/phase-banner/_macro.spec.js +86 -86
- package/components/phase-banner/_phase-banner.scss +16 -16
- package/components/question/_macro.spec.js +235 -235
- package/components/question/_question.scss +24 -24
- package/components/quote/_macro.spec.js +52 -52
- package/components/quote/_quote.scss +24 -24
- package/components/radios/_macro.spec.js +524 -524
- package/components/radios/_radio.scss +49 -48
- package/components/radios/_radios.scss +14 -20
- package/components/radios/check-radios.js +21 -21
- package/components/radios/clear-radios.js +45 -45
- package/components/radios/radio-with-fieldset.js +22 -22
- package/components/radios/radios.dom.js +32 -32
- package/components/radios/radios.spec.js +251 -251
- package/components/related-content/_macro.spec.js +109 -109
- package/components/related-content/_related-content.scss +12 -12
- package/components/related-content/_section-macro.spec.js +20 -20
- package/components/relationships/_macro.spec.js +94 -94
- package/components/relationships/_relationships.scss +9 -9
- package/components/relationships/relationships.dom.js +5 -5
- package/components/relationships/relationships.js +18 -18
- package/components/relationships/relationships.spec.js +71 -71
- package/components/reply/_macro.spec.js +47 -47
- package/components/reply/reply-input.js +15 -15
- package/components/reply/reply.dom.js +5 -5
- package/components/reply/reply.spec.js +57 -57
- package/components/section-navigation/_macro.spec.js +210 -210
- package/components/section-navigation/_section-navigation.scss +76 -76
- package/components/select/_macro.spec.js +166 -166
- package/components/share-page/_macro.spec.js +68 -68
- package/components/skip-to-content/_macro.spec.js +54 -54
- package/components/skip-to-content/_skip.scss +30 -30
- package/components/skip-to-content/skip-to-content.dom.js +6 -6
- package/components/skip-to-content/skip-to-content.js +7 -7
- package/components/skip-to-content/skip-to-content.spec.js +21 -21
- package/components/status/_macro.spec.js +53 -53
- package/components/status/_status.scss +32 -32
- package/components/summary/_macro.spec.js +551 -535
- package/components/summary/_summary.scss +191 -195
- package/components/table/_macro.spec.js +499 -499
- package/components/table/_table.scss +204 -201
- package/components/table/scrollable-table.dom.js +5 -5
- package/components/table/scrollable-table.js +60 -60
- package/components/table/sortable-table.dom.js +5 -5
- package/components/table/sortable-table.js +135 -135
- package/components/table/table.spec.js +144 -140
- package/components/table-of-contents/_macro.spec.js +125 -125
- package/components/table-of-contents/_toc.scss +9 -9
- package/components/table-of-contents/toc.dom.js +5 -5
- package/components/table-of-contents/toc.js +30 -30
- package/components/table-of-contents/toc.spec.js +88 -88
- package/components/tabs/_macro.spec.js +92 -92
- package/components/tabs/_tabs.scss +120 -115
- package/components/tabs/tabs.dom.js +5 -5
- package/components/tabs/tabs.js +266 -266
- package/components/tabs/tabs.spec.js +268 -268
- package/components/text-indent/_macro.spec.js +33 -33
- package/components/text-indent/_text-indent.scss +3 -3
- package/components/textarea/_macro.spec.js +238 -238
- package/components/textarea/textarea.dom.js +5 -5
- package/components/textarea/textarea.spec.js +78 -74
- package/components/timeline/_macro.spec.js +83 -83
- package/components/timeline/_timeline.scss +26 -26
- package/components/timeout-modal/_macro.spec.js +47 -47
- package/components/timeout-modal/timeout-modal.dom.js +9 -9
- package/components/timeout-modal/timeout-modal.js +66 -66
- package/components/timeout-modal/timeout-modal.spec.js +157 -157
- package/components/timeout-panel/_macro.spec.js +41 -41
- package/components/timeout-panel/timeout-panel.dom.js +8 -8
- package/components/timeout-panel/timeout-panel.spec.js +118 -118
- package/components/upload/_macro.spec.js +52 -52
- package/components/upload/_upload.scss +28 -28
- package/components/video/_macro.spec.js +42 -42
- package/components/video/_video.scss +16 -16
- package/components/video/video.dom.js +5 -5
- package/components/video/video.js +32 -32
- package/components/video/video.spec.js +103 -97
- package/css/main.css +1 -1
- package/favicons/android-chrome-192x192.png +0 -0
- package/favicons/android-chrome-512x512.png +0 -0
- package/favicons/apple-touch-icon.png +0 -0
- package/favicons/favicon-16x16.png +0 -0
- package/favicons/favicon-32x32.png +0 -0
- package/favicons/favicon.ico +0 -0
- package/favicons/manifest.json +25 -25
- package/favicons/maskable_icon.png +0 -0
- package/favicons/opengraph.png +0 -0
- package/favicons/twitter.png +0 -0
- package/img/large/alison-pritchard-featured.jpg +0 -0
- package/img/large/alison-pritchard.jpg +0 -0
- package/img/large/census-monuments-lights-featured.jpg +0 -0
- package/img/large/census-monuments-lights.jpg +0 -0
- package/img/large/mother-and-daughter-in-ireland.jpg +0 -0
- package/img/large/mum-and-child-healthcare-belfast.jpg +0 -0
- package/img/large/ons-award-winners.jpg +0 -0
- package/img/large/placeholder-card.png +0 -0
- package/img/large/placeholder-news-medium.png +0 -0
- package/img/large/placeholder-news.png +0 -0
- package/img/large/placeholder-portrait.png +0 -0
- package/img/large/students.jpg +0 -0
- package/img/large/woman-in-purple-dress-shirt.jpg +0 -0
- package/img/small/alison-pritchard-featured.jpg +0 -0
- package/img/small/alison-pritchard.jpg +0 -0
- package/img/small/census-monuments-lights-featured.jpg +0 -0
- package/img/small/census-monuments-lights.jpg +0 -0
- package/img/small/mother-and-daughter-in-ireland.jpg +0 -0
- package/img/small/mum-and-child-healthcare-belfast.jpg +0 -0
- package/img/small/ons-award-winners.jpg +0 -0
- package/img/small/placeholder-card.png +0 -0
- package/img/small/placeholder-news-medium.png +0 -0
- package/img/small/placeholder-news.png +0 -0
- package/img/small/placeholder-portrait.png +0 -0
- package/img/small/students.jpg +0 -0
- package/img/small/woman-in-purple-dress-shirt.jpg +0 -0
- package/js/abortable-fetch.js +23 -23
- package/js/analytics.js +53 -53
- package/js/cookies-functions.js +135 -135
- package/js/cookies-settings.dom.js +7 -7
- package/js/cookies-settings.js +77 -77
- package/js/cookies-settings.spec.js +106 -106
- package/js/domready.js +8 -8
- package/js/fetch.js +14 -14
- package/js/inpagelink.dom.js +5 -5
- package/js/inpagelink.js +19 -19
- package/js/polyfills.js +0 -1
- package/js/print-button.js +6 -6
- package/js/timeout.js +211 -211
- package/layout/_template.njk +5 -7
- package/package.json +131 -127
- package/scripts/main.es5.js +1 -1
- package/scripts/main.js +1 -1
- package/scss/base/_forms.scss +10 -10
- package/scss/base/_global.scss +45 -44
- package/scss/base/_typography.scss +20 -20
- package/scss/helpers/_functions.scss +18 -15
- package/scss/helpers/_mixins.scss +59 -53
- package/scss/helpers/_mq.scss +62 -65
- package/scss/objects/_container.scss +20 -20
- package/scss/objects/_page.scss +33 -33
- package/scss/objects/_spacing.scss +10 -10
- package/scss/overrides/hcm.scss +237 -237
- package/scss/overrides/rtl.scss +95 -95
- package/scss/print.scss +47 -47
- package/scss/utilities/_border.scss +7 -7
- package/scss/utilities/_colors.scss +6 -6
- package/scss/utilities/_display.scss +8 -8
- package/scss/utilities/_float.scss +7 -7
- package/scss/utilities/_grid.scss +144 -144
- package/scss/utilities/_highlight.scss +4 -4
- package/scss/utilities/_margin.scss +17 -17
- package/scss/utilities/_pad.scss +15 -15
- package/scss/utilities/_typography.scss +35 -33
- package/scss/utilities/_utilities.scss +8 -8
- package/scss/utilities/_visibility.scss +25 -25
- package/scss/vars/_colors.scss +116 -116
- package/scss/vars/_forms.scss +22 -22
- package/scss/vars/_grid.scss +11 -9
- 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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
93
|
-
|
|
70
|
+
beforeAll(async () => {
|
|
71
|
+
await apiFaker.setup(page);
|
|
72
|
+
});
|
|
94
73
|
|
|
95
|
-
|
|
96
|
-
|
|
74
|
+
beforeEach(async () => {
|
|
75
|
+
await apiFaker.reset();
|
|
97
76
|
});
|
|
98
77
|
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
116
|
-
|
|
99
|
+
it('the instructions, listbox, and status should become visible', async () => {
|
|
100
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
117
101
|
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
123
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
|
|
134
|
-
|
|
122
|
+
it('navigates to the suggestion below the current suggestion', async () => {
|
|
123
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
135
124
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
144
|
-
|
|
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
|
-
|
|
149
|
-
|
|
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
|
-
|
|
152
|
-
|
|
140
|
+
const ariaSelectedValue = await page.$eval('.ons-autosuggest__option--focused', (node) => node.getAttribute('aria-selected'));
|
|
141
|
+
expect(ariaSelectedValue).toBe('true');
|
|
153
142
|
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
159
|
-
|
|
150
|
+
it('sets aria status to a message showing the selected result', async () => {
|
|
151
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
160
152
|
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
166
|
-
|
|
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
|
-
|
|
170
|
-
|
|
160
|
+
it('does not mark other suggestions as being selected', async () => {
|
|
161
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
171
162
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
178
|
-
|
|
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
|
-
|
|
182
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
193
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
|
|
202
|
-
|
|
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
|
-
|
|
205
|
-
|
|
194
|
+
const inputValue = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
|
|
195
|
+
expect(inputValue).toBe('United');
|
|
196
|
+
});
|
|
206
197
|
});
|
|
207
198
|
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
212
|
-
|
|
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
|
-
|
|
217
|
-
|
|
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
|
-
|
|
221
|
-
|
|
210
|
+
it('navigates to the suggestion above the current suggestion', async () => {
|
|
211
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
222
212
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
232
|
-
|
|
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
|
-
|
|
237
|
-
|
|
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
|
-
|
|
240
|
-
|
|
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
|
-
|
|
245
|
-
|
|
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
|
-
|
|
249
|
-
|
|
240
|
+
it('does not mark other suggestions as being selected', async () => {
|
|
241
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
250
242
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
256
|
-
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
269
|
-
|
|
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
-
|
|
283
|
-
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
292
|
-
|
|
295
|
+
await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
|
|
296
|
+
await page.keyboard.press('Tab');
|
|
293
297
|
|
|
294
|
-
|
|
295
|
-
|
|
298
|
+
const suggestionCountSample1 = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
|
|
299
|
+
expect(suggestionCountSample1).toBe(2);
|
|
296
300
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
-
|
|
307
|
-
|
|
310
|
+
it('clears innerHTML of listbox', async () => {
|
|
311
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
308
312
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
317
|
+
const listboxInnerHTML = await page.$eval('.ons-js-autosuggest-listbox', (node) => node.innerHTML);
|
|
318
|
+
expect(listboxInnerHTML).toBe('');
|
|
319
|
+
});
|
|
316
320
|
|
|
317
|
-
|
|
318
|
-
|
|
321
|
+
it('clears `has-results` modifier of autosuggest component', async () => {
|
|
322
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
319
323
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
325
|
-
|
|
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
|
-
|
|
329
|
-
|
|
332
|
+
it('clears aria attributes of input element', async () => {
|
|
333
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
330
334
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
346
|
-
|
|
349
|
+
await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
|
|
350
|
+
await page.click('.ons-autosuggest__option:nth-child(2)');
|
|
347
351
|
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
361
|
+
await page.type('.ons-js-autosuggest-input', 'En', { delay: 20 });
|
|
358
362
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
363
|
+
const suggestionCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
|
|
364
|
+
expect(suggestionCount).toBe(0);
|
|
365
|
+
});
|
|
362
366
|
|
|
363
|
-
|
|
364
|
-
|
|
367
|
+
it('shows suggestions when input length >= minimum characters', async () => {
|
|
368
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
365
369
|
|
|
366
|
-
|
|
370
|
+
await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
|
|
367
371
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
372
|
+
const suggestionCount = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.length);
|
|
373
|
+
expect(suggestionCount).toBe(1);
|
|
374
|
+
});
|
|
371
375
|
|
|
372
|
-
|
|
373
|
-
|
|
376
|
+
it('gets the language if set', async () => {
|
|
377
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST_WITH_LANGUAGE));
|
|
374
378
|
|
|
375
|
-
|
|
379
|
+
await page.type('.ons-js-autosuggest-input', 'Eng', { delay: 20 });
|
|
376
380
|
|
|
377
|
-
|
|
378
|
-
|
|
381
|
+
const attributes = await getNodeAttributes(page, '.ons-js-autosuggest');
|
|
382
|
+
expect(attributes['data-lang']).toBe('en-gb');
|
|
383
|
+
});
|
|
379
384
|
});
|
|
380
|
-
});
|
|
381
385
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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
|
-
|
|
391
|
-
|
|
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
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
-
|
|
420
|
-
|
|
421
|
-
|
|
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
|
-
|
|
424
|
-
|
|
414
|
+
const focusedClassCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
|
|
415
|
+
expect(focusedClassCount).toBe(1);
|
|
416
|
+
});
|
|
425
417
|
});
|
|
426
418
|
|
|
427
|
-
|
|
428
|
-
|
|
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
|
-
|
|
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
|
-
|
|
433
|
-
|
|
434
|
-
|
|
427
|
+
const focusedNodeCount = await page.$$eval('.ons-autosuggest__option--focused', (nodes) => nodes.length);
|
|
428
|
+
expect(focusedNodeCount).toBe(0);
|
|
429
|
+
});
|
|
435
430
|
|
|
436
|
-
|
|
437
|
-
|
|
431
|
+
it('decorates input element with `aria-expanded` attribute', async () => {
|
|
432
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
438
433
|
|
|
439
|
-
|
|
434
|
+
await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
|
|
440
435
|
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
446
|
-
|
|
440
|
+
it('emboldens matched suggestion text', async () => {
|
|
441
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
447
442
|
|
|
448
|
-
|
|
443
|
+
await page.type('.ons-js-autosuggest-input', 'Unite', { delay: 20 });
|
|
449
444
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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
|
-
|
|
457
|
-
|
|
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
|
-
|
|
452
|
+
await page.type('.ons-js-autosuggest-input', 'tland', { delay: 20 });
|
|
460
453
|
|
|
461
|
-
|
|
462
|
-
|
|
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
|
-
|
|
466
|
-
|
|
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
|
-
|
|
463
|
+
await page.type('.ons-js-autosuggest-input', 'st', { delay: 20 });
|
|
469
464
|
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
475
|
-
|
|
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
|
-
|
|
481
|
+
await page.type('.ons-js-autosuggest-input', 'sta', { delay: 20 });
|
|
478
482
|
|
|
479
|
-
|
|
480
|
-
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
-
|
|
493
|
+
await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
|
|
490
494
|
|
|
491
|
-
|
|
492
|
-
|
|
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
|
-
|
|
496
|
-
|
|
499
|
+
it('decorates input element with `aria-expanded` attribute', async () => {
|
|
500
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
497
501
|
|
|
498
|
-
|
|
502
|
+
await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
|
|
499
503
|
|
|
500
|
-
|
|
501
|
-
|
|
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
|
-
|
|
505
|
-
|
|
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
|
-
|
|
511
|
+
await page.type('.ons-js-autosuggest-input', 'ab', { delay: 20 });
|
|
508
512
|
|
|
509
|
-
|
|
510
|
-
|
|
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
|
-
|
|
514
|
-
|
|
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
|
-
|
|
520
|
+
await page.type('.ons-js-autosuggest-input', 'abc', { delay: 20 });
|
|
517
521
|
|
|
518
|
-
|
|
519
|
-
|
|
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
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
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
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
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
|
-
|
|
568
|
+
await setTestPage('/test', renderComponent('autosuggest', EXAMPLE_AUTOSUGGEST));
|
|
565
569
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
570
|
+
await page.focus('.ons-js-autosuggest-input');
|
|
571
|
+
await page.type('.ons-js-autosuggest-input', 'tes', { delay: 20 });
|
|
572
|
+
});
|
|
569
573
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
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
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
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
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
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
|
});
|