slim-select 2.8.2 → 2.9.0

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 (69) hide show
  1. package/.prettierignore +1 -0
  2. package/.prettierrc +4 -3
  3. package/README.md +2 -0
  4. package/dist/classes.d.ts +43 -0
  5. package/dist/helpers.d.ts +1 -1
  6. package/dist/index.d.ts +5 -2
  7. package/dist/render.d.ts +4 -44
  8. package/dist/select.d.ts +4 -2
  9. package/dist/settings.d.ts +2 -1
  10. package/dist/slimselect.cjs.js +248 -120
  11. package/dist/slimselect.css +1 -1
  12. package/dist/slimselect.css.map +1 -1
  13. package/dist/slimselect.es.js +248 -120
  14. package/dist/slimselect.global.js +248 -120
  15. package/dist/slimselect.js +248 -120
  16. package/dist/slimselect.min.js +1 -1
  17. package/dist/slimselect.umd.js +248 -120
  18. package/dist/slimselect.umd.min.js +1 -1
  19. package/dist/store.d.ts +4 -2
  20. package/index.html +1 -4
  21. package/jest.config.js +6 -0
  22. package/package.json +30 -39
  23. package/src/slim-select/classes.test.ts +72 -0
  24. package/src/slim-select/classes.ts +109 -0
  25. package/src/slim-select/helpers.test.ts +160 -0
  26. package/src/slim-select/helpers.ts +3 -12
  27. package/src/slim-select/index.test.ts +109 -16
  28. package/src/slim-select/index.ts +41 -12
  29. package/src/slim-select/render.test.ts +1169 -18
  30. package/src/slim-select/render.ts +75 -96
  31. package/src/slim-select/rollup.config.mjs +28 -28
  32. package/src/slim-select/select.test.ts +306 -156
  33. package/src/slim-select/select.ts +69 -20
  34. package/src/slim-select/settings.test.ts +257 -0
  35. package/src/slim-select/settings.ts +4 -0
  36. package/src/slim-select/slimselect.scss +7 -3
  37. package/src/slim-select/store.test.ts +986 -235
  38. package/src/slim-select/store.ts +70 -28
  39. package/src/{vue/slimselect.vue → slim-select/vue.vue} +19 -17
  40. package/tsconfig.json +2 -3
  41. package/src/react/.eslintignore +0 -2
  42. package/src/react/.eslintrc.cjs +0 -24
  43. package/src/react/index.html +0 -14
  44. package/src/react/jestconfig.json +0 -11
  45. package/src/react/package.json +0 -32
  46. package/src/react/src/frameworkpage.tsx +0 -133
  47. package/src/react/src/index.ts +0 -3
  48. package/src/react/src/slimselect.tsx +0 -148
  49. package/src/react/tests/slimselect.test.tsx +0 -52
  50. package/src/react/tsconfig.json +0 -37
  51. package/src/react/tsconfig.node.json +0 -10
  52. package/src/react/vite.config.ts +0 -55
  53. package/src/vue/README.md +0 -48
  54. package/src/vue/dist/slim-select/helpers.d.ts +0 -5
  55. package/src/vue/dist/slim-select/index.d.ts +0 -46
  56. package/src/vue/dist/slim-select/render.d.ts +0 -120
  57. package/src/vue/dist/slim-select/select.d.ts +0 -28
  58. package/src/vue/dist/slim-select/settings.d.ts +0 -34
  59. package/src/vue/dist/slim-select/store.d.ts +0 -80
  60. package/src/vue/dist/slimselectvue.es.js +0 -1978
  61. package/src/vue/dist/slimselectvue.global.js +0 -1981
  62. package/src/vue/dist/slimselectvue.ssr.js +0 -1980
  63. package/src/vue/dist/vue/hello.d.ts +0 -2
  64. package/src/vue/dist/vue/slimselect.vue.d.ts +0 -326
  65. package/src/vue/hello.ts +0 -5
  66. package/src/vue/package.json +0 -28
  67. package/src/vue/rollup.config.mjs +0 -44
  68. package/src/vue/tsconfig.json +0 -14
  69. /package/{vite.config.ts → vite.config.mts} +0 -0
