@api-client/ui 0.5.39 → 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/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- 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 -217
- 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,658 +0,0 @@
|
|
|
1
|
-
import { assert, fixture, nextFrame, html, oneEvent } from '@open-wc/testing'
|
|
2
|
-
import sinon from 'sinon'
|
|
3
|
-
import { loadMonaco } from '../MonacoSetup.js'
|
|
4
|
-
import BodyMultipartEditorElement, { hasFormDataSupport } from '../../../src/elements/http/BodyMultipartEditor.js'
|
|
5
|
-
import SwitchElement from '../../../src/md/switch/internals/SwitchElement.js'
|
|
6
|
-
import type UiButton from '../../../src/md/button/internals/button.js'
|
|
7
|
-
import '../../../src/define/http/http-body-multipart-editor.js'
|
|
8
|
-
|
|
9
|
-
describe('elements', () => {
|
|
10
|
-
describe('http', () => {
|
|
11
|
-
;(hasFormDataSupport ? describe : describe.skip)('BodyMultipartEditor', () => {
|
|
12
|
-
async function basicFixture(): Promise<BodyMultipartEditorElement> {
|
|
13
|
-
return fixture(html`<http-body-multipart-editor allowFormInfo></http-body-multipart-editor>`)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
before(async () => loadMonaco())
|
|
17
|
-
|
|
18
|
-
async function valueFixture(): Promise<BodyMultipartEditorElement> {
|
|
19
|
-
const element = await basicFixture()
|
|
20
|
-
const form = new FormData()
|
|
21
|
-
form.append('text', 'text-value')
|
|
22
|
-
form.append('blob', new Blob(['blob-value'], { type: 'text/plain' }), 'blob')
|
|
23
|
-
const file = new File(['blob-value'], 'file.txt', { type: 'text/plain' })
|
|
24
|
-
form.append('file', file, 'file.txt')
|
|
25
|
-
element.value = form
|
|
26
|
-
await oneEvent(element, 'modelupdate')
|
|
27
|
-
return element
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('Empty state', () => {
|
|
31
|
-
let element: BodyMultipartEditorElement
|
|
32
|
-
beforeEach(async () => {
|
|
33
|
-
element = await basicFixture()
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('renders the empty message', () => {
|
|
37
|
-
const node = element.shadowRoot!.querySelector('.empty-message')
|
|
38
|
-
assert.ok(node)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('renders the form mime information', () => {
|
|
42
|
-
const node = element.shadowRoot!.querySelector('.form-info')
|
|
43
|
-
assert.ok(node)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('has empty model', () => {
|
|
47
|
-
assert.deepEqual(element.model, [])
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
describe('adding a text part', () => {
|
|
52
|
-
let element: BodyMultipartEditorElement
|
|
53
|
-
beforeEach(async () => {
|
|
54
|
-
element = await basicFixture()
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('adds a model item', () => {
|
|
58
|
-
element.addEmptyText()
|
|
59
|
-
assert.lengthOf(element.model, 1)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('does not add a model when readonly', () => {
|
|
63
|
-
element.readOnly = true
|
|
64
|
-
element.addEmptyText()
|
|
65
|
-
assert.lengthOf(element.model, 0)
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('does not add a model when disabled', () => {
|
|
69
|
-
element.disabled = true
|
|
70
|
-
element.addEmptyText()
|
|
71
|
-
assert.lengthOf(element.model, 0)
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('model item has basic schema', () => {
|
|
75
|
-
element.addEmptyText()
|
|
76
|
-
assert.deepEqual(element.model[0], {
|
|
77
|
-
name: '',
|
|
78
|
-
enabled: true,
|
|
79
|
-
value: {
|
|
80
|
-
data: '',
|
|
81
|
-
type: 'string',
|
|
82
|
-
},
|
|
83
|
-
})
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
it('adds an item with undefined model', () => {
|
|
87
|
-
element.model = undefined
|
|
88
|
-
element.addEmptyText()
|
|
89
|
-
assert.lengthOf(element.model, 1)
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('does not notify model change', async () => {
|
|
93
|
-
// there's no point of storing the model without empty values. They are not generating
|
|
94
|
-
// any editor value
|
|
95
|
-
const spy = sinon.spy()
|
|
96
|
-
element.addEventListener('change', spy)
|
|
97
|
-
element.addEmptyText()
|
|
98
|
-
assert.isFalse(spy.called)
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
describe('adding a file part', () => {
|
|
103
|
-
let element: BodyMultipartEditorElement
|
|
104
|
-
beforeEach(async () => {
|
|
105
|
-
element = await basicFixture()
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it('adds a model item on add button click', () => {
|
|
109
|
-
element.addEmptyFile()
|
|
110
|
-
assert.lengthOf(element.model, 1)
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('does not add a model when readonly', () => {
|
|
114
|
-
element.readOnly = true
|
|
115
|
-
element.addEmptyFile()
|
|
116
|
-
assert.lengthOf(element.model, 0)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('does not add a model when disabled', () => {
|
|
120
|
-
element.disabled = true
|
|
121
|
-
element.addEmptyFile()
|
|
122
|
-
assert.lengthOf(element.model, 0)
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
it('model item has basic schema', () => {
|
|
126
|
-
element.addEmptyFile()
|
|
127
|
-
assert.deepEqual(element.model[0], {
|
|
128
|
-
name: '',
|
|
129
|
-
enabled: true,
|
|
130
|
-
value: {
|
|
131
|
-
data: [],
|
|
132
|
-
type: 'file',
|
|
133
|
-
},
|
|
134
|
-
})
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it('adds an item with undefined model', () => {
|
|
138
|
-
element.model = undefined
|
|
139
|
-
element.addEmptyFile()
|
|
140
|
-
assert.lengthOf(element.model, 1)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
it('does not notify model change', async () => {
|
|
144
|
-
// there's no point of storing the model without empty values. They are not generating
|
|
145
|
-
// any editor value
|
|
146
|
-
const spy = sinon.spy()
|
|
147
|
-
element.addEventListener('change', spy)
|
|
148
|
-
element.addEmptyFile()
|
|
149
|
-
assert.isFalse(spy.called)
|
|
150
|
-
})
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
describe('#value', () => {
|
|
154
|
-
let element: BodyMultipartEditorElement
|
|
155
|
-
let form: FormData
|
|
156
|
-
beforeEach(async () => {
|
|
157
|
-
element = await basicFixture()
|
|
158
|
-
form = new FormData()
|
|
159
|
-
form.append('text', 'text-value')
|
|
160
|
-
form.append('blob', new Blob(['*****'], { type: 'text/plain' }), 'blob')
|
|
161
|
-
const file = new File(['***'], 'file.txt', { type: 'text/plain' })
|
|
162
|
-
form.append('file', file, 'file.txt')
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
// maybe it should return the same value when the model never changed?
|
|
166
|
-
// it('reads set value', () => {
|
|
167
|
-
// element.value = form;
|
|
168
|
-
// assert.isTrue(element.value === form);
|
|
169
|
-
// });
|
|
170
|
-
|
|
171
|
-
it('clears the current model when value is not set', async () => {
|
|
172
|
-
element.model = [{ name: 'a', value: 'b', enabled: true }]
|
|
173
|
-
// @ts-expect-error for testing
|
|
174
|
-
element.value = undefined
|
|
175
|
-
await oneEvent(element, 'modelupdate')
|
|
176
|
-
assert.deepEqual(element.model, [])
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
it('generates the view model', async () => {
|
|
180
|
-
element.value = form
|
|
181
|
-
await oneEvent(element, 'modelupdate')
|
|
182
|
-
assert.lengthOf(element.model, 3)
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('generated model has restored text part property', async () => {
|
|
186
|
-
element.value = form
|
|
187
|
-
await oneEvent(element, 'modelupdate')
|
|
188
|
-
const [item] = element.model
|
|
189
|
-
|
|
190
|
-
assert.deepEqual(item, {
|
|
191
|
-
enabled: true,
|
|
192
|
-
name: 'text',
|
|
193
|
-
value: {
|
|
194
|
-
data: 'text-value',
|
|
195
|
-
type: 'string',
|
|
196
|
-
},
|
|
197
|
-
})
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
it('generated model has restored text blob part property', async () => {
|
|
201
|
-
element.value = form
|
|
202
|
-
await oneEvent(element, 'modelupdate')
|
|
203
|
-
const item = element.model[1]
|
|
204
|
-
assert.deepEqual(item, {
|
|
205
|
-
enabled: true,
|
|
206
|
-
name: 'blob',
|
|
207
|
-
value: {
|
|
208
|
-
data: [42, 42, 42, 42, 42],
|
|
209
|
-
type: 'blob',
|
|
210
|
-
meta: { mime: 'text/plain' },
|
|
211
|
-
},
|
|
212
|
-
})
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
it('generated model has restored file part property', async () => {
|
|
216
|
-
element.value = form
|
|
217
|
-
await oneEvent(element, 'modelupdate')
|
|
218
|
-
const item = element.model[2]
|
|
219
|
-
assert.deepEqual(item, {
|
|
220
|
-
enabled: true,
|
|
221
|
-
name: 'file',
|
|
222
|
-
value: {
|
|
223
|
-
data: [42, 42, 42],
|
|
224
|
-
type: 'file',
|
|
225
|
-
meta: { mime: 'text/plain', name: 'file.txt' },
|
|
226
|
-
},
|
|
227
|
-
})
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
it('updates an existing model', async () => {
|
|
231
|
-
element.model = [{ name: 'test', value: 'true', enabled: true }]
|
|
232
|
-
element.value = form
|
|
233
|
-
await oneEvent(element, 'modelupdate')
|
|
234
|
-
assert.equal(element.model[0].name, 'text')
|
|
235
|
-
})
|
|
236
|
-
|
|
237
|
-
it('does not notify model change', async () => {
|
|
238
|
-
// value/model setters should not dispatch change events
|
|
239
|
-
const spy = sinon.spy()
|
|
240
|
-
element.addEventListener('change', spy)
|
|
241
|
-
element.value = form
|
|
242
|
-
await oneEvent(element, 'modelupdate')
|
|
243
|
-
assert.isFalse(spy.called)
|
|
244
|
-
})
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
describe('#model', () => {
|
|
248
|
-
let element: BodyMultipartEditorElement
|
|
249
|
-
beforeEach(async () => {
|
|
250
|
-
element = await basicFixture()
|
|
251
|
-
})
|
|
252
|
-
|
|
253
|
-
it('reads set value', () => {
|
|
254
|
-
const value = [{ name: 'test', value: 'true', enabled: true }]
|
|
255
|
-
element.model = value
|
|
256
|
-
assert.deepEqual(element.model, value)
|
|
257
|
-
})
|
|
258
|
-
|
|
259
|
-
it('sets an empty array when no value', () => {
|
|
260
|
-
element.model = [{ name: 'test', value: 'true', enabled: true }]
|
|
261
|
-
element.model = undefined
|
|
262
|
-
assert.deepEqual(element.model, [])
|
|
263
|
-
})
|
|
264
|
-
|
|
265
|
-
// from here all tests are related to the model processing which is
|
|
266
|
-
// an async operation so the tests focus on the function call.
|
|
267
|
-
|
|
268
|
-
it('generates a value', async () => {
|
|
269
|
-
const value = [{ name: 'test', value: 'true', enabled: true }]
|
|
270
|
-
element.model = value
|
|
271
|
-
assert.typeOf(element.value, 'FormData')
|
|
272
|
-
const result = element.value.get('test')
|
|
273
|
-
assert.equal(result, 'true')
|
|
274
|
-
})
|
|
275
|
-
|
|
276
|
-
it('clears the previously set value', async () => {
|
|
277
|
-
const form = new FormData()
|
|
278
|
-
form.append('a', 'b')
|
|
279
|
-
element.value = form
|
|
280
|
-
await oneEvent(element, 'modelupdate')
|
|
281
|
-
element.model = undefined
|
|
282
|
-
const it = element.value.entries().next()
|
|
283
|
-
assert.isTrue(it.done)
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
it('updates existing value', async () => {
|
|
287
|
-
element.value = new FormData()
|
|
288
|
-
element.model = [{ name: 'test', value: 'true', enabled: true }]
|
|
289
|
-
const it = element.value.entries().next()
|
|
290
|
-
assert.isFalse(it.done)
|
|
291
|
-
})
|
|
292
|
-
|
|
293
|
-
it('does not notify model change', async () => {
|
|
294
|
-
// value/model setters should not dispatch change events
|
|
295
|
-
const spy = sinon.spy()
|
|
296
|
-
element.addEventListener('change', spy)
|
|
297
|
-
element.model = [{ name: 'test', value: 'true', enabled: true }]
|
|
298
|
-
assert.isFalse(spy.called)
|
|
299
|
-
})
|
|
300
|
-
})
|
|
301
|
-
|
|
302
|
-
describe('values rendering', () => {
|
|
303
|
-
let element: BodyMultipartEditorElement
|
|
304
|
-
beforeEach(async () => {
|
|
305
|
-
element = await valueFixture()
|
|
306
|
-
})
|
|
307
|
-
|
|
308
|
-
it('renders form rows for each model entry', () => {
|
|
309
|
-
const items = element.shadowRoot!.querySelectorAll('.param-row')
|
|
310
|
-
assert.lengthOf(items, 3)
|
|
311
|
-
})
|
|
312
|
-
|
|
313
|
-
it('renders the enable switch', () => {
|
|
314
|
-
const item = element.shadowRoot!.querySelector('.param-row ui-switch')
|
|
315
|
-
assert.ok(item)
|
|
316
|
-
})
|
|
317
|
-
|
|
318
|
-
it('renders the remove button', () => {
|
|
319
|
-
const item = element.shadowRoot!.querySelector('.param-row ui-icon-button')
|
|
320
|
-
assert.ok(item)
|
|
321
|
-
})
|
|
322
|
-
|
|
323
|
-
it('renders name input for all types', () => {
|
|
324
|
-
const items = element.shadowRoot!.querySelectorAll('.param-row .name-input input')
|
|
325
|
-
assert.lengthOf(items, 3)
|
|
326
|
-
})
|
|
327
|
-
|
|
328
|
-
it('renders the value input for the text part', () => {
|
|
329
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(1) .value-input input')
|
|
330
|
-
assert.ok(item)
|
|
331
|
-
})
|
|
332
|
-
|
|
333
|
-
it('renders the type input for the text part', () => {
|
|
334
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(1) .mime-input input')
|
|
335
|
-
assert.ok(item)
|
|
336
|
-
})
|
|
337
|
-
|
|
338
|
-
it('renders the value input for the text with blob part', () => {
|
|
339
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(2) .value-input')
|
|
340
|
-
assert.ok(item)
|
|
341
|
-
})
|
|
342
|
-
|
|
343
|
-
it('renders the type input for the text with blob part', () => {
|
|
344
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(2) .mime-input')
|
|
345
|
-
assert.ok(item)
|
|
346
|
-
})
|
|
347
|
-
|
|
348
|
-
it('renders the choose file button for the file part', () => {
|
|
349
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(3) .file-input .choose-button')
|
|
350
|
-
assert.ok(item)
|
|
351
|
-
})
|
|
352
|
-
|
|
353
|
-
it('renders the native input for the file part', () => {
|
|
354
|
-
const item = element.shadowRoot!.querySelector(
|
|
355
|
-
'.param-row:nth-child(3) .file-input input'
|
|
356
|
-
) as HTMLInputElement
|
|
357
|
-
assert.ok(item, 'has the input')
|
|
358
|
-
assert.equal(item.type, 'file', 'the input is of file type')
|
|
359
|
-
assert.isTrue(item.hasAttribute('hidden'), 'the input is hidden')
|
|
360
|
-
})
|
|
361
|
-
|
|
362
|
-
it('renders the native input for the selected file information', () => {
|
|
363
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(3) .file-input .file-info')
|
|
364
|
-
assert.ok(item)
|
|
365
|
-
})
|
|
366
|
-
})
|
|
367
|
-
|
|
368
|
-
describe('enable/disable action', () => {
|
|
369
|
-
let element: BodyMultipartEditorElement
|
|
370
|
-
beforeEach(async () => {
|
|
371
|
-
element = await valueFixture()
|
|
372
|
-
})
|
|
373
|
-
|
|
374
|
-
it('disables the form item in the model', () => {
|
|
375
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(1) ui-switch') as SwitchElement
|
|
376
|
-
item.click()
|
|
377
|
-
assert.isFalse(element.model[0].enabled)
|
|
378
|
-
})
|
|
379
|
-
|
|
380
|
-
it('updates the value', () => {
|
|
381
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(1) ui-switch') as SwitchElement
|
|
382
|
-
item.click()
|
|
383
|
-
const { name } = element.model[0]
|
|
384
|
-
const { value } = element
|
|
385
|
-
assert.isFalse(value.has(name))
|
|
386
|
-
})
|
|
387
|
-
|
|
388
|
-
it('dispatches the change event', () => {
|
|
389
|
-
const spy = sinon.spy()
|
|
390
|
-
element.addEventListener('change', spy)
|
|
391
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(1) ui-switch') as SwitchElement
|
|
392
|
-
item.click()
|
|
393
|
-
assert.isTrue(spy.called)
|
|
394
|
-
})
|
|
395
|
-
|
|
396
|
-
it('re-enabled the text part', async () => {
|
|
397
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(1) ui-switch') as SwitchElement
|
|
398
|
-
item.click()
|
|
399
|
-
await nextFrame()
|
|
400
|
-
item.click()
|
|
401
|
-
const { name, enabled } = element.model[0]
|
|
402
|
-
assert.isTrue(enabled, 'the item is enabled')
|
|
403
|
-
const { value } = element
|
|
404
|
-
assert.isTrue(value.has(name), 'the part has the value')
|
|
405
|
-
assert.typeOf(value.get(name), 'string', 'the part has the correct type')
|
|
406
|
-
})
|
|
407
|
-
|
|
408
|
-
it('re-enabled a file part', async () => {
|
|
409
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(3) ui-switch') as SwitchElement
|
|
410
|
-
item.click()
|
|
411
|
-
await nextFrame()
|
|
412
|
-
item.click()
|
|
413
|
-
const { name, enabled } = element.model[2]
|
|
414
|
-
assert.isTrue(enabled, 'the item is enabled')
|
|
415
|
-
const { value } = element
|
|
416
|
-
assert.isTrue(value.has(name), 'the part has the value')
|
|
417
|
-
assert.typeOf(value.get(name), 'file', 'the part has the correct type')
|
|
418
|
-
})
|
|
419
|
-
|
|
420
|
-
it('dispatches the change event when re-enabling', async () => {
|
|
421
|
-
const item = element.shadowRoot!.querySelector('.param-row:nth-child(3) ui-switch') as SwitchElement
|
|
422
|
-
const spy = sinon.spy()
|
|
423
|
-
element.addEventListener('change', spy)
|
|
424
|
-
item.click()
|
|
425
|
-
await nextFrame()
|
|
426
|
-
item.click()
|
|
427
|
-
assert.equal(spy.callCount, 2)
|
|
428
|
-
})
|
|
429
|
-
})
|
|
430
|
-
|
|
431
|
-
describe('removing an item', () => {
|
|
432
|
-
let element: BodyMultipartEditorElement
|
|
433
|
-
beforeEach(async () => {
|
|
434
|
-
element = await valueFixture()
|
|
435
|
-
})
|
|
436
|
-
|
|
437
|
-
it('removes an item from the model', () => {
|
|
438
|
-
const item = { ...element.model[0] }
|
|
439
|
-
const button = element.shadowRoot!.querySelector('.param-row .delete-button') as UiButton
|
|
440
|
-
button.click()
|
|
441
|
-
assert.notDeepEqual(element.model[0], item)
|
|
442
|
-
})
|
|
443
|
-
|
|
444
|
-
it('updates the value', () => {
|
|
445
|
-
const item = { ...element.model[0] }
|
|
446
|
-
const button = element.shadowRoot!.querySelector('.param-row .delete-button') as UiButton
|
|
447
|
-
button.click()
|
|
448
|
-
assert.isFalse(element.value.has(item.name))
|
|
449
|
-
})
|
|
450
|
-
|
|
451
|
-
it('dispatches the change event', () => {
|
|
452
|
-
const spy = sinon.spy()
|
|
453
|
-
element.addEventListener('change', spy)
|
|
454
|
-
const button = element.shadowRoot!.querySelector('.param-row .delete-button') as UiButton
|
|
455
|
-
button.click()
|
|
456
|
-
assert.isTrue(spy.calledOnce)
|
|
457
|
-
})
|
|
458
|
-
})
|
|
459
|
-
|
|
460
|
-
describe('part name change', () => {
|
|
461
|
-
let element: BodyMultipartEditorElement
|
|
462
|
-
beforeEach(async () => {
|
|
463
|
-
element = await valueFixture()
|
|
464
|
-
})
|
|
465
|
-
|
|
466
|
-
it('changes the file part name in the model', () => {
|
|
467
|
-
const item = { ...element.model[2] }
|
|
468
|
-
const input = element.shadowRoot!.querySelector(
|
|
469
|
-
'.param-row:nth-child(3) .name-input input'
|
|
470
|
-
) as HTMLInputElement
|
|
471
|
-
input.value = 'new-value-test'
|
|
472
|
-
input.dispatchEvent(new CustomEvent('change'))
|
|
473
|
-
assert.notEqual(element.model[2].name, item.name)
|
|
474
|
-
assert.equal(element.model[2].name, 'new-value-test')
|
|
475
|
-
})
|
|
476
|
-
|
|
477
|
-
it('updates the value for file part', () => {
|
|
478
|
-
const old = element.model[2].name
|
|
479
|
-
const input = element.shadowRoot!.querySelector(
|
|
480
|
-
'.param-row:nth-child(3) .name-input input'
|
|
481
|
-
) as HTMLInputElement
|
|
482
|
-
input.value = 'new-value-test'
|
|
483
|
-
input.dispatchEvent(new CustomEvent('change'))
|
|
484
|
-
assert.isFalse(element.value.has(old), 'old part is removed')
|
|
485
|
-
assert.isTrue(element.value.has(element.model[2].name), 'new part is added')
|
|
486
|
-
})
|
|
487
|
-
|
|
488
|
-
it('changes the text part name in the model', () => {
|
|
489
|
-
const item = { ...element.model[0] }
|
|
490
|
-
const input = element.shadowRoot!.querySelector(
|
|
491
|
-
'.param-row:nth-child(1) .name-input input'
|
|
492
|
-
) as HTMLInputElement
|
|
493
|
-
input.value = 'new-value-test'
|
|
494
|
-
input.dispatchEvent(new CustomEvent('change'))
|
|
495
|
-
assert.notEqual(element.model[0].name, item.name)
|
|
496
|
-
assert.equal(element.model[0].name, 'new-value-test')
|
|
497
|
-
})
|
|
498
|
-
|
|
499
|
-
it('updates the value for text part', () => {
|
|
500
|
-
const old = element.model[0].name
|
|
501
|
-
const input = element.shadowRoot!.querySelector(
|
|
502
|
-
'.param-row:nth-child(1) .name-input input'
|
|
503
|
-
) as HTMLInputElement
|
|
504
|
-
input.value = 'new-value-test'
|
|
505
|
-
input.dispatchEvent(new CustomEvent('change'))
|
|
506
|
-
assert.isFalse(element.value.has(old), 'old part is removed')
|
|
507
|
-
assert.isTrue(element.value.has(element.model[0].name), 'new part is added')
|
|
508
|
-
})
|
|
509
|
-
|
|
510
|
-
it('dispatches the change event', () => {
|
|
511
|
-
const spy = sinon.spy()
|
|
512
|
-
element.addEventListener('change', spy)
|
|
513
|
-
const input = element.shadowRoot!.querySelector(
|
|
514
|
-
'.param-row:nth-child(3) .name-input input'
|
|
515
|
-
) as HTMLInputElement
|
|
516
|
-
input.value = 'new-value-test'
|
|
517
|
-
input.dispatchEvent(new CustomEvent('change'))
|
|
518
|
-
assert.isTrue(spy.calledOnce)
|
|
519
|
-
})
|
|
520
|
-
})
|
|
521
|
-
|
|
522
|
-
describe('file part value change', () => {
|
|
523
|
-
let element: BodyMultipartEditorElement
|
|
524
|
-
beforeEach(async () => {
|
|
525
|
-
element = await valueFixture()
|
|
526
|
-
})
|
|
527
|
-
|
|
528
|
-
it('changes the value in the model', async () => {
|
|
529
|
-
const file = new File(['***'], 'other.txt', { type: 'text/plain' })
|
|
530
|
-
await element.updateFileValue(2, file)
|
|
531
|
-
assert.deepEqual(element.model[2], {
|
|
532
|
-
enabled: true,
|
|
533
|
-
name: 'file',
|
|
534
|
-
value: {
|
|
535
|
-
type: 'file',
|
|
536
|
-
data: [42, 42, 42],
|
|
537
|
-
meta: { mime: 'text/plain', name: 'other.txt' },
|
|
538
|
-
},
|
|
539
|
-
})
|
|
540
|
-
})
|
|
541
|
-
|
|
542
|
-
it('dispatches the change event', async () => {
|
|
543
|
-
const spy = sinon.spy()
|
|
544
|
-
element.addEventListener('change', spy)
|
|
545
|
-
const file = new File(['***'], 'other.txt', { type: 'text/plain' })
|
|
546
|
-
await element.updateFileValue(2, file)
|
|
547
|
-
assert.isTrue(spy.calledOnce)
|
|
548
|
-
})
|
|
549
|
-
})
|
|
550
|
-
|
|
551
|
-
describe('text part value change', () => {
|
|
552
|
-
let element: BodyMultipartEditorElement
|
|
553
|
-
beforeEach(async () => {
|
|
554
|
-
element = await valueFixture()
|
|
555
|
-
})
|
|
556
|
-
|
|
557
|
-
it('changes the value in the model', async () => {
|
|
558
|
-
const input = element.shadowRoot!.querySelector('.value-input input[data-index="0"]') as HTMLInputElement
|
|
559
|
-
input.value = 'other-value'
|
|
560
|
-
input.dispatchEvent(new Event('change'))
|
|
561
|
-
assert.deepEqual(element.model[0].value, { type: 'string', data: 'other-value' }, 'the value is updated')
|
|
562
|
-
})
|
|
563
|
-
|
|
564
|
-
it('dispatches the change event', async () => {
|
|
565
|
-
const spy = sinon.spy()
|
|
566
|
-
element.addEventListener('change', spy)
|
|
567
|
-
const input = element.shadowRoot!.querySelector('.value-input input[data-index="0"]') as HTMLInputElement
|
|
568
|
-
input.value = 'other-value'
|
|
569
|
-
input.dispatchEvent(new Event('change'))
|
|
570
|
-
assert.isTrue(spy.calledOnce)
|
|
571
|
-
})
|
|
572
|
-
})
|
|
573
|
-
|
|
574
|
-
describe('blob part value change', () => {
|
|
575
|
-
let element: BodyMultipartEditorElement
|
|
576
|
-
beforeEach(async () => {
|
|
577
|
-
element = await valueFixture()
|
|
578
|
-
})
|
|
579
|
-
|
|
580
|
-
it('changes the value in the model', async () => {
|
|
581
|
-
const input = element.shadowRoot!.querySelector('.value-input input[data-index="1"]') as HTMLInputElement
|
|
582
|
-
input.value = '* *'
|
|
583
|
-
input.dispatchEvent(new Event('change'))
|
|
584
|
-
await oneEvent(element, 'change')
|
|
585
|
-
|
|
586
|
-
const item = element.model[1]
|
|
587
|
-
|
|
588
|
-
assert.deepEqual(item, {
|
|
589
|
-
name: 'blob',
|
|
590
|
-
value: { type: 'blob', data: [42, 32, 42], meta: { mime: 'text/plain' } },
|
|
591
|
-
enabled: true,
|
|
592
|
-
blobText: '* *',
|
|
593
|
-
})
|
|
594
|
-
})
|
|
595
|
-
|
|
596
|
-
it('dispatches the change event', async () => {
|
|
597
|
-
const spy = sinon.spy()
|
|
598
|
-
element.addEventListener('change', spy)
|
|
599
|
-
const input = element.shadowRoot!.querySelector('.value-input input[data-index="1"]') as HTMLInputElement
|
|
600
|
-
input.value = '* *'
|
|
601
|
-
input.dispatchEvent(new Event('change'))
|
|
602
|
-
await oneEvent(element, 'change')
|
|
603
|
-
assert.isTrue(spy.calledOnce)
|
|
604
|
-
})
|
|
605
|
-
})
|
|
606
|
-
|
|
607
|
-
describe('text part type change', () => {
|
|
608
|
-
let element: BodyMultipartEditorElement
|
|
609
|
-
beforeEach(async () => {
|
|
610
|
-
element = await valueFixture()
|
|
611
|
-
})
|
|
612
|
-
|
|
613
|
-
it('changes the existing blob value', async () => {
|
|
614
|
-
const input = element.shadowRoot!.querySelector('.mime-input input[data-index="1"]') as HTMLInputElement
|
|
615
|
-
input.value = 'text/other'
|
|
616
|
-
input.dispatchEvent(new Event('change'))
|
|
617
|
-
|
|
618
|
-
await oneEvent(element, 'change')
|
|
619
|
-
const item = element.model[1]
|
|
620
|
-
|
|
621
|
-
assert.deepEqual(item, {
|
|
622
|
-
blobText: 'blob-value',
|
|
623
|
-
name: 'blob',
|
|
624
|
-
value: { type: 'blob', data: [98, 108, 111, 98, 45, 118, 97, 108, 117, 101], meta: { mime: 'text/other' } },
|
|
625
|
-
enabled: true,
|
|
626
|
-
})
|
|
627
|
-
})
|
|
628
|
-
|
|
629
|
-
it('changes the existing text value to a blob', async () => {
|
|
630
|
-
const input = element.shadowRoot!.querySelector('.mime-input input[data-index="0"]') as HTMLInputElement
|
|
631
|
-
input.value = 'text/x'
|
|
632
|
-
input.dispatchEvent(new Event('change'))
|
|
633
|
-
|
|
634
|
-
await oneEvent(element, 'change')
|
|
635
|
-
const item = element.model[0]
|
|
636
|
-
|
|
637
|
-
assert.deepEqual(item, {
|
|
638
|
-
blobText: 'text-value',
|
|
639
|
-
name: 'text',
|
|
640
|
-
value: { type: 'blob', data: [116, 101, 120, 116, 45, 118, 97, 108, 117, 101], meta: { mime: 'text/x' } },
|
|
641
|
-
enabled: true,
|
|
642
|
-
})
|
|
643
|
-
})
|
|
644
|
-
|
|
645
|
-
it('dispatches the change event', async () => {
|
|
646
|
-
const spy = sinon.spy()
|
|
647
|
-
element.addEventListener('change', spy)
|
|
648
|
-
|
|
649
|
-
const input = element.shadowRoot!.querySelector('.mime-input input[data-index="0"]') as HTMLInputElement
|
|
650
|
-
input.value = 'text/x'
|
|
651
|
-
input.dispatchEvent(new Event('change'))
|
|
652
|
-
await oneEvent(element, 'change')
|
|
653
|
-
assert.isTrue(spy.called)
|
|
654
|
-
})
|
|
655
|
-
})
|
|
656
|
-
})
|
|
657
|
-
})
|
|
658
|
-
})
|