kempo-ui 0.0.36 → 0.0.37

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 (45) hide show
  1. package/package.json +2 -2
  2. package/src/components/Table.js +2 -1
  3. package/src/components/tableControls/PageSelect.js +20 -28
  4. package/tests/components/Accordion.browser-test.js +470 -0
  5. package/tests/components/Card.browser-test.js +286 -0
  6. package/tests/components/ColorPicker.browser-test.js +658 -0
  7. package/tests/components/ContentSlider.browser-test.js +495 -0
  8. package/tests/components/Dialog.browser-test.js +677 -0
  9. package/tests/components/FocusCapture.browser-test.js +187 -0
  10. package/tests/components/HybridComponent.browser-test.js +1 -1
  11. package/tests/components/Icon.browser-test.js +355 -0
  12. package/tests/components/Import.browser-test.js +312 -0
  13. package/tests/components/PhotoViewer.browser-test.js +640 -0
  14. package/tests/components/Resize.browser-test.js +553 -0
  15. package/tests/components/ShadowComponent.browser-test.js +3 -3
  16. package/tests/components/ShowMore.browser-test.js +618 -0
  17. package/tests/components/SideMenu.browser-test.js +667 -0
  18. package/tests/components/Sortable.browser-test.js +650 -0
  19. package/tests/components/Split.browser-test.js +629 -0
  20. package/tests/components/Table.browser-test.js +1119 -0
  21. package/tests/components/Tabs.browser-test.js +847 -0
  22. package/tests/components/Tags.browser-test.js +604 -0
  23. package/tests/components/ThemeSwitcher.browser-test.js +413 -0
  24. package/tests/components/Timestamp.browser-test.js +509 -0
  25. package/tests/components/Toast.browser-test.js +616 -0
  26. package/tests/components/Toggle.browser-test.js +557 -0
  27. package/tests/components/Tree.browser-test.js +790 -0
  28. package/tests/components/tableControls/ExportControls.browser-test.js +307 -0
  29. package/tests/components/tableControls/FieldSortHide.browser-test.js +347 -0
  30. package/tests/components/tableControls/Filters.browser-test.js +376 -0
  31. package/tests/components/tableControls/HiddenCount.browser-test.js +263 -0
  32. package/tests/components/tableControls/PaginationControls.browser-test.js +514 -0
  33. package/tests/components/tableControls/RecordControls.browser-test.js +360 -0
  34. package/tests/components/tableControls/Search.browser-test.js +283 -0
  35. package/tests/components/tableControls/TableControl.browser-test.js +300 -0
  36. package/tests/utils/context.test.js +224 -0
  37. package/tests/utils/cookie.browser-test.js +146 -0
  38. package/tests/utils/drag.browser-test.js +285 -0
  39. package/tests/utils/formatTimestamp.test.js +224 -0
  40. package/tests/utils/object.browser-test.js +378 -0
  41. package/tests/utils/propConverters.test.js +207 -0
  42. package/tests/utils/string.test.js +379 -0
  43. package/tests/utils/theme.browser-test.js +177 -0
  44. package/tests/utils/type.test.js +211 -0
  45. package/tests/utils/wait.browser-test.js +19 -0