@@ -9,62 +9,211 @@ import Select from './select'
9
9
  import Store, { Optgroup, Option } from './store'
10
10
 
11
11
  describe('select module', () => {
12
- test('constructor', () => {
13
- document.body.innerHTML = '<select id="test"></select>'
12
+ let select: Select
14
13
 
15
- let selectElement = document.getElementById('test') as HTMLSelectElement
16
- let select = new Select(selectElement)
17
- expect(select).toBeInstanceOf(Select)
14
+ beforeEach(() => {
15
+ document.body.innerHTML = `<select id="test" multiple>
16
+ <optgroup label="test1">
17
+ <option id="111" value="1">One</option>
18
+ <option id="222" value="2">Two</option>
19
+ </optgroup>
20
+ <optgroup label="test2">
21
+ <option id="333" value="3">Three</option>
22
+ <option id="444" value="4">Four</option>
23
+ <option id="555" value="5">Five</option>
24
+ </optgroup>
25
+ <option id="666" value="6">Six</option>
26
+ </select>`
27
+
28
+ const selectElement = document.getElementById('test') as HTMLSelectElement
29
+ select = new Select(selectElement)
18
30
  })
19
31
 
20
- test('get data from select options', () => {
21
- document.body.innerHTML = `<select id="test">
22
- <option id="value1" value="1">One</option>
23
- <option value="2">Two</option>
24
- </select>`
32
+ describe('constructor', () => {
33
+ test('constructor works', () => {
34
+ document.body.innerHTML = '<select id="test"></select>'
25
35
 
26
- let selectElement = document.getElementById('test') as HTMLSelectElement
27
- let select = new Select(selectElement)
28
- let data = select.getData() as Option[]
29
- expect(data.length).toBe(2)
30
- expect(data[0].id).toBe('value1')
31
- expect(data[0].value).toBe('1')
32
- expect(data[0].text).toBe('One')
33
- expect(data[1].value).toBe('2')
34
- expect(data[1].text).toBe('Two')
36
+ const selectElement = document.getElementById('test') as HTMLSelectElement
37
+ const select = new Select(selectElement)
38
+
39
+ expect(select).toBeInstanceOf(Select)
40
+ expect(select.listen).toBe(true)
41
+ expect((<any>select).observer).toBeInstanceOf(MutationObserver)
42
+ })
43
+ })
44
+
45
+ describe('enable', () => {
46
+ test('enable enables select element', () => {
47
+ select.select.disabled = true
48
+ select.enable()
49
+
50
+ expect(select.select.disabled).toBe(false)
51
+ })
52
+ })
53
+
54
+ describe('disable', () => {
55
+ test('disable disables select element', () => {
56
+ select.disable()
57
+
58
+ expect(select.select.disabled).toBe(true)
59
+ })
60
+ })
61
+
62
+ describe('hideUI', () => {
63
+ test('correct HTML attributes get set', () => {
64
+ select.hideUI()
65
+
66
+ expect(select.select.tabIndex).toBe(-1)
67
+ expect(select.select.style.display).toBe('none')
68
+ expect(select.select.getAttribute('aria-hidden')).toBe('true')
69
+ })
35
70
  })
36
71
 
37
- test('get data from select optgroups', () => {
38
- document.body.innerHTML = `<select id="test">
72
+ describe('showUI', () => {
73
+ test('HTML attributes get reset', () => {
74
+ select.select.tabIndex = -1
75
+ select.select.style.display = 'none'
76
+ select.select.setAttribute('aria-hidden', 'true')
77
+
78
+ select.showUI()
79
+
80
+ expect(select.select.tabIndex).toBeFalsy()
81
+ expect(select.select.style.display).toBeFalsy()
82
+ expect(select.select.getAttribute('aria-hidden')).toBeNull()
83
+ })
84
+ })
85
+
86
+ describe('getData', () => {
87
+ test('get data from select options', () => {
88
+ document.body.innerHTML = `<select id="test">
89
+ <option id="value1" value="1">One</option>
90
+ <option value="2">Two</option>
91
+ </select>`
92
+
93
+ const selectElement = document.getElementById('test') as HTMLSelectElement
94
+ const select = new Select(selectElement)
95
+ const data = select.getData() as Option[]
96
+
97
+ expect(data).toHaveLength(2)
98
+ expect(data[0].id).toBe('value1')
99
+ expect(data[0].value).toBe('1')
100
+ expect(data[0].text).toBe('One')
101
+ expect(data[1].value).toBe('2')
102
+ expect(data[1].text).toBe('Two')
103
+ })
104
+
105
+ test('get data from select optgroups', () => {
106
+ document.body.innerHTML = `<select id="test">
39
107
  <optgroup label="test1">
40
- <option value="1">One</option>
41
- <option value="2">Two</option>
108
+ <option id="111" value="1">One</option>
109
+ <option id="222" value="2">Two</option>
42
110
  </optgroup>
43
111
  <optgroup label="test2">
44
- <option value="3">Three</option>
45
- <option value="4">Four</option>
46
- <option value="5">Five</option>
112
+ <option id="333" value="3">Three</option>
113
+ <option id="444" value="4">Four</option>
114
+ <option id="555" value="5">Five</option>
47
115
  </optgroup>
48
- </select>`
116
+ </select>`
117
+
118
+ const selectElement = document.getElementById('test') as HTMLSelectElement
119
+ const select = new Select(selectElement)
120
+ const data = select.getData() as Optgroup[]
121
+
122
+ expect(data).toHaveLength(2)
123
+
124
+ expect(data[0].label).toBe('test1')
125
+ expect(data[0].options).toHaveLength(2)
126
+ expect(data[0].options[0].id).toBe('111')
127
+ expect(data[0].options[0].value).toBe('1')
128
+ expect(data[0].options[0].text).toBe('One')
129
+ expect(data[0].options[1].id).toBe('222')
130
+ expect(data[0].options[1].value).toBe('2')
131
+ expect(data[0].options[1].text).toBe('Two')
132
+
133
+ expect(data[1].label).toBe('test2')
134
+ expect(data[1].options).toHaveLength(3)
135
+ expect(data[1].options[0].id).toBe('333')
136
+ expect(data[1].options[0].value).toBe('3')
137
+ expect(data[1].options[0].text).toBe('Three')
138
+ expect(data[1].options[1].id).toBe('444')
139
+ expect(data[1].options[1].value).toBe('4')
140
+ expect(data[1].options[1].text).toBe('Four')
141
+ expect(data[1].options[2].id).toBe('555')
142
+ expect(data[1].options[2].value).toBe('5')
143
+ expect(data[1].options[2].text).toBe('Five')
144
+ })
145
+ })
49
146
 
50
- let selectElement = document.getElementById('test') as HTMLSelectElement
51
- let select = new Select(selectElement)
52
- let data = select.getData() as Optgroup[]
53
- expect(data.length).toBe(2)
54
- expect(data[0].label).toBe('test1')
55
- expect(data[0].options.length).toBe(2)
56
- expect(data[0].options[0].value).toBe('1')
57
- expect(data[0].options[0].text).toBe('One')
58
- expect(data[0].options[1].value).toBe('2')
59
- expect(data[0].options[1].text).toBe('Two')
60
- expect(data[1].label).toBe('test2')
61
- expect(data[1].options.length).toBe(3)
62
- expect(data[1].options[0].value).toBe('3')
63
- expect(data[1].options[0].text).toBe('Three')
64
- expect(data[1].options[1].value).toBe('4')
65
- expect(data[1].options[1].text).toBe('Four')
66
- expect(data[1].options[2].value).toBe('5')
67
- expect(data[1].options[2].text).toBe('Five')
147
+ describe('setSelected', () => {
148
+ test('single option gets selected correctly', () => {
149
+ // get id of the first option in the first optgroup
150
+ const id = select.select.querySelector<HTMLOptionElement>('optgroup option')?.id
151
+ expect(id).toBe('111')
152
+
153
+ select.setSelected([id as string])
154
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="1"]')?.selected).toBe(true)
155
+ })
156
+
157
+ test('mix of options get selected correctly', () => {
158
+ select.setSelected(['111', '222', '333'])
159
+
160
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="1"]')?.selected).toBe(true)
161
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="2"]')?.selected).toBe(true)
162
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="3"]')?.selected).toBe(true)
163
+ })
164
+ })
165
+
166
+ describe('setSelectedByValue', () => {
167
+ test('single value get selected correctly', () => {
168
+ select.setSelectedByValue(['6'])
169
+
170
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="6"]')?.selected).toBe(true)
171
+ })
172
+
173
+ test('opt group value gets selected correctly', () => {
174
+ select.setSelectedByValue(['4'])
175
+
176
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="4"]')?.selected).toBe(true)
177
+ })
178
+
179
+ test('mix of options get selected correctly', () => {
180
+ select.setSelectedByValue(['2', '3', '6'])
181
+
182
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="2"]')?.selected).toBe(true)
183
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="3"]')?.selected).toBe(true)
184
+ expect(select.select.querySelector<HTMLOptionElement>('option[value="6"]')?.selected).toBe(true)
185
+ })
186
+ })
187
+
188
+ describe('updateSelected', () => {
189
+ test('id gets updated correctly', () => {
190
+ select.select.dataset.id = 'old_id'
191
+
192
+ select.updateSelect('new_id')
193
+
194
+ expect(select.select.dataset.id).toBe('new_id')
195
+ })
196
+
197
+ test('new styles are set correctly', () => {
198
+ select.updateSelect(undefined, 'color: red')
199
+
200
+ expect(select.select.style.color).toBe('red')
201
+ })
202
+
203
+ test("setting styles doesn't override id", () => {
204
+ select.select.dataset.id = 'set_id'
205
+
206
+ select.updateSelect(undefined, 'color: red')
207
+
208
+ expect(select.select.dataset.id).toBe('set_id')
209
+ })
210
+
211
+ test('classes are set correctly', () => {
212
+ select.updateSelect(undefined, undefined, ['class0', 'class1'])
213
+
214
+ expect(select.select.classList.contains('class0')).toBe(true)
215
+ expect(select.select.classList.contains('class1')).toBe(true)
216
+ })
68
217
  })
