@api-client/ui 0.5.39 → 0.5.41

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