@api-client/ui 0.5.38 → 0.5.40
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/build/src/md/list/internals/ListItem.d.ts +24 -15
- package/build/src/md/list/internals/ListItem.d.ts.map +1 -1
- package/build/src/md/list/internals/ListItem.js +85 -59
- package/build/src/md/list/internals/ListItem.js.map +1 -1
- package/build/src/md/list/internals/ListItem.styles.js +11 -11
- package/build/src/md/list/internals/ListItem.styles.js.map +1 -1
- package/build/src/md/select/internals/Option.d.ts +4 -14
- package/build/src/md/select/internals/Option.d.ts.map +1 -1
- package/build/src/md/select/internals/Option.js +13 -28
- package/build/src/md/select/internals/Option.js.map +1 -1
- package/build/src/md/select/internals/Select.d.ts +1 -1
- package/build/src/md/select/internals/Select.d.ts.map +1 -1
- package/build/src/md/select/internals/Select.js +15 -5
- package/build/src/md/select/internals/Select.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/src/md/list/internals/ListItem.styles.ts +11 -11
- package/src/md/list/internals/ListItem.ts +68 -43
- package/src/md/select/internals/Option.ts +14 -26
- package/src/md/select/internals/Select.ts +15 -5
- package/.aiexclude +0 -3
- package/.cursor/rules/html-and-css-best-practices.mdc +0 -63
- package/.cursor/rules/lit-best-practices.mdc +0 -89
- package/.editorconfig +0 -29
- package/.github/CONTRIBUTING.md +0 -24
- package/.github/instructions/html-and-css-best-practices.instructions.md +0 -70
- package/.github/instructions/lit-best-practices.instructions.md +0 -90
- package/.github/release.yml +0 -14
- package/.github/stale.yml +0 -23
- package/.github/workflows/auto-release.yml +0 -182
- package/.github/workflows/release.yml +0 -82
- package/.prettierrc.js +0 -14
- package/.vscode/settings.json +0 -18
- package/RELEASE.md +0 -163
- package/RELEASE_SETUP.md +0 -235
- package/build/src/demo/DemoPage.d.ts +0 -81
- package/build/src/demo/DemoPage.d.ts.map +0 -1
- package/build/src/demo/DemoPage.js +0 -175
- package/build/src/demo/DemoPage.js.map +0 -1
- package/build/src/demo/DemoStyles.d.ts +0 -3
- package/build/src/demo/DemoStyles.d.ts.map +0 -1
- package/build/src/demo/DemoStyles.js +0 -60
- package/build/src/demo/DemoStyles.js.map +0 -1
- package/build/test/elements/navigation/Navigation.test.d.ts +0 -3
- package/build/test/elements/navigation/Navigation.test.d.ts.map +0 -1
- package/build/test/elements/navigation/Navigation.test.js +0 -113
- package/build/test/elements/navigation/Navigation.test.js.map +0 -1
- package/commitlint.config.cjs +0 -2
- package/demo/elements/authorization/AuthPlugin.js +0 -57
- package/demo/elements/authorization/AuthProxy.js +0 -215
- package/demo/elements/authorization/api-key.html +0 -27
- package/demo/elements/authorization/api-key.ts +0 -44
- package/demo/elements/authorization/basic.html +0 -27
- package/demo/elements/authorization/basic.ts +0 -43
- package/demo/elements/authorization/bearer.html +0 -27
- package/demo/elements/authorization/bearer.ts +0 -43
- package/demo/elements/authorization/env.js +0 -8
- package/demo/elements/authorization/index.html +0 -44
- package/demo/elements/authorization/ntlm.html +0 -27
- package/demo/elements/authorization/ntlm.ts +0 -43
- package/demo/elements/authorization/oauth-authorize.html +0 -75
- package/demo/elements/authorization/oauth-authorize.ts +0 -40
- package/demo/elements/authorization/oauth-error.html +0 -18
- package/demo/elements/authorization/oauth-error.ts +0 -10
- package/demo/elements/authorization/oauth-popup.html +0 -36
- package/demo/elements/authorization/oauth2.html +0 -27
- package/demo/elements/authorization/oauth2.ts +0 -100
- package/demo/elements/authorization/oidc.html +0 -27
- package/demo/elements/authorization/oidc.ts +0 -139
- package/demo/elements/authorization/private.crt +0 -31
- package/demo/elements/authorization/private.csr +0 -28
- package/demo/elements/authorization/private.key +0 -51
- package/demo/elements/authorization/private.pem +0 -31
- package/demo/elements/authorization/redirect.html +0 -20
- package/demo/elements/authorization/ssl-commands.sh +0 -30
- package/demo/elements/authorization/ssl.conf +0 -24
- package/demo/elements/autocomplete/index.html +0 -64
- package/demo/elements/autocomplete/index.ts +0 -171
- package/demo/elements/code-editor/CodeEditorDemo.ts +0 -173
- package/demo/elements/code-editor/index.html +0 -19
- package/demo/elements/context-menu/DemoIcons.ts +0 -21
- package/demo/elements/context-menu/basic.html +0 -25
- package/demo/elements/context-menu/basic.ts +0 -119
- package/demo/elements/context-menu/custom-data.html +0 -25
- package/demo/elements/context-menu/custom-data.ts +0 -62
- package/demo/elements/context-menu/demo.css +0 -28
- package/demo/elements/context-menu/enabled-state.html +0 -25
- package/demo/elements/context-menu/enabled-state.ts +0 -73
- package/demo/elements/context-menu/icons.html +0 -25
- package/demo/elements/context-menu/icons.ts +0 -64
- package/demo/elements/context-menu/index.html +0 -43
- package/demo/elements/context-menu/nested.html +0 -25
- package/demo/elements/context-menu/nestedt.ts +0 -152
- package/demo/elements/context-menu/no-execute.html +0 -25
- package/demo/elements/context-menu/no-execute.ts +0 -134
- package/demo/elements/context-menu/radio-menu.html +0 -25
- package/demo/elements/context-menu/radio-menu.ts +0 -83
- package/demo/elements/context-menu/separators.html +0 -25
- package/demo/elements/context-menu/separators.ts +0 -172
- package/demo/elements/currency/index.html +0 -91
- package/demo/elements/currency/index.ts +0 -352
- package/demo/elements/environment/environment-editor.html +0 -20
- package/demo/elements/environment/environment-editor.ts +0 -49
- package/demo/elements/environment/index.html +0 -33
- package/demo/elements/environment/server-editor.html +0 -20
- package/demo/elements/environment/server-editor.ts +0 -67
- package/demo/elements/environment/variables-editor.html +0 -20
- package/demo/elements/environment/variables-editor.ts +0 -94
- package/demo/elements/har/har-viewer.html +0 -20
- package/demo/elements/har/har-viewer.ts +0 -76
- package/demo/elements/har/har1.har +0 -3044
- package/demo/elements/har/har2.json +0 -439
- package/demo/elements/har/index.html +0 -26
- package/demo/elements/highlight/example.md +0 -27
- package/demo/elements/highlight/index.html +0 -31
- package/demo/elements/highlight/marked-highlight.html +0 -132
- package/demo/elements/highlight/marked-highlight.ts +0 -22
- package/demo/elements/highlight/prism-highlight.html +0 -62
- package/demo/elements/highlight/prism-highlight.ts +0 -17
- package/demo/elements/http/body-editor.html +0 -17
- package/demo/elements/http/body-editor.ts +0 -115
- package/demo/elements/http/headers.html +0 -17
- package/demo/elements/http/headers.ts +0 -59
- package/demo/elements/http/http-assertions.html +0 -20
- package/demo/elements/http/http-assertions.ts +0 -89
- package/demo/elements/http/http-flows.html +0 -23
- package/demo/elements/http/http-flows.ts +0 -89
- package/demo/elements/http/index.html +0 -45
- package/demo/elements/http/request-editor.html +0 -26
- package/demo/elements/http/request-editor.ts +0 -197
- package/demo/elements/http/request-log.html +0 -16
- package/demo/elements/http/request-log.ts +0 -136
- package/demo/elements/http/url-editing.html +0 -17
- package/demo/elements/http/url-editing.ts +0 -112
- package/demo/elements/icons/index.html +0 -81
- package/demo/elements/icons/index.ts +0 -52
- package/demo/elements/index.html +0 -72
- package/demo/elements/mention-textarea/index.html +0 -19
- package/demo/elements/mention-textarea/index.ts +0 -205
- package/demo/elements/navigation/navigation-item.html +0 -49
- package/demo/elements/navigation/navigation-item.ts +0 -131
- package/demo/elements/navigation/navigation.html +0 -20
- package/demo/elements/navigation/navigation.ts +0 -45
- package/demo/elements/project/index.html +0 -29
- package/demo/elements/project/project-run-report.html +0 -20
- package/demo/elements/project/project-run-report.ts +0 -132
- package/demo/elements/project/request-editor.html +0 -23
- package/demo/elements/project/request-editor.ts +0 -232
- package/demo/elements/user/user-avatar.html +0 -17
- package/demo/elements/user/user-avatar.ts +0 -60
- package/demo/env.js +0 -4
- package/demo/index.html +0 -34
- package/demo/layout/index.html +0 -94
- package/demo/layout/index.ts +0 -190
- package/demo/md/DemoStyles.ts +0 -61
- package/demo/md/UiDemoPage.ts +0 -6
- package/demo/md/buttons/button.html +0 -121
- package/demo/md/buttons/button.ts +0 -246
- package/demo/md/buttons/group.html +0 -36
- package/demo/md/buttons/group.ts +0 -171
- package/demo/md/checkbox/index.html +0 -39
- package/demo/md/checkbox/index.ts +0 -220
- package/demo/md/chip/chip.html +0 -70
- package/demo/md/chip/chip.ts +0 -219
- package/demo/md/chip/pawel6c9a.jpg +0 -0
- package/demo/md/collapse/CustomDetail.ts +0 -89
- package/demo/md/collapse/collapse.html +0 -21
- package/demo/md/collapse/collapse.ts +0 -78
- package/demo/md/date-picker/date-picker.ts +0 -336
- package/demo/md/date-picker/index.html +0 -171
- package/demo/md/dialog/confirm-dialog.html +0 -49
- package/demo/md/dialog/confirm-dialog.ts +0 -121
- package/demo/md/dialog/dialog.html +0 -25
- package/demo/md/dialog/dialog.ts +0 -468
- package/demo/md/dropdown-list/index.html +0 -31
- package/demo/md/dropdown-list/index.ts +0 -158
- package/demo/md/icon-button/index.html +0 -122
- package/demo/md/icon-button/index.ts +0 -132
- package/demo/md/index.html +0 -73
- package/demo/md/inputs/input.html +0 -73
- package/demo/md/inputs/input.ts +0 -278
- package/demo/md/inputs/radio.html +0 -39
- package/demo/md/inputs/radio.ts +0 -156
- package/demo/md/inputs/switch.html +0 -45
- package/demo/md/inputs/switch.ts +0 -144
- package/demo/md/list/list.html +0 -65
- package/demo/md/list/list.ts +0 -204
- package/demo/md/listbox/listbox.html +0 -31
- package/demo/md/listbox/listbox.ts +0 -27
- package/demo/md/menu/index.html +0 -19
- package/demo/md/menu/index.ts +0 -514
- package/demo/md/notification/snack.html +0 -21
- package/demo/md/notification/snack.ts +0 -70
- package/demo/md/progress/progress.html +0 -46
- package/demo/md/progress/progress.ts +0 -161
- package/demo/md/segmented-button/index.html +0 -21
- package/demo/md/segmented-button/index.ts +0 -55
- package/demo/md/select/index.html +0 -16
- package/demo/md/select/index.ts +0 -207
- package/demo/md/tabs/tabs.html +0 -40
- package/demo/md/tabs/tabs.ts +0 -214
- package/demo/oauth-popup.html +0 -36
- package/demo/page.css +0 -8
- package/demo/resources/calendar-month.png +0 -0
- package/demo/resources/favorite.png +0 -0
- package/demo/resources/fingerprint.png +0 -0
- package/demo/resources/home-work.png +0 -0
- package/demo/resources/mood.png +0 -0
- package/demo/resources/print.png +0 -0
- package/demo/resources/stars.png +0 -0
- package/demo/resources/theaters.png +0 -0
- package/demo/tsconfig.json +0 -4
- package/eslint.config.js +0 -97
- package/scripts/copy-assets.js +0 -21
- package/scripts/release.js +0 -66
- package/src/demo/DemoPage.ts +0 -169
- package/src/demo/DemoStyles.ts +0 -60
- package/test/README.md +0 -375
- package/test/contextual-menu/ContextMenu.test.ts +0 -760
- package/test/contextual-menu/ContextMenuElement.test.ts +0 -569
- package/test/core/activity.spec.ts +0 -413
- package/test/core/activity_manager.spec.ts +0 -544
- package/test/core/application.spec.ts +0 -218
- package/test/core/fragment.spec.ts +0 -565
- package/test/core/fragment_manager.spec.ts +0 -404
- package/test/core/live_data.spec.ts +0 -558
- package/test/core/renderer.spec.ts +0 -113
- package/test/dom-assertions.test.ts +0 -182
- package/test/elements/MonacoSetup.ts +0 -65
- package/test/elements/authorization/basic-method.test.ts +0 -177
- package/test/elements/authorization/bearer-method.test.ts +0 -143
- package/test/elements/authorization/ntlm-method.test.ts +0 -219
- package/test/elements/authorization/oauth2-client-credentials-method.test.ts +0 -334
- package/test/elements/authorization/oauth2-code-method.test.ts +0 -320
- package/test/elements/authorization/oauth2-custom-grant-method.test.ts +0 -255
- package/test/elements/authorization/oauth2-device-code-method.test.ts +0 -371
- package/test/elements/authorization/oauth2-implicit-method.test.ts +0 -407
- package/test/elements/authorization/oauth2-jwt-method.test.ts +0 -217
- package/test/elements/authorization/oauth2-password-method.test.ts +0 -275
- package/test/elements/authorization/openid-method.test.ts +0 -591
- package/test/elements/autocomplete/autocomplete-input.spec.ts +0 -646
- package/test/elements/code-editor/code-editor.accessibility.test.ts +0 -298
- package/test/elements/code-editor/code-editor.test.ts +0 -574
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +0 -328
- package/test/elements/currency/CurrencyPicker.core.test.ts +0 -318
- package/test/elements/currency/CurrencyPicker.integration.test.ts +0 -482
- package/test/elements/currency/CurrencyPicker.test.ts +0 -486
- package/test/elements/data-table/DataTable.browser.test.ts +0 -649
- package/test/elements/har/HarUtils.test.ts +0 -45
- package/test/elements/har/HarViewerElement.test.ts +0 -687
- package/test/elements/har/test-data/har1.har +0 -3044
- package/test/elements/highlight/MarkedHighlightElement.test.ts +0 -452
- package/test/elements/highlight/PrismHighlightElement.test.ts +0 -79
- package/test/elements/highlight/PrismHighlighter.test.ts +0 -94
- package/test/elements/highlight/remoteSanitization.md +0 -1
- package/test/elements/highlight/test.md +0 -3
- package/test/elements/highlight/test1.md +0 -3
- package/test/elements/highlight/test2.md +0 -1
- package/test/elements/http/BodyFormdataEditorElement.test.ts +0 -482
- package/test/elements/http/BodyMultipartEditorElement.test.ts +0 -658
- package/test/elements/http/BodyRawEditorElement.test.ts +0 -90
- package/test/elements/http/CertificateAdd.test.ts +0 -457
- package/test/elements/http/HttpAssertions.test.ts +0 -994
- package/test/elements/http/HttpFlows.test.ts +0 -502
- package/test/elements/http/UrlEncodeUtils.test.ts +0 -202
- package/test/elements/layout/SplitItem.test.ts +0 -440
- package/test/elements/layout/SplitLayoutManager.test.ts +0 -1501
- package/test/elements/layout/SplitPanel.test.ts +0 -1109
- package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +0 -114
- package/test/elements/mention-textarea/MentionTextArea.test.ts +0 -613
- package/test/elements/navigation/Navigation.test.ts +0 -120
- package/test/env.ts +0 -15
- package/test/events/EventTypes.test.ts +0 -363
- package/test/events/EventsTestHelpers.ts +0 -16
- package/test/helpers/TestUtils.ts +0 -243
- package/test/helpers/UiMock.ts +0 -185
- package/test/lib/Dom.test.ts +0 -231
- package/test/md/button/UiButton.test.ts +0 -347
- package/test/md/button/UiIconButton.test.ts +0 -155
- package/test/md/chip/UiChip.test.ts +0 -219
- package/test/md/collapse/UiCollapse.test.ts +0 -250
- package/test/md/collapse/flex-layout.test.ts +0 -105
- package/test/md/date-time/DateTime.test.ts +0 -348
- package/test/md/dialog/UiConfirmDialog.test.ts +0 -131
- package/test/md/dialog/UiDialog.test.ts +0 -759
- package/test/md/menu/Menu.test.ts +0 -855
- package/test/md/menu/MenuIntegration.test.ts +0 -426
- package/test/md/menu/MenuItem.test.ts +0 -652
- package/test/md/menu/SubMenu.test.ts +0 -410
- package/test/md/progress/UiCircularProgressElement.test.ts +0 -481
- package/test/md/progress/UiProgressElement.test.ts +0 -117
- package/test/md/progress/UiRangeElement.test.ts +0 -156
- package/test/md/select/Select.test.ts +0 -925
- package/test/plugins/takeScreenshotPlugin.js +0 -35
- package/test/setup.test.ts +0 -217
- package/test/setup.ts +0 -117
- package/test/tsconfig.json +0 -7
- package/web-dev-server.config.js +0 -21
- package/web-test-runner.config.js +0 -90
|
@@ -1,328 +0,0 @@
|
|
|
1
|
-
import { fixture, assert, html } from '@open-wc/testing'
|
|
2
|
-
import { sendKeys } from '@web/test-runner-commands'
|
|
3
|
-
import CurrencyPicker from '../../../src/elements/currency/internals/Picker.js'
|
|
4
|
-
import '../../../src/elements/currency/currency-picker.js'
|
|
5
|
-
|
|
6
|
-
describe('CurrencyPicker - Accessibility', () => {
|
|
7
|
-
async function basicFixture(): Promise<CurrencyPicker> {
|
|
8
|
-
return fixture(html`<currency-picker label="Select Currency"></currency-picker>`)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async function multiSelectFixture(): Promise<CurrencyPicker> {
|
|
12
|
-
return fixture(html`<currency-picker multi label="Select Multiple Currencies"></currency-picker>`)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async function errorStateFixture(): Promise<CurrencyPicker> {
|
|
16
|
-
return fixture(html`<currency-picker required label="Required Currency Selection"></currency-picker>`)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
describe('ARIA Attributes', () => {
|
|
20
|
-
let picker: CurrencyPicker
|
|
21
|
-
|
|
22
|
-
beforeEach(async () => {
|
|
23
|
-
picker = await basicFixture()
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('should have proper ARIA roles', async () => {
|
|
27
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
28
|
-
assert.equal(container?.getAttribute('role'), 'group')
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('should have descriptive ARIA labels', async () => {
|
|
32
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
33
|
-
const ariaLabel = container?.getAttribute('aria-label')
|
|
34
|
-
|
|
35
|
-
assert.exists(ariaLabel)
|
|
36
|
-
assert.include(ariaLabel || '', 'Currency selector')
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('should update ARIA labels when selection changes', async () => {
|
|
40
|
-
picker.selected = ['USD']
|
|
41
|
-
await picker.updateComplete
|
|
42
|
-
|
|
43
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
44
|
-
const ariaLabel = container?.getAttribute('aria-label')
|
|
45
|
-
|
|
46
|
-
assert.include(ariaLabel || '', 'USD selected')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('should have proper ARIA invalid state', async () => {
|
|
50
|
-
picker.required = true
|
|
51
|
-
picker.clearSelection()
|
|
52
|
-
await picker.updateComplete
|
|
53
|
-
|
|
54
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
55
|
-
assert.equal(select?.getAttribute('aria-invalid'), 'true')
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('should have aria-describedby when supporting text is present', async () => {
|
|
59
|
-
picker.supportingText = 'Choose your preferred currency'
|
|
60
|
-
await picker.updateComplete
|
|
61
|
-
|
|
62
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
63
|
-
assert.exists(select?.getAttribute('aria-describedby'))
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
describe('Multi-select ARIA', () => {
|
|
68
|
-
let picker: CurrencyPicker
|
|
69
|
-
|
|
70
|
-
beforeEach(async () => {
|
|
71
|
-
picker = await multiSelectFixture()
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('should announce selection count for multi-select', async () => {
|
|
75
|
-
picker.selected = ['USD', 'EUR', 'GBP']
|
|
76
|
-
await picker.updateComplete
|
|
77
|
-
|
|
78
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
79
|
-
const ariaLabel = container?.getAttribute('aria-label')
|
|
80
|
-
|
|
81
|
-
assert.include(ariaLabel || '', '3 currencies selected')
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('should have removable chips with proper labels', async () => {
|
|
85
|
-
picker.selected = ['USD', 'EUR']
|
|
86
|
-
await picker.updateComplete
|
|
87
|
-
|
|
88
|
-
const chips = picker.shadowRoot?.querySelectorAll('ui-chip[removable]')
|
|
89
|
-
assert.equal(chips?.length, 2)
|
|
90
|
-
|
|
91
|
-
chips?.forEach((chip) => {
|
|
92
|
-
assert.isTrue(chip.hasAttribute('removable'))
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
describe('Error Announcements', () => {
|
|
98
|
-
let picker: CurrencyPicker
|
|
99
|
-
|
|
100
|
-
beforeEach(async () => {
|
|
101
|
-
picker = await errorStateFixture()
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('should have error alerts with proper ARIA', async () => {
|
|
105
|
-
// Set a value first, then clear to trigger validation
|
|
106
|
-
picker.selected = ['USD']
|
|
107
|
-
await picker.updateComplete
|
|
108
|
-
|
|
109
|
-
// Now set to empty to trigger validation error
|
|
110
|
-
picker.selected = []
|
|
111
|
-
await picker.updateComplete
|
|
112
|
-
|
|
113
|
-
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
114
|
-
assert.equal(errorElement?.getAttribute('role'), 'alert')
|
|
115
|
-
assert.equal(errorElement?.getAttribute('aria-live'), 'polite')
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('should announce errors to screen readers', async () => {
|
|
119
|
-
picker.showErrors = true
|
|
120
|
-
|
|
121
|
-
// Set a value first, then clear to trigger validation
|
|
122
|
-
picker.selected = ['USD']
|
|
123
|
-
await picker.updateComplete
|
|
124
|
-
|
|
125
|
-
// Now set to empty to trigger validation error
|
|
126
|
-
picker.selected = []
|
|
127
|
-
await picker.updateComplete
|
|
128
|
-
|
|
129
|
-
const errorMessage = picker.shadowRoot?.querySelector('.error-message')
|
|
130
|
-
assert.exists(errorMessage)
|
|
131
|
-
assert.exists(errorMessage?.textContent)
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
describe('Keyboard Navigation', () => {
|
|
136
|
-
let picker: CurrencyPicker
|
|
137
|
-
|
|
138
|
-
beforeEach(async () => {
|
|
139
|
-
picker = await basicFixture()
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
it('should be focusable', async () => {
|
|
143
|
-
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
144
|
-
select.focus()
|
|
145
|
-
|
|
146
|
-
// Check if the picker or its select element has focus
|
|
147
|
-
const activeElement = picker.shadowRoot?.activeElement || document.activeElement
|
|
148
|
-
assert.isTrue(activeElement === select || activeElement === picker)
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
it('should support keyboard selection', async () => {
|
|
152
|
-
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
153
|
-
select.focus()
|
|
154
|
-
|
|
155
|
-
// Simulate opening dropdown and selecting
|
|
156
|
-
await sendKeys({
|
|
157
|
-
press: 'Space',
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
await sendKeys({
|
|
161
|
-
press: 'ArrowDown',
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
await sendKeys({
|
|
165
|
-
press: 'Enter',
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
// Should have some interaction (exact behavior depends on ui-select)
|
|
169
|
-
assert.exists(select)
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
it('should support chip removal via keyboard in multi-select', async () => {
|
|
173
|
-
picker.multi = true
|
|
174
|
-
picker.selected = ['USD', 'EUR']
|
|
175
|
-
await picker.updateComplete
|
|
176
|
-
|
|
177
|
-
const chips = picker.shadowRoot?.querySelectorAll('ui-chip') as NodeListOf<HTMLElement>
|
|
178
|
-
assert.isAtLeast(chips.length, 1)
|
|
179
|
-
|
|
180
|
-
// Focus first chip and simulate removal
|
|
181
|
-
chips[0].focus()
|
|
182
|
-
await sendKeys({
|
|
183
|
-
press: 'Delete',
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
// The chip should be focusable and support keyboard interaction
|
|
187
|
-
assert.exists(chips[0])
|
|
188
|
-
})
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
describe('Focus Management', () => {
|
|
192
|
-
let picker: CurrencyPicker
|
|
193
|
-
|
|
194
|
-
beforeEach(async () => {
|
|
195
|
-
picker = await basicFixture()
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
it('should have visible focus indicators', async () => {
|
|
199
|
-
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
200
|
-
select.focus()
|
|
201
|
-
|
|
202
|
-
// Check that focus styles are applied (this may require checking computed styles)
|
|
203
|
-
assert.exists(select)
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
it('should maintain focus appropriately after interactions', async () => {
|
|
207
|
-
picker.multi = true
|
|
208
|
-
picker.selected = ['USD']
|
|
209
|
-
await picker.updateComplete
|
|
210
|
-
|
|
211
|
-
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
212
|
-
select.focus()
|
|
213
|
-
|
|
214
|
-
// Simulate adding another currency
|
|
215
|
-
picker.selected = ['USD', 'EUR']
|
|
216
|
-
await picker.updateComplete
|
|
217
|
-
|
|
218
|
-
// Focus should still be manageable
|
|
219
|
-
assert.exists(select)
|
|
220
|
-
})
|
|
221
|
-
})
|
|
222
|
-
|
|
223
|
-
describe('Color Contrast and Visual Accessibility', () => {
|
|
224
|
-
let picker: CurrencyPicker
|
|
225
|
-
|
|
226
|
-
beforeEach(async () => {
|
|
227
|
-
picker = await basicFixture()
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
it('should render with proper contrast for text', async () => {
|
|
231
|
-
// This test would ideally check computed styles for contrast ratios
|
|
232
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
233
|
-
assert.exists(select)
|
|
234
|
-
|
|
235
|
-
// Basic check that text content is rendered
|
|
236
|
-
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
237
|
-
assert.isAtLeast(options?.length || 0, 1)
|
|
238
|
-
})
|
|
239
|
-
|
|
240
|
-
it('should have distinguishable error states', async () => {
|
|
241
|
-
picker.required = true
|
|
242
|
-
picker.showErrors = true
|
|
243
|
-
picker.clearSelection()
|
|
244
|
-
await picker.updateComplete
|
|
245
|
-
|
|
246
|
-
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
247
|
-
const selectElement = picker.shadowRoot?.querySelector('ui-select')
|
|
248
|
-
const isInvalid = !picker.validity.valid
|
|
249
|
-
const hasAriaInvalid = selectElement?.getAttribute('aria-invalid') === 'true'
|
|
250
|
-
|
|
251
|
-
assert.exists(errorElement, 'Error element should be present for visual accessibility')
|
|
252
|
-
assert.isTrue(isInvalid, 'Component should be in invalid state')
|
|
253
|
-
assert.isTrue(hasAriaInvalid, 'Select should have aria-invalid=true for screen readers')
|
|
254
|
-
})
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
describe('Screen Reader Support', () => {
|
|
258
|
-
let picker: CurrencyPicker
|
|
259
|
-
|
|
260
|
-
beforeEach(async () => {
|
|
261
|
-
picker = await basicFixture()
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
it('should have proper semantic structure', async () => {
|
|
265
|
-
// Check that component has accessible structure
|
|
266
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
267
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
268
|
-
|
|
269
|
-
assert.exists(container)
|
|
270
|
-
assert.equal(container?.getAttribute('role'), 'group')
|
|
271
|
-
assert.exists(container?.getAttribute('aria-label'))
|
|
272
|
-
assert.exists(select)
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
it('should announce state changes', async () => {
|
|
276
|
-
picker.selected = ['USD']
|
|
277
|
-
await picker.updateComplete
|
|
278
|
-
|
|
279
|
-
// Check that ARIA live regions and labels are updated
|
|
280
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
281
|
-
const ariaLabel = container?.getAttribute('aria-label')
|
|
282
|
-
|
|
283
|
-
assert.include(ariaLabel || '', 'selected')
|
|
284
|
-
})
|
|
285
|
-
})
|
|
286
|
-
|
|
287
|
-
describe('WCAG Compliance', () => {
|
|
288
|
-
let picker: CurrencyPicker
|
|
289
|
-
|
|
290
|
-
beforeEach(async () => {
|
|
291
|
-
picker = await basicFixture()
|
|
292
|
-
})
|
|
293
|
-
|
|
294
|
-
it('should have sufficient touch targets', async () => {
|
|
295
|
-
// Check that interactive elements are large enough for touch
|
|
296
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
297
|
-
assert.exists(select)
|
|
298
|
-
|
|
299
|
-
// Material Design select should have proper touch targets
|
|
300
|
-
// This would ideally check computed dimensions
|
|
301
|
-
})
|
|
302
|
-
|
|
303
|
-
it('should work without JavaScript enhancements', async () => {
|
|
304
|
-
// Basic HTML structure should be accessible
|
|
305
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
306
|
-
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
307
|
-
|
|
308
|
-
assert.exists(select)
|
|
309
|
-
assert.isAtLeast(options?.length || 0, 1)
|
|
310
|
-
})
|
|
311
|
-
|
|
312
|
-
it('should support high contrast mode', async () => {
|
|
313
|
-
// This would check forced-colors media query support
|
|
314
|
-
// For now, verify basic structure exists
|
|
315
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
316
|
-
assert.exists(container)
|
|
317
|
-
})
|
|
318
|
-
|
|
319
|
-
it('should respect reduced motion preferences', async () => {
|
|
320
|
-
// This would check prefers-reduced-motion media query
|
|
321
|
-
// For now, verify component doesn't rely on motion for function
|
|
322
|
-
picker.selected = ['USD']
|
|
323
|
-
await picker.updateComplete
|
|
324
|
-
|
|
325
|
-
assert.deepEqual(picker.selected, ['USD'])
|
|
326
|
-
})
|
|
327
|
-
})
|
|
328
|
-
})
|
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
import { fixture, assert, html } from '@open-wc/testing'
|
|
2
|
-
import CurrencyPicker from '../../../src/elements/currency/internals/Picker.js'
|
|
3
|
-
import '../../../src/elements/currency/currency-picker.js'
|
|
4
|
-
|
|
5
|
-
describe('CurrencyPicker - Core Tests', () => {
|
|
6
|
-
async function basicFixture(): Promise<CurrencyPicker> {
|
|
7
|
-
return fixture(html`<currency-picker></currency-picker>`)
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async function multiSelectFixture(): Promise<CurrencyPicker> {
|
|
11
|
-
return fixture(html`<currency-picker multi></currency-picker>`)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
async function allowedCurrenciesFixture(): Promise<CurrencyPicker> {
|
|
15
|
-
return fixture(html`<currency-picker .allowedCurrencies="${['USD', 'EUR', 'GBP']}"></currency-picker>`)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async function requiredFixture(): Promise<CurrencyPicker> {
|
|
19
|
-
return fixture(html`<currency-picker required></currency-picker>`)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
describe('Basic Functionality', () => {
|
|
23
|
-
let picker: CurrencyPicker
|
|
24
|
-
|
|
25
|
-
beforeEach(async () => {
|
|
26
|
-
picker = await basicFixture()
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('should create element', () => {
|
|
30
|
-
assert.instanceOf(picker, CurrencyPicker)
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('should have default properties', () => {
|
|
34
|
-
assert.deepEqual(picker.selected, [])
|
|
35
|
-
assert.deepEqual(picker.allowedCurrencies, [])
|
|
36
|
-
assert.equal(picker.label, 'Add Currency')
|
|
37
|
-
assert.isFalse(picker.multi)
|
|
38
|
-
assert.isFalse(picker.required)
|
|
39
|
-
assert.isFalse(picker.disabled)
|
|
40
|
-
assert.isTrue(picker.showErrors)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('should render currency selector', () => {
|
|
44
|
-
const selector = picker.shadowRoot?.querySelector('ui-select')
|
|
45
|
-
assert.exists(selector)
|
|
46
|
-
assert.equal(selector?.getAttribute('label'), 'Add Currency')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('should populate currency options', async () => {
|
|
50
|
-
await picker.updateComplete
|
|
51
|
-
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
52
|
-
assert.exists(options)
|
|
53
|
-
assert.isAtLeast(options?.length || 0, 25) // Should have popular currencies
|
|
54
|
-
})
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
describe('Currency Selection', () => {
|
|
58
|
-
let picker: CurrencyPicker
|
|
59
|
-
|
|
60
|
-
beforeEach(async () => {
|
|
61
|
-
picker = await basicFixture()
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('should select a currency', async () => {
|
|
65
|
-
picker.selected = ['USD']
|
|
66
|
-
await picker.updateComplete
|
|
67
|
-
assert.deepEqual(picker.selected, ['USD'])
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('should get selected currencies', async () => {
|
|
71
|
-
// Test single-select mode (default)
|
|
72
|
-
picker.selected = ['USD', 'EUR']
|
|
73
|
-
await picker.updateComplete
|
|
74
|
-
|
|
75
|
-
const currencies = picker.getSelectedCurrencies()
|
|
76
|
-
assert.equal(currencies.length, 1, 'Should only allow one selection in single-select mode')
|
|
77
|
-
assert.equal(currencies[0].code, 'USD')
|
|
78
|
-
|
|
79
|
-
// Test multi-select mode
|
|
80
|
-
picker.multi = true
|
|
81
|
-
picker.selected = ['USD', 'EUR']
|
|
82
|
-
await picker.updateComplete
|
|
83
|
-
|
|
84
|
-
const currenciesMulti = picker.getSelectedCurrencies()
|
|
85
|
-
assert.equal(currenciesMulti.length, 2)
|
|
86
|
-
assert.equal(currenciesMulti[0].code, 'USD')
|
|
87
|
-
assert.equal(currenciesMulti[1].code, 'EUR')
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('should clear selection', async () => {
|
|
91
|
-
picker.selected = ['USD', 'EUR']
|
|
92
|
-
await picker.updateComplete
|
|
93
|
-
|
|
94
|
-
picker.clearSelection()
|
|
95
|
-
await picker.updateComplete
|
|
96
|
-
|
|
97
|
-
assert.deepEqual(picker.selected, [])
|
|
98
|
-
})
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
describe('Multi-select Mode', () => {
|
|
102
|
-
let picker: CurrencyPicker
|
|
103
|
-
|
|
104
|
-
beforeEach(async () => {
|
|
105
|
-
picker = await multiSelectFixture()
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it('should allow multiple selections', async () => {
|
|
109
|
-
picker.selected = ['USD', 'EUR', 'GBP']
|
|
110
|
-
await picker.updateComplete
|
|
111
|
-
|
|
112
|
-
assert.equal(picker.selected.length, 3)
|
|
113
|
-
assert.include(picker.selected, 'USD')
|
|
114
|
-
assert.include(picker.selected, 'EUR')
|
|
115
|
-
assert.include(picker.selected, 'GBP')
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('should render chips for selected currencies', async () => {
|
|
119
|
-
picker.selected = ['USD', 'EUR']
|
|
120
|
-
await picker.updateComplete
|
|
121
|
-
|
|
122
|
-
const chipSet = picker.shadowRoot?.querySelector('ui-chip-set')
|
|
123
|
-
const chips = picker.shadowRoot?.querySelectorAll('ui-chip')
|
|
124
|
-
|
|
125
|
-
assert.exists(chipSet)
|
|
126
|
-
assert.equal(chips?.length, 2)
|
|
127
|
-
})
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
describe('Allowed Currencies', () => {
|
|
131
|
-
let picker: CurrencyPicker
|
|
132
|
-
|
|
133
|
-
beforeEach(async () => {
|
|
134
|
-
picker = await allowedCurrenciesFixture()
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it('should filter options based on allowed currencies', async () => {
|
|
138
|
-
await picker.updateComplete
|
|
139
|
-
|
|
140
|
-
const options = picker.shadowRoot?.querySelectorAll('ui-option[value]')
|
|
141
|
-
const optionValues = Array.from(options || [])
|
|
142
|
-
.map((option) => option.getAttribute('value'))
|
|
143
|
-
.filter(Boolean)
|
|
144
|
-
|
|
145
|
-
// Should only have USD, EUR, GBP (plus empty option)
|
|
146
|
-
assert.isAtMost(optionValues.length, 3)
|
|
147
|
-
assert.include(optionValues, 'USD')
|
|
148
|
-
assert.include(optionValues, 'EUR')
|
|
149
|
-
assert.include(optionValues, 'GBP')
|
|
150
|
-
})
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
describe('Validation and Error Handling', () => {
|
|
154
|
-
let picker: CurrencyPicker
|
|
155
|
-
|
|
156
|
-
beforeEach(async () => {
|
|
157
|
-
picker = await requiredFixture()
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('should show error state in UI when showErrors is true', async () => {
|
|
161
|
-
picker.showErrors = true
|
|
162
|
-
|
|
163
|
-
// First set a value, then clear it to trigger validation
|
|
164
|
-
picker.selected = ['USD']
|
|
165
|
-
await picker.updateComplete
|
|
166
|
-
|
|
167
|
-
picker.selected = [] // This should trigger required validation error
|
|
168
|
-
await picker.updateComplete
|
|
169
|
-
|
|
170
|
-
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
171
|
-
const selectElement = picker.shadowRoot?.querySelector('ui-select')
|
|
172
|
-
const isInvalid = !picker.validity.valid
|
|
173
|
-
const hasAriaInvalid = selectElement?.getAttribute('aria-invalid') === 'true'
|
|
174
|
-
|
|
175
|
-
assert.exists(errorElement, 'Error element should be displayed')
|
|
176
|
-
assert.isTrue(isInvalid, 'Component should be in invalid state')
|
|
177
|
-
assert.isTrue(hasAriaInvalid, 'Select element should have aria-invalid=true')
|
|
178
|
-
assert.isTrue(picker.matches(':invalid'), 'Has the :invalid pseudo-class')
|
|
179
|
-
})
|
|
180
|
-
|
|
181
|
-
it('should not show error UI when showErrors is false', async () => {
|
|
182
|
-
picker.showErrors = false
|
|
183
|
-
picker.selected = [] // Directly set to empty to trigger required validation error
|
|
184
|
-
await picker.updateComplete
|
|
185
|
-
|
|
186
|
-
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
187
|
-
assert.isNull(errorElement)
|
|
188
|
-
})
|
|
189
|
-
|
|
190
|
-
it('should validate invalid currency codes', async () => {
|
|
191
|
-
picker.selected = ['INVALID_CODE']
|
|
192
|
-
await picker.updateComplete
|
|
193
|
-
|
|
194
|
-
// Should filter out invalid codes
|
|
195
|
-
assert.notInclude(picker.selected, 'INVALID_CODE')
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
it('should prevent multiple selections in single-select mode', async () => {
|
|
199
|
-
picker.multi = false
|
|
200
|
-
picker.selected = ['USD', 'EUR'] // Multiple selections in single-select mode
|
|
201
|
-
await picker.updateComplete
|
|
202
|
-
|
|
203
|
-
// Should only keep one selection when multi=false
|
|
204
|
-
assert.equal(picker.selected.length, 1)
|
|
205
|
-
assert.equal(picker.selected[0], 'USD') // Should keep the first one
|
|
206
|
-
})
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
describe('Form Integration', () => {
|
|
210
|
-
it('should be form-associated', () => {
|
|
211
|
-
assert.isTrue(CurrencyPicker.formAssociated)
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
it('should handle form state restoration', async () => {
|
|
215
|
-
// Test single-select mode (default)
|
|
216
|
-
const pickerSingle = await basicFixture()
|
|
217
|
-
pickerSingle.formStateRestoreCallback('USD,EUR')
|
|
218
|
-
await pickerSingle.updateComplete
|
|
219
|
-
|
|
220
|
-
assert.deepEqual(pickerSingle.selected, ['USD'], 'Single-select should only restore first value')
|
|
221
|
-
|
|
222
|
-
// Test multi-select mode
|
|
223
|
-
const pickerMulti = await multiSelectFixture()
|
|
224
|
-
pickerMulti.formStateRestoreCallback('USD,EUR')
|
|
225
|
-
await pickerMulti.updateComplete
|
|
226
|
-
|
|
227
|
-
assert.deepEqual(pickerMulti.selected, ['USD', 'EUR'], 'Multi-select should restore all values')
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
it('should handle form reset', async () => {
|
|
231
|
-
const picker = await basicFixture()
|
|
232
|
-
picker.selected = ['USD', 'EUR']
|
|
233
|
-
await picker.updateComplete
|
|
234
|
-
|
|
235
|
-
picker.formResetCallback()
|
|
236
|
-
await picker.updateComplete
|
|
237
|
-
|
|
238
|
-
assert.deepEqual(picker.selected, [])
|
|
239
|
-
})
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
describe('Accessibility', () => {
|
|
243
|
-
let picker: CurrencyPicker
|
|
244
|
-
|
|
245
|
-
beforeEach(async () => {
|
|
246
|
-
picker = await basicFixture()
|
|
247
|
-
})
|
|
248
|
-
|
|
249
|
-
it('should have proper ARIA attributes', async () => {
|
|
250
|
-
await picker.updateComplete
|
|
251
|
-
|
|
252
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
253
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
254
|
-
|
|
255
|
-
assert.equal(container?.getAttribute('role'), 'group')
|
|
256
|
-
assert.exists(container?.getAttribute('aria-label'))
|
|
257
|
-
assert.exists(select?.getAttribute('aria-invalid'))
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
it('should update ARIA label based on selection', async () => {
|
|
261
|
-
picker.selected = ['USD']
|
|
262
|
-
await picker.updateComplete
|
|
263
|
-
|
|
264
|
-
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
265
|
-
const ariaLabel = container?.getAttribute('aria-label')
|
|
266
|
-
|
|
267
|
-
assert.include(ariaLabel || '', 'USD selected')
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
it('should have error announcements', async () => {
|
|
271
|
-
picker.showErrors = true
|
|
272
|
-
picker.required = true
|
|
273
|
-
picker.clearSelection()
|
|
274
|
-
await picker.updateComplete
|
|
275
|
-
|
|
276
|
-
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
277
|
-
assert.equal(errorElement?.getAttribute('role'), 'alert')
|
|
278
|
-
assert.equal(errorElement?.getAttribute('aria-live'), 'polite')
|
|
279
|
-
})
|
|
280
|
-
})
|
|
281
|
-
|
|
282
|
-
describe('Edge Cases', () => {
|
|
283
|
-
let picker: CurrencyPicker
|
|
284
|
-
|
|
285
|
-
beforeEach(async () => {
|
|
286
|
-
picker = await basicFixture()
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
it('should handle empty arrays gracefully', async () => {
|
|
290
|
-
picker.selected = []
|
|
291
|
-
picker.allowedCurrencies = []
|
|
292
|
-
await picker.updateComplete
|
|
293
|
-
|
|
294
|
-
assert.deepEqual(picker.selected, [])
|
|
295
|
-
assert.deepEqual(picker.getSelectedCurrencies(), [])
|
|
296
|
-
})
|
|
297
|
-
|
|
298
|
-
it('should handle disabled state', async () => {
|
|
299
|
-
picker.disabled = true
|
|
300
|
-
await picker.updateComplete
|
|
301
|
-
|
|
302
|
-
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
303
|
-
assert.isTrue(select?.hasAttribute('disabled'))
|
|
304
|
-
})
|
|
305
|
-
|
|
306
|
-
it('should handle disconnection/reconnection', async () => {
|
|
307
|
-
picker.selected = ['USD']
|
|
308
|
-
await picker.updateComplete
|
|
309
|
-
|
|
310
|
-
// Disconnect and reconnect
|
|
311
|
-
picker.remove()
|
|
312
|
-
document.body.appendChild(picker)
|
|
313
|
-
await picker.updateComplete
|
|
314
|
-
|
|
315
|
-
assert.deepEqual(picker.selected, ['USD'])
|
|
316
|
-
})
|
|
317
|
-
})
|
|
318
|
-
})
|