69
218
 
70
219
  test('update select from data', () => {
@@ -77,113 +226,109 @@ describe('select module', () => {
77
226
  id: '1',
78
227
  value: '1',
79
228
  text: 'One',
80
- selected: false,
229
+ selected: false
81
230
  },
82
231
  {
83
232
  id: '2',
84
233
  value: '2',
85
234
  text: 'Two',
86
- selected: false,
87
- },
235
+ selected: false
236
+ }
88
237
  ])
89
238
  let data = store.getData()
90
239
  select.updateOptions(data)
91
240
 
92
241
  expect(selectElement.outerHTML).toBe(
93
- '<select id="test"><option id="1" value="1">One</option><option id="2" value="2">Two</option></select>',
242
+ '<select id="test"><option id="1" value="1">One</option><option id="2" value="2">Two</option></select>'
94
243
  )
95
244
  })
96
245
 
97
- test('event change value listener', async () => {
98
- document.body.innerHTML = `<select id="test">
246
+ describe('onValueChange', () => {
247
+ let select: Select
248
+ let selectElement: HTMLSelectElement
249
+
250
+ beforeEach(() => {
251
+ document.body.innerHTML = `<select id="test">
99
252
  <option value="1">One</option>
100
253
  <option value="2">Two</option>
101
254
  <option value="3">Three</option>
102
- </select>`
103
-
104
- let selectElement = document.getElementById('test') as HTMLSelectElement
105
- let select = new Select(selectElement)
106
-
107
- let data = select.getData() as Option[]
108
-
109
- expect(data[0].selected).toBe(true)
255
+ </select>`
110
256
 
111
- const callback = jest.fn()
112
- select.onValueChange = callback
257
+ selectElement = document.getElementById('test') as HTMLSelectElement
258
+ select = new Select(selectElement)
259
+ })
113
260
 
114
- // Change the value
115
- selectElement.value = '2'
116
- selectElement.dispatchEvent(new Event('change'))
261
+ test('listener is triggered when the select value changes', async () => {
262
+ // make sure the first element is selected as standard
263
+ let data = select.getData() as Option[]
264
+ expect(data[0].selected).toBe(true)
117
265
 
118
- // TODO: figure out why this is not working
119
- // expect(callback).toHaveBeenCalled()
266
+ const onValueMock = jest.fn()
267
+ select.onValueChange = onValueMock
120
268
 
121
- // Get selected data
122
- const selected = select.getSelectedValues()
123
- expect(selected[0]).toBe('2')
269
+ // Change the value
270
+ selectElement.value = '2'
271
+ selectElement.dispatchEvent(new Event('change'))
124
272
 
125
- // Change the full data
126
- data = select.getData() as Option[]
127
- expect(data[1].selected).toBe(true)
128
- })
273
+ await new Promise((r) => setTimeout(r, 50))
274
+ expect(onValueMock).toHaveBeenCalled()
129
275
 
130
- test('event change value listener when options are replaced', () => {
131
- document.body.innerHTML = `<select id="test">
132
- <option value="1">One</option>
133
- <option value="2">Two</option>
134
- <option value="3">Three</option>
135
- </select>`
276
+ // Get selected data
277
+ const selected = select.getSelectedValues()
278
+ expect(selected[0]).toBe('2')
136
279
 
137
- let selectElement = document.getElementById('test') as HTMLSelectElement
138
- let select = new Select(selectElement)
280
+ // Check all data
281
+ data = select.getData() as Option[]
282
+ expect(data[0].selected).toBe(false)
283
+ expect(data[1].selected).toBe(true)
284
+ })
139
285
 