@@ -0,0 +1,495 @@
1
+ import ContentSlider from '../../src/components/ContentSlider.js';
2
+
3
+ const createContentSlider = async (options = {}) => {
4
+ const container = document.createElement('div');
5
+ container.innerHTML = `
6
+ <k-content-slider
7
+ ${options.controls === false ? 'controls="false"' : ''}
8
+ ${options.loop ? 'loop="true"' : ''}
9
+ ${options.globalControls ? 'global-controls="true"' : ''}
10
+ ${options.keyboardControls === false ? 'keyboard-controls="false"' : ''}
11
+ ${options.index !== undefined ? `index="${options.index}"` : ''}
12
+ >
13
+ <div id="slide1">Slide 1</div>
14
+ <div id="slide2">Slide 2</div>
15
+ <div id="slide3">Slide 3</div>
16
+ </k-content-slider>
17
+ `;
18
+ document.body.appendChild(container);
19
+
20
+ const slider = container.querySelector('k-content-slider');
21
+ await slider.updateComplete;
22
+
23
+ return { container, slider };
24
+ };
25
+
26
+ const cleanup = container => {
27
+ if(container && container.parentNode){
28
+ container.parentNode.removeChild(container);
29
+ }
30
+ };
31
+
32
+ export default {
33
+ /*
34
+ Element Creation Tests
35
+ */
36
+ 'should create content slider element': async ({pass, fail}) => {
37
+ const { container, slider } = await createContentSlider();
38
+
39
+ if(!slider){
40
+ cleanup(container);
41
+ fail('ContentSlider element should be created');
42
+ return;
43
+ }
44
+
45
+ if(!(slider instanceof ContentSlider)){
46
+ cleanup(container);
47
+ fail('Element should be instance of ContentSlider');
48
+ return;
49
+ }
50
+
51
+ cleanup(container);
52
+ pass('ContentSlider element created correctly');
53
+ },
54
+
55
+ 'should have shadow root': async ({pass, fail}) => {
56
+ const { container, slider } = await createContentSlider();
57
+
58
+ if(!slider.shadowRoot){
59
+ cleanup(container);
60
+ fail('ContentSlider should have shadow root');
61
+ return;
62
+ }
63
+
64
+ cleanup(container);
65
+ pass('ContentSlider has shadow root');
66
+ },
67
+
68
+ /*
69
+ Default Property Tests
70
+ */
71
+ 'should have default index of 0': async ({pass, fail}) => {
72
+ const { container, slider } = await createContentSlider();
73
+
74
+ if(slider.index !== 0){
75
+ cleanup(container);
76
+ fail(`Expected index 0, got ${slider.index}`);
77
+ return;
78
+ }
79
+
80
+ cleanup(container);
81
+ pass('Default index is 0');
82
+ },
83
+
84
+ 'should have default controls as true': async ({pass, fail}) => {
85
+ const { container, slider } = await createContentSlider();
86
+
87
+ if(slider.controls !== true){
88
+ cleanup(container);
89
+ fail(`Expected controls true, got ${slider.controls}`);
90
+ return;
91
+ }
92
+
93
+ cleanup(container);
94
+ pass('Default controls is true');
95
+ },
96
+
97
+ 'should have default loop as false': async ({pass, fail}) => {
98
+ const { container, slider } = await createContentSlider();
99
+
100
+ if(slider.loop !== false){
101
+ cleanup(container);
102
+ fail(`Expected loop false, got ${slider.loop}`);
103
+ return;
104
+ }
105
+
106
+ cleanup(container);
107
+ pass('Default loop is false');
108
+ },
109
+
110
+ 'should have default keyboardControls as true': async ({pass, fail}) => {
111
+ const { container, slider } = await createContentSlider();
112
+
113
+ if(slider.keyboardControls !== true){
114
+ cleanup(container);
115
+ fail(`Expected keyboardControls true, got ${slider.keyboardControls}`);
116
+ return;
117
+ }
118
+
119
+ cleanup(container);
120
+ pass('Default keyboardControls is true');
121
+ },
122
+
123
+ 'should have default globalControls as false': async ({pass, fail}) => {
124
+ const { container, slider } = await createContentSlider();
125
+
126
+ if(slider.globalControls !== false){
127
+ cleanup(container);
128
+ fail(`Expected globalControls false, got ${slider.globalControls}`);
129
+ return;
130
+ }
131
+
132
+ cleanup(container);
133
+ pass('Default globalControls is false');
134
+ },
135
+
136
+ /*
137
+ Navigation Tests
138
+ */
139
+ 'should go to next slide': async ({pass, fail}) => {
140
+ const { container, slider } = await createContentSlider();
141
+
142
+ slider.next();
143
+ await slider.updateComplete;
144
+
145
+ if(slider.index !== 1){
146
+ cleanup(container);
147
+ fail(`Expected index 1, got ${slider.index}`);
148
+ return;
149
+ }
150
+
151
+ cleanup(container);
152
+ pass('next() advances to next slide');
153
+ },
154
+
155
+ 'should go to previous slide': async ({pass, fail}) => {
156
+ const { container, slider } = await createContentSlider({ index: 2 });
157
+
158
+ slider.previous();
159
+ await slider.updateComplete;
160
+
161
+ if(slider.index !== 1){
162
+ cleanup(container);
163
+ fail(`Expected index 1, got ${slider.index}`);
164
+ return;
165
+ }
166
+
167
+ cleanup(container);
168
+ pass('previous() goes to previous slide');
169
+ },
170
+
171
+ 'should go to specific slide with goto': async ({pass, fail}) => {
172
+ const { container, slider } = await createContentSlider();
173
+
174
+ slider.goto(2);
175
+ await slider.updateComplete;
176
+
177
+ if(slider.index !== 2){
178
+ cleanup(container);
179
+ fail(`Expected index 2, got ${slider.index}`);
180
+ return;
181
+ }
182
+
183
+ cleanup(container);
184
+ pass('goto() navigates to specific slide');
185
+ },
186
+
187
+ 'should not go below 0 without loop': async ({pass, fail}) => {
188
+ const { container, slider } = await createContentSlider();
189
+
190
+ slider.previous();
191
+ await slider.updateComplete;
192
+
193
+ if(slider.index !== 0){
194
+ cleanup(container);
195
+ fail(`Expected index 0, got ${slider.index}`);
196
+ return;
197
+ }
198
+
199
+ cleanup(container);
200
+ pass('Does not go below 0 without loop');
201
+ },
202
+
203
+ 'should not exceed max index without loop': async ({pass, fail}) => {
204
+ const { container, slider } = await createContentSlider({ index: 2 });
205
+
206
+ slider.next();
207
+ await slider.updateComplete;
208
+
209
+ if(slider.index !== 2){
210
+ cleanup(container);
211
+ fail(`Expected index 2, got ${slider.index}`);
212
+ return;
213
+ }
214
+
215
+ cleanup(container);
216
+ pass('Does not exceed max index without loop');
217
+ },
218
+
219
+ /*
220
+ Loop Tests
221
+ */
222
+ 'should loop to last slide when going previous from first': async ({pass, fail}) => {
223
+ const { container, slider } = await createContentSlider({ loop: true });
224
+
225
+ slider.previous();
226
+ await slider.updateComplete;
227
+
228
+ if(slider.index !== 2){
229
+ cleanup(container);
230
+ fail(`Expected index 2 (last), got ${slider.index}`);
231
+ return;
232
+ }
233
+
234
+ cleanup(container);
235
+ pass('Loops to last slide from first');
236
+ },
237
+
238
+ 'should loop to first slide when going next from last': async ({pass, fail}) => {
239
+ const { container, slider } = await createContentSlider({ loop: true, index: 2 });
240
+
241
+ slider.next();
242
+ await slider.updateComplete;
243
+
244
+ if(slider.index !== 0){
245
+ cleanup(container);
246
+ fail(`Expected index 0 (first), got ${slider.index}`);
247
+ return;
248
+ }
249
+
250
+ cleanup(container);
251
+ pass('Loops to first slide from last');
252
+ },
253
+
254
+ /*
255
+ Event Tests
256
+ */
257
+ 'should dispatch change event on index change': async ({pass, fail}) => {
258
+ const { container, slider } = await createContentSlider();
259
+
260
+ let eventFired = false;
261
+ let eventDetail = null;
262
+ slider.addEventListener('change', e => {
263
+ eventFired = true;
264
+ eventDetail = e.detail;
265
+ });
266
+
267
+ slider.next();
268
+ await slider.updateComplete;
269
+
270
+ if(!eventFired){
271
+ cleanup(container);
272
+ fail('change event should be dispatched');
273
+ return;
274
+ }
275
+
276
+ if(eventDetail.index !== 1){
277
+ cleanup(container);
278
+ fail(`Expected index 1 in detail, got ${eventDetail.index}`);
279
+ return;
280
+ }
281
+
282
+ cleanup(container);
283
+ pass('change event dispatched with correct detail');
284
+ },
285
+
286
+ 'should dispatch next event': async ({pass, fail}) => {
287
+ const { container, slider } = await createContentSlider();
288
+
289
+ let eventFired = false;
290
+ slider.addEventListener('next', () => {
291
+ eventFired = true;
292
+ });
293
+
294
+ slider.next();
295
+ await slider.updateComplete;
296
+
297
+ if(!eventFired){
298
+ cleanup(container);
299
+ fail('next event should be dispatched');
300
+ return;
301
+ }
302
+
303
+ cleanup(container);
304
+ pass('next event dispatched');
305
+ },
306
+
307
+ 'should dispatch previous event': async ({pass, fail}) => {
308
+ const { container, slider } = await createContentSlider({ index: 1 });
309
+
310
+ let eventFired = false;
311
+ slider.addEventListener('previous', () => {
312
+ eventFired = true;
313
+ });
314
+
315
+ slider.previous();
316
+ await slider.updateComplete;
317
+
318
+ if(!eventFired){
319
+ cleanup(container);
320
+ fail('previous event should be dispatched');
321
+ return;
322
+ }
323
+
324
+ cleanup(container);
325
+ pass('previous event dispatched');
326
+ },
327
+
328
+ 'should dispatch goto event': async ({pass, fail}) => {
329
+ const { container, slider } = await createContentSlider();
330
+
331
+ let eventFired = false;
332
+ slider.addEventListener('goto', () => {
333
+ eventFired = true;
334
+ });
335
+
336
+ slider.goto(2);
337
+ await slider.updateComplete;
338
+
339
+ if(!eventFired){
340
+ cleanup(container);
341
+ fail('goto event should be dispatched');
342
+ return;
343
+ }
344
+
345
+ cleanup(container);
346
+ pass('goto event dispatched');
347
+ },
348
+
349
+ /*
350
+ Control Button Tests
351
+ */
352
+ 'should render prev and next buttons': async ({pass, fail}) => {
353
+ const { container, slider } = await createContentSlider();
354
+
355
+ const prevBtn = slider.shadowRoot.querySelector('#prev');
356
+ const nextBtn = slider.shadowRoot.querySelector('#next');
357
+
358
+ if(!prevBtn){
359
+ cleanup(container);
360
+ fail('Should render prev button');
361
+ return;
362
+ }
363
+
364
+ if(!nextBtn){
365
+ cleanup(container);
366
+ fail('Should render next button');
367
+ return;
368
+ }
369
+
370
+ cleanup(container);
371
+ pass('Renders prev and next buttons');
372
+ },
373
+
374
+ 'should navigate on button click': async ({pass, fail}) => {
375
+ const { container, slider } = await createContentSlider();
376
+
377
+ const nextBtn = slider.shadowRoot.querySelector('#next');
378
+ nextBtn.click();
379
+ await slider.updateComplete;
380
+
381
+ if(slider.index !== 1){
382
+ cleanup(container);
383
+ fail(`Expected index 1 after next click, got ${slider.index}`);
384
+ return;
385
+ }
386
+
387
+ cleanup(container);
388
+ pass('Button clicks navigate slides');
389
+ },
390
+
391
+ /*
392
+ Keyboard Control Tests
393
+ */
394
+ 'should navigate with arrow keys when focused': async ({pass, fail}) => {
395
+ const { container, slider } = await createContentSlider();
396
+
397
+ slider.focus();
398
+ slider.dispatchEvent(new KeyboardEvent('keydown', { code: 'ArrowRight' }));
399
+ await slider.updateComplete;
400
+
401
+ if(slider.index !== 1){
402
+ cleanup(container);
403
+ fail(`Expected index 1 after ArrowRight, got ${slider.index}`);
404
+ return;
405
+ }
406
+
407
+ cleanup(container);
408
+ pass('Arrow keys navigate when focused');
409
+ },
410
+
411
+ 'should dispatch keyleft event': async ({pass, fail}) => {
412
+ const { container, slider } = await createContentSlider({ index: 1 });
413
+
414
+ let eventFired = false;
415
+ slider.addEventListener('keyleft', () => {
416
+ eventFired = true;
417
+ });
418
+
419
+ slider.focus();
420
+ slider.dispatchEvent(new KeyboardEvent('keydown', { code: 'ArrowLeft' }));
421
+ await slider.updateComplete;
422
+
423
+ if(!eventFired){
424
+ cleanup(container);
425
+ fail('keyleft event should be dispatched');
426
+ return;
427
+ }
428
+
429
+ cleanup(container);
430
+ pass('keyleft event dispatched');
431
+ },
432
+
433
+ 'should dispatch keyright event': async ({pass, fail}) => {
434
+ const { container, slider } = await createContentSlider();
435
+
436
+ let eventFired = false;
437
+ slider.addEventListener('keyright', () => {
438
+ eventFired = true;
439
+ });
440
+
441
+ slider.focus();
442
+ slider.dispatchEvent(new KeyboardEvent('keydown', { code: 'ArrowRight' }));
443
+ await slider.updateComplete;
444
+
445
+ if(!eventFired){
446
+ cleanup(container);
447
+ fail('keyright event should be dispatched');
448
+ return;
449
+ }
450
+
451
+ cleanup(container);
452
+ pass('keyright event dispatched');
453
+ },
454
+
455
+ /*
456
+ Content Tests
457
+ */
458
+ 'should track content array': async ({pass, fail}) => {
459
+ const { container, slider } = await createContentSlider();
460
+
461
+ if(!Array.isArray(slider.content)){
462
+ cleanup(container);
463
+ fail('content should be an array');
464
+ return;
465
+ }
466
+
467
+ if(slider.content.length !== 3){
468
+ cleanup(container);
469
+ fail(`Expected 3 content items, got ${slider.content.length}`);
470
+ return;
471
+ }
472
+
473
+ cleanup(container);
474
+ pass('Content array tracked correctly');
475
+ },
476
+
477
+ /*
478
+ Index Reflection Tests
479
+ */
480
+ 'should reflect index attribute': async ({pass, fail}) => {
481
+ const { container, slider } = await createContentSlider();
482
+
483
+ slider.index = 2;
484
+ await slider.updateComplete;
485
+
486
+ if(slider.getAttribute('index') !== '2'){
487
+ cleanup(container);
488
+ fail(`Expected attribute "2", got "${slider.getAttribute('index')}"`);
489
+ return;
490
+ }
491
+
492
+ cleanup(container);
493
+ pass('Index attribute reflects property');
494
+ }
495
+ };