@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.
Files changed (281) hide show
  1. package/build/tsconfig.tsbuildinfo +1 -0
  2. package/package.json +1 -1
  3. package/.aiexclude +0 -3
  4. package/.cursor/rules/html-and-css-best-practices.mdc +0 -63
  5. package/.cursor/rules/lit-best-practices.mdc +0 -89
  6. package/.editorconfig +0 -29
  7. package/.github/CONTRIBUTING.md +0 -24
  8. package/.github/instructions/html-and-css-best-practices.instructions.md +0 -70
  9. package/.github/instructions/lit-best-practices.instructions.md +0 -90
  10. package/.github/release.yml +0 -14
  11. package/.github/stale.yml +0 -23
  12. package/.github/workflows/auto-release.yml +0 -182
  13. package/.github/workflows/release.yml +0 -82
  14. package/.prettierrc.js +0 -14
  15. package/.vscode/settings.json +0 -18
  16. package/RELEASE.md +0 -163
  17. package/RELEASE_SETUP.md +0 -235
  18. package/build/src/demo/DemoPage.d.ts +0 -81
  19. package/build/src/demo/DemoPage.d.ts.map +0 -1
  20. package/build/src/demo/DemoPage.js +0 -175
  21. package/build/src/demo/DemoPage.js.map +0 -1
  22. package/build/src/demo/DemoStyles.d.ts +0 -3
  23. package/build/src/demo/DemoStyles.d.ts.map +0 -1
  24. package/build/src/demo/DemoStyles.js +0 -60
  25. package/build/src/demo/DemoStyles.js.map +0 -1
  26. package/build/test/elements/navigation/Navigation.test.d.ts +0 -3
  27. package/build/test/elements/navigation/Navigation.test.d.ts.map +0 -1
  28. package/build/test/elements/navigation/Navigation.test.js +0 -113
  29. package/build/test/elements/navigation/Navigation.test.js.map +0 -1
  30. package/commitlint.config.cjs +0 -2
  31. package/demo/elements/authorization/AuthPlugin.js +0 -57
  32. package/demo/elements/authorization/AuthProxy.js +0 -215
  33. package/demo/elements/authorization/api-key.html +0 -27
  34. package/demo/elements/authorization/api-key.ts +0 -44
  35. package/demo/elements/authorization/basic.html +0 -27
  36. package/demo/elements/authorization/basic.ts +0 -43
  37. package/demo/elements/authorization/bearer.html +0 -27
  38. package/demo/elements/authorization/bearer.ts +0 -43
  39. package/demo/elements/authorization/env.js +0 -8
  40. package/demo/elements/authorization/index.html +0 -44
  41. package/demo/elements/authorization/ntlm.html +0 -27
  42. package/demo/elements/authorization/ntlm.ts +0 -43
  43. package/demo/elements/authorization/oauth-authorize.html +0 -75
  44. package/demo/elements/authorization/oauth-authorize.ts +0 -40
  45. package/demo/elements/authorization/oauth-error.html +0 -18
  46. package/demo/elements/authorization/oauth-error.ts +0 -10
  47. package/demo/elements/authorization/oauth-popup.html +0 -36
  48. package/demo/elements/authorization/oauth2.html +0 -27
  49. package/demo/elements/authorization/oauth2.ts +0 -100
  50. package/demo/elements/authorization/oidc.html +0 -27
  51. package/demo/elements/authorization/oidc.ts +0 -139
  52. package/demo/elements/authorization/private.crt +0 -31
  53. package/demo/elements/authorization/private.csr +0 -28
  54. package/demo/elements/authorization/private.key +0 -51
  55. package/demo/elements/authorization/private.pem +0 -31
  56. package/demo/elements/authorization/redirect.html +0 -20
  57. package/demo/elements/authorization/ssl-commands.sh +0 -30
  58. package/demo/elements/authorization/ssl.conf +0 -24
  59. package/demo/elements/autocomplete/index.html +0 -64
  60. package/demo/elements/autocomplete/index.ts +0 -171
  61. package/demo/elements/code-editor/CodeEditorDemo.ts +0 -173
  62. package/demo/elements/code-editor/index.html +0 -19
  63. package/demo/elements/context-menu/DemoIcons.ts +0 -21
  64. package/demo/elements/context-menu/basic.html +0 -25
  65. package/demo/elements/context-menu/basic.ts +0 -119
  66. package/demo/elements/context-menu/custom-data.html +0 -25
  67. package/demo/elements/context-menu/custom-data.ts +0 -62
  68. package/demo/elements/context-menu/demo.css +0 -28
  69. package/demo/elements/context-menu/enabled-state.html +0 -25
  70. package/demo/elements/context-menu/enabled-state.ts +0 -73
  71. package/demo/elements/context-menu/icons.html +0 -25
  72. package/demo/elements/context-menu/icons.ts +0 -64
  73. package/demo/elements/context-menu/index.html +0 -43
  74. package/demo/elements/context-menu/nested.html +0 -25
  75. package/demo/elements/context-menu/nestedt.ts +0 -152
  76. package/demo/elements/context-menu/no-execute.html +0 -25
  77. package/demo/elements/context-menu/no-execute.ts +0 -134
  78. package/demo/elements/context-menu/radio-menu.html +0 -25
  79. package/demo/elements/context-menu/radio-menu.ts +0 -83
  80. package/demo/elements/context-menu/separators.html +0 -25
  81. package/demo/elements/context-menu/separators.ts +0 -172
  82. package/demo/elements/currency/index.html +0 -91
  83. package/demo/elements/currency/index.ts +0 -352
  84. package/demo/elements/environment/environment-editor.html +0 -20
  85. package/demo/elements/environment/environment-editor.ts +0 -49
  86. package/demo/elements/environment/index.html +0 -33
  87. package/demo/elements/environment/server-editor.html +0 -20
  88. package/demo/elements/environment/server-editor.ts +0 -67
  89. package/demo/elements/environment/variables-editor.html +0 -20
  90. package/demo/elements/environment/variables-editor.ts +0 -94
  91. package/demo/elements/har/har-viewer.html +0 -20
  92. package/demo/elements/har/har-viewer.ts +0 -76
  93. package/demo/elements/har/har1.har +0 -3044
  94. package/demo/elements/har/har2.json +0 -439
  95. package/demo/elements/har/index.html +0 -26
  96. package/demo/elements/highlight/example.md +0 -27
  97. package/demo/elements/highlight/index.html +0 -31
  98. package/demo/elements/highlight/marked-highlight.html +0 -132
  99. package/demo/elements/highlight/marked-highlight.ts +0 -22
  100. package/demo/elements/highlight/prism-highlight.html +0 -62
  101. package/demo/elements/highlight/prism-highlight.ts +0 -17
  102. package/demo/elements/http/body-editor.html +0 -17
  103. package/demo/elements/http/body-editor.ts +0 -115
  104. package/demo/elements/http/headers.html +0 -17
  105. package/demo/elements/http/headers.ts +0 -59
  106. package/demo/elements/http/http-assertions.html +0 -20
  107. package/demo/elements/http/http-assertions.ts +0 -89
  108. package/demo/elements/http/http-flows.html +0 -23
  109. package/demo/elements/http/http-flows.ts +0 -89
  110. package/demo/elements/http/index.html +0 -45
  111. package/demo/elements/http/request-editor.html +0 -26
  112. package/demo/elements/http/request-editor.ts +0 -197
  113. package/demo/elements/http/request-log.html +0 -16
  114. package/demo/elements/http/request-log.ts +0 -136
  115. package/demo/elements/http/url-editing.html +0 -17
  116. package/demo/elements/http/url-editing.ts +0 -112
  117. package/demo/elements/icons/index.html +0 -81
  118. package/demo/elements/icons/index.ts +0 -52
  119. package/demo/elements/index.html +0 -72
  120. package/demo/elements/mention-textarea/index.html +0 -19
  121. package/demo/elements/mention-textarea/index.ts +0 -205
  122. package/demo/elements/navigation/navigation-item.html +0 -49
  123. package/demo/elements/navigation/navigation-item.ts +0 -131
  124. package/demo/elements/navigation/navigation.html +0 -20
  125. package/demo/elements/navigation/navigation.ts +0 -45
  126. package/demo/elements/project/index.html +0 -29
  127. package/demo/elements/project/project-run-report.html +0 -20
  128. package/demo/elements/project/project-run-report.ts +0 -132
  129. package/demo/elements/project/request-editor.html +0 -23
  130. package/demo/elements/project/request-editor.ts +0 -232
  131. package/demo/elements/user/user-avatar.html +0 -17
  132. package/demo/elements/user/user-avatar.ts +0 -60
  133. package/demo/env.js +0 -4
  134. package/demo/index.html +0 -34
  135. package/demo/layout/index.html +0 -94
  136. package/demo/layout/index.ts +0 -190
  137. package/demo/md/DemoStyles.ts +0 -61
  138. package/demo/md/UiDemoPage.ts +0 -6
  139. package/demo/md/buttons/button.html +0 -121
  140. package/demo/md/buttons/button.ts +0 -246
  141. package/demo/md/buttons/group.html +0 -36
  142. package/demo/md/buttons/group.ts +0 -171
  143. package/demo/md/checkbox/index.html +0 -39
  144. package/demo/md/checkbox/index.ts +0 -220
  145. package/demo/md/chip/chip.html +0 -70
  146. package/demo/md/chip/chip.ts +0 -219
  147. package/demo/md/chip/pawel6c9a.jpg +0 -0
  148. package/demo/md/collapse/CustomDetail.ts +0 -89
  149. package/demo/md/collapse/collapse.html +0 -21
  150. package/demo/md/collapse/collapse.ts +0 -78
  151. package/demo/md/date-picker/date-picker.ts +0 -336
  152. package/demo/md/date-picker/index.html +0 -171
  153. package/demo/md/dialog/confirm-dialog.html +0 -49
  154. package/demo/md/dialog/confirm-dialog.ts +0 -121
  155. package/demo/md/dialog/dialog.html +0 -25
  156. package/demo/md/dialog/dialog.ts +0 -468
  157. package/demo/md/dropdown-list/index.html +0 -31
  158. package/demo/md/dropdown-list/index.ts +0 -158
  159. package/demo/md/icon-button/index.html +0 -122
  160. package/demo/md/icon-button/index.ts +0 -132
  161. package/demo/md/index.html +0 -73
  162. package/demo/md/inputs/input.html +0 -73
  163. package/demo/md/inputs/input.ts +0 -278
  164. package/demo/md/inputs/radio.html +0 -39
  165. package/demo/md/inputs/radio.ts +0 -156
  166. package/demo/md/inputs/switch.html +0 -45
  167. package/demo/md/inputs/switch.ts +0 -144
  168. package/demo/md/list/list.html +0 -65
  169. package/demo/md/list/list.ts +0 -204
  170. package/demo/md/listbox/listbox.html +0 -31
  171. package/demo/md/listbox/listbox.ts +0 -27
  172. package/demo/md/menu/index.html +0 -19
  173. package/demo/md/menu/index.ts +0 -514
  174. package/demo/md/notification/snack.html +0 -21
  175. package/demo/md/notification/snack.ts +0 -70
  176. package/demo/md/progress/progress.html +0 -46
  177. package/demo/md/progress/progress.ts +0 -161
  178. package/demo/md/segmented-button/index.html +0 -21
  179. package/demo/md/segmented-button/index.ts +0 -55
  180. package/demo/md/select/index.html +0 -16
  181. package/demo/md/select/index.ts +0 -217
  182. package/demo/md/tabs/tabs.html +0 -40
  183. package/demo/md/tabs/tabs.ts +0 -214
  184. package/demo/oauth-popup.html +0 -36
  185. package/demo/page.css +0 -8
  186. package/demo/resources/calendar-month.png +0 -0
  187. package/demo/resources/favorite.png +0 -0
  188. package/demo/resources/fingerprint.png +0 -0
  189. package/demo/resources/home-work.png +0 -0
  190. package/demo/resources/mood.png +0 -0
  191. package/demo/resources/print.png +0 -0
  192. package/demo/resources/stars.png +0 -0
  193. package/demo/resources/theaters.png +0 -0
  194. package/demo/tsconfig.json +0 -4
  195. package/eslint.config.js +0 -97
  196. package/scripts/copy-assets.js +0 -21
  197. package/scripts/release.js +0 -66
  198. package/src/demo/DemoPage.ts +0 -169
  199. package/src/demo/DemoStyles.ts +0 -60
  200. package/test/README.md +0 -375
  201. package/test/contextual-menu/ContextMenu.test.ts +0 -760
  202. package/test/contextual-menu/ContextMenuElement.test.ts +0 -569
  203. package/test/core/activity.spec.ts +0 -413
  204. package/test/core/activity_manager.spec.ts +0 -544
  205. package/test/core/application.spec.ts +0 -218
  206. package/test/core/fragment.spec.ts +0 -565
  207. package/test/core/fragment_manager.spec.ts +0 -404
  208. package/test/core/live_data.spec.ts +0 -558
  209. package/test/core/renderer.spec.ts +0 -113
  210. package/test/dom-assertions.test.ts +0 -182
  211. package/test/elements/MonacoSetup.ts +0 -65
  212. package/test/elements/authorization/basic-method.test.ts +0 -177
  213. package/test/elements/authorization/bearer-method.test.ts +0 -143
  214. package/test/elements/authorization/ntlm-method.test.ts +0 -219
  215. package/test/elements/authorization/oauth2-client-credentials-method.test.ts +0 -334
  216. package/test/elements/authorization/oauth2-code-method.test.ts +0 -320
  217. package/test/elements/authorization/oauth2-custom-grant-method.test.ts +0 -255
  218. package/test/elements/authorization/oauth2-device-code-method.test.ts +0 -371
  219. package/test/elements/authorization/oauth2-implicit-method.test.ts +0 -407
  220. package/test/elements/authorization/oauth2-jwt-method.test.ts +0 -217
  221. package/test/elements/authorization/oauth2-password-method.test.ts +0 -275
  222. package/test/elements/authorization/openid-method.test.ts +0 -591
  223. package/test/elements/autocomplete/autocomplete-input.spec.ts +0 -646
  224. package/test/elements/code-editor/code-editor.accessibility.test.ts +0 -298
  225. package/test/elements/code-editor/code-editor.test.ts +0 -574
  226. package/test/elements/currency/CurrencyPicker.accessibility.test.ts +0 -328
  227. package/test/elements/currency/CurrencyPicker.core.test.ts +0 -318
  228. package/test/elements/currency/CurrencyPicker.integration.test.ts +0 -482
  229. package/test/elements/currency/CurrencyPicker.test.ts +0 -486
  230. package/test/elements/data-table/DataTable.browser.test.ts +0 -649
  231. package/test/elements/har/HarUtils.test.ts +0 -45
  232. package/test/elements/har/HarViewerElement.test.ts +0 -687
  233. package/test/elements/har/test-data/har1.har +0 -3044
  234. package/test/elements/highlight/MarkedHighlightElement.test.ts +0 -452
  235. package/test/elements/highlight/PrismHighlightElement.test.ts +0 -79
  236. package/test/elements/highlight/PrismHighlighter.test.ts +0 -94
  237. package/test/elements/highlight/remoteSanitization.md +0 -1
  238. package/test/elements/highlight/test.md +0 -3
  239. package/test/elements/highlight/test1.md +0 -3
  240. package/test/elements/highlight/test2.md +0 -1
  241. package/test/elements/http/BodyFormdataEditorElement.test.ts +0 -482
  242. package/test/elements/http/BodyMultipartEditorElement.test.ts +0 -658
  243. package/test/elements/http/BodyRawEditorElement.test.ts +0 -90
  244. package/test/elements/http/CertificateAdd.test.ts +0 -457
  245. package/test/elements/http/HttpAssertions.test.ts +0 -994
  246. package/test/elements/http/HttpFlows.test.ts +0 -502
  247. package/test/elements/http/UrlEncodeUtils.test.ts +0 -202
  248. package/test/elements/layout/SplitItem.test.ts +0 -440
  249. package/test/elements/layout/SplitLayoutManager.test.ts +0 -1501
  250. package/test/elements/layout/SplitPanel.test.ts +0 -1109
  251. package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +0 -114
  252. package/test/elements/mention-textarea/MentionTextArea.test.ts +0 -613
  253. package/test/elements/navigation/Navigation.test.ts +0 -120
  254. package/test/env.ts +0 -15
  255. package/test/events/EventTypes.test.ts +0 -363
  256. package/test/events/EventsTestHelpers.ts +0 -16
  257. package/test/helpers/TestUtils.ts +0 -243
  258. package/test/helpers/UiMock.ts +0 -185
  259. package/test/lib/Dom.test.ts +0 -231
  260. package/test/md/button/UiButton.test.ts +0 -347
  261. package/test/md/button/UiIconButton.test.ts +0 -155
  262. package/test/md/chip/UiChip.test.ts +0 -219
  263. package/test/md/collapse/UiCollapse.test.ts +0 -250
  264. package/test/md/collapse/flex-layout.test.ts +0 -105
  265. package/test/md/date-time/DateTime.test.ts +0 -348
  266. package/test/md/dialog/UiConfirmDialog.test.ts +0 -131
  267. package/test/md/dialog/UiDialog.test.ts +0 -759
  268. package/test/md/menu/Menu.test.ts +0 -855
  269. package/test/md/menu/MenuIntegration.test.ts +0 -426
  270. package/test/md/menu/MenuItem.test.ts +0 -652
  271. package/test/md/menu/SubMenu.test.ts +0 -410
  272. package/test/md/progress/UiCircularProgressElement.test.ts +0 -481
  273. package/test/md/progress/UiProgressElement.test.ts +0 -117
  274. package/test/md/progress/UiRangeElement.test.ts +0 -156
  275. package/test/md/select/Select.test.ts +0 -925
  276. package/test/plugins/takeScreenshotPlugin.js +0 -35
  277. package/test/setup.test.ts +0 -217
  278. package/test/setup.ts +0 -117
  279. package/test/tsconfig.json +0 -7
  280. package/web-dev-server.config.js +0 -21
  281. 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
- })