140
- let data = select.getData() as Option[]
286
+ test('listener is triggered when inner HTML is replaced with new options', async () => {
287
+ const onValueMock = jest.fn()
288
+ select.onValueChange = onValueMock
141
289
 
142
- expect(data[0].selected).toBe(true)
143
-
144
- const callback = jest.fn()
145
- select.onValueChange = callback
146
-
147
- selectElement.innerHTML = `<option value="4">Four</option>
290
+ selectElement.innerHTML = `<option value="4">Four</option>
148
291
  <option value="5" selected>Five</option>
149
292
  <option value="6">Six</option>`
150
293
 
151
- // TODO: figure out why this is not working
152
- // expect(callback).toHaveBeenCalled()
294
+ await new Promise((r) => setTimeout(r, 50))
295
+ expect(onValueMock).toHaveBeenCalled()
153
296
 
154
- // Give the mutation observer time to run
155
- data = select.getData() as Option[]
156
- expect(data[1].value).toBe('5')
157
- expect(data[1].selected).toBe(true)
297
+ // Give the mutation observer time to run
298
+ const data = select.getData() as Option[]
299
+ expect(data[1].value).toBe('5')
300
+ expect(data[1].selected).toBe(true)
301
+ })
158
302
  })
159
303
 
160
- test('mutation observer listener for select option changes', () => {
161
- document.body.innerHTML = `<select id="test">
304
+ describe('onOptionsChange', () => {
305
+ test('listener triggers when select options change without changing the select value', async () => {
306
+ document.body.innerHTML = `<select id="test">
162
307
  <option value="1">One</option>
163
308
  <option value="2">Two</option>
164
309
  <option value="3">Three</option>
165
- </select>`
310
+ </select>`
166
311
 
167
- let selectElement = document.getElementById('test') as HTMLSelectElement
168
- let select = new Select(selectElement)
312
+ const selectElement = document.getElementById('test') as HTMLSelectElement
313
+ const select = new Select(selectElement)
169
314
 
170
- let data = select.getData() as Option[]
171
- expect(data.length).toBe(3)
315
+ let data = select.getData() as Option[]
316
+ expect(data).toHaveLength(3)
172
317
 
173
- const callback = jest.fn()
174
- select.onOptionsChange = callback
318
+ const onOptionsMock = jest.fn()
319
+ select.onOptionsChange = onOptionsMock
175
320
 
176
- selectElement.innerHTML = '<option value="1">One</option><option value="2">Two</option>'
321
+ selectElement.innerHTML = '<option value="1">One</option><option value="2">Two</option>'
177
322
 
178
- // TODO: figure out why this is not working
179
- // expect(callback).toHaveBeenCalled()
323
+ await new Promise((r) => setTimeout(r, 50))
324
+ expect(onOptionsMock).toHaveBeenCalled()
180
325
 
181
- data = select.getData() as Option[]
182
- expect(data.length).toBe(2)
183
- })
326
+ data = select.getData() as Option[]
327
+ expect(data).toHaveLength(2)
328
+ })
184
329
 
185
- test('mutation observer listener for select optgroup option changes', () => {
186
- document.body.innerHTML = `<select id="test">
330
+ test('listener triggers when optgroup options change', async () => {
331
+ document.body.innerHTML = `<select id="test">
187
332
  <optgroup id="test_optgroup" label="test1">
188
333
  <option value="1">One</option>
189
334
  <option value="2">Two</option>
@@ -193,58 +338,59 @@ describe('select module', () => {
193
338
  <option value="4">Four</option>
194
339
  <option value="5">Five</option>
195
340
  </optgroup>
196
- </select>`
341
+ </select>`
197
342
 
198
- let selectElement = document.getElementById('test') as HTMLSelectElement
199
- let select = new Select(selectElement)
343
+ const selectElement = document.getElementById('test') as HTMLSelectElement
344
+ const select = new Select(selectElement)
200
345
 
201
- let dataOptgroup = select.getData() as Optgroup[]
346
+ const optGroups = select.getData() as Optgroup[]
347
+ expect(optGroups).toHaveLength(2)
202
348
 
203
- expect(dataOptgroup.length).toBe(2)
349
+ const onOptionsMock = jest.fn()
350
+ select.onOptionsChange = onOptionsMock
204
351
 
205
- const callback = jest.fn()
206
- select.onOptionsChange = callback
352
+ const selectOptgroup = document.getElementById('test_optgroup') as HTMLOptGroupElement
353
+ selectOptgroup.innerHTML = '<option value="8">Eight</option><option value="9">Nine</option>'
207
354
 
208
- let selectOptgroup = document.getElementById('test_optgroup') as HTMLOptGroupElement
209
- selectOptgroup.innerHTML = '<option value="8">Eight</option><option value="9">Nine</option>'
355
+ await new Promise((r) => setTimeout(r, 50))
356
+ expect(onOptionsMock).toHaveBeenCalled()
210
357
 
211
- // TODO: figure out why this is not working
212
- // expect(callback).toHaveBeenCalled()
358
+ const options = select.getData() as Option[]
359
+ expect(options).toHaveLength(2)
213
360
 
214
- let dataOptgroups = select.getData() as Option[]
215
- expect(dataOptgroups.length).toBe(2)
361
+ // get selected data
362
+ const selected = select.getSelectedValues()
363
+ expect(selected).toHaveLength(1)
364
+ })
216
365
 
217
- // get selected data
218
- let selected = select.getSelectedValues()
219
- expect(selected.length).toBe(1)
220
- })
221
-
222
- test('mutation observer listener for select option text changes', () => {
223
- document.body.innerHTML = `<select id="test">
366
+ test('listener triggers when select option text changes', async () => {
367
+ document.body.innerHTML = `<select id="test">
224
368
  <option value="1">One</option>
225
369
  <option value="2">Two</option>
226
370
  <option value="3">Three</option>
227
- </select>`
371
+ </select>`
228
372
 
229
- let selectElement = document.getElementById('test') as HTMLSelectElement
230
- let select = new Select(selectElement)
373
+ const selectElement = document.getElementById('test') as HTMLSelectElement
374
+ const select = new Select(selectElement)
231
375
 
232
- let data = select.getData() as Option[]
376
+ let data = select.getData() as Option[]
377
+ expect(data[0].text).toBe('One')
233
378
 
234
- expect(data[0].text).toBe('One')
379
+ const onOptionsMock = jest.fn()
380
+ select.onOptionsChange = onOptionsMock
235
381
 
236
- const callback = jest.fn()
237
- select.onOptionsChange = callback
382
+ let option = selectElement.options[0]
383
+ option.text = 'New One'
238
384
 
239
- let option = selectElement.options[0]
240
- option.text = 'New One'
385
+ await new Promise((r) => setTimeout(r, 50))
386
+ expect(onOptionsMock).toHaveBeenCalled()
241
387
 
242
- data = select.getData() as Option[]
243
- expect(data[0].text).toBe('New One')
244
- })
388
+ data = select.getData() as Option[]
389
+ expect(data[0].text).toBe('New One')
390
+ })
245
391
 
246
- test('mutation observer listener for select optgroup option text changes', () => {
247
- document.body.innerHTML = `<select id="test">
392
+ test('listener triggers when select optgroup option text changes', async () => {
393
+ document.body.innerHTML = `<select id="test">
248
394
  <optgroup id="test_optgroup" label="test1">
249
395
  <option id=test_option value="1">One</option>
250
396
  <option value="2">Two</option>
@@ -254,22 +400,26 @@ describe('select module', () => {
254
400
  <option value="4">Four</option>
255
401
  <option value="5">Five</option>
256
402
  </optgroup>
257
- </select>`
403
+ </select>`
258
404
 
259
- let selectElement = document.getElementById('test') as HTMLSelectElement
260
- let select = new Select(selectElement)
405
+ const selectElement = document.getElementById('test') as HTMLSelectElement
406
+ const select = new Select(selectElement)
407
+
408
+ let dataOptgroup = select.getData() as Optgroup[]
261
409
 
262
- let dataOptgroup = select.getData() as Optgroup[]
410
+ expect(dataOptgroup[0].options[0].text).toBe('One')
263
411
 
264
- expect(dataOptgroup[0].options[0].text).toBe('One')
412
+ const onOptionsMock = jest.fn()
413
+ select.onOptionsChange = onOptionsMock
265
414
 
266
- const callback = jest.fn()
267
- select.onOptionsChange = callback
415
+ let selectOption = document.getElementById('test_option') as HTMLOptionElement
416
+ selectOption.text = 'New One'
268
417
 
269
- let selectOption = document.getElementById('test_option') as HTMLOptionElement
270
- selectOption.text = 'New One'
418
+ await new Promise((r) => setTimeout(r, 50))
419
+ expect(onOptionsMock).toHaveBeenCalled()
271
420
 
272
- let dataOption = select.getData() as Optgroup[]
273
- expect(dataOption[0].options[0].text).toBe('New One')
421
+ let dataOption = select.getData() as Optgroup[]
422
+ expect(dataOption[0].options[0].text).toBe('New One')
423
+ })
274
424
  })
275
425
  })