@fmidev/smartmet-alert-client 4.4.19 → 4.7.0-beta.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 (123) hide show
  1. package/.eslintignore +2 -14
  2. package/.github/workflows/test.yaml +26 -0
  3. package/.nvmrc +1 -0
  4. package/AGENTS.md +26 -0
  5. package/index.html +1 -1
  6. package/package.json +80 -22
  7. package/src/AlertClientVue.vue +160 -0
  8. package/src/App.vue +154 -296
  9. package/src/assets/img/ui/arrow-down.svg +4 -11
  10. package/src/assets/img/ui/arrow-up.svg +4 -11
  11. package/src/assets/img/ui/clear.svg +7 -21
  12. package/src/assets/img/ui/close.svg +4 -15
  13. package/src/assets/img/ui/toggle-selected.svg +5 -6
  14. package/src/assets/img/ui/toggle-unselected.svg +5 -6
  15. package/src/assets/img/warning/cold-weather.svg +3 -6
  16. package/src/assets/img/warning/flood-level-3.svg +4 -7
  17. package/src/assets/img/warning/forest-fire-weather.svg +2 -6
  18. package/src/assets/img/warning/grass-fire-weather.svg +2 -6
  19. package/src/assets/img/warning/hot-weather.svg +3 -6
  20. package/src/assets/img/warning/pedestrian-safety.svg +3 -7
  21. package/src/assets/img/warning/rain.svg +2 -7
  22. package/src/assets/img/warning/sea-icing.svg +2 -6
  23. package/src/assets/img/warning/sea-thunder-storm.svg +2 -5
  24. package/src/assets/img/warning/sea-water-height-high-water.svg +3 -8
  25. package/src/assets/img/warning/sea-water-height-shallow-water.svg +3 -7
  26. package/src/assets/img/warning/sea-wave-height.svg +4 -7
  27. package/src/assets/img/warning/sea-wind-legend.svg +2 -5
  28. package/src/assets/img/warning/sea-wind.svg +2 -5
  29. package/src/assets/img/warning/several.svg +2 -5
  30. package/src/assets/img/warning/thunder-storm.svg +2 -5
  31. package/src/assets/img/warning/traffic-weather.svg +2 -6
  32. package/src/assets/img/warning/uv-note.svg +2 -6
  33. package/src/assets/img/warning/wind.svg +2 -5
  34. package/src/components/AlertClient.vue +330 -251
  35. package/src/components/CollapsiblePanel.vue +281 -0
  36. package/src/components/DayLarge.vue +146 -110
  37. package/src/components/DaySmall.vue +97 -81
  38. package/src/components/Days.vue +229 -159
  39. package/src/components/DescriptionWarning.vue +63 -38
  40. package/src/components/GrayScaleToggle.vue +58 -54
  41. package/src/components/Legend.vue +102 -325
  42. package/src/components/MapLarge.vue +574 -351
  43. package/src/components/MapSmall.vue +137 -122
  44. package/src/components/PopupRow.vue +24 -12
  45. package/src/components/Region.vue +168 -118
  46. package/src/components/RegionWarning.vue +40 -33
  47. package/src/components/Regions.vue +189 -105
  48. package/src/components/Warning.vue +70 -45
  49. package/src/components/Warnings.vue +136 -72
  50. package/src/composables/useAlertClient.ts +360 -0
  51. package/src/composables/useConfig.ts +573 -0
  52. package/src/composables/useFields.ts +66 -0
  53. package/src/composables/useI18n.ts +62 -0
  54. package/src/composables/useKeyCodes.ts +16 -0
  55. package/src/composables/useMapPaths.ts +477 -0
  56. package/src/composables/useUtils.ts +683 -0
  57. package/src/composables/useWarningsProcessor.ts +1007 -0
  58. package/src/data/geometries.json +993 -0
  59. package/src/{main.js → main.ts} +1 -0
  60. package/src/mixins/geojsonsvg.d.ts +57 -0
  61. package/src/mixins/geojsonsvg.js +5 -3
  62. package/src/plugins/index.ts +5 -0
  63. package/src/scss/_utilities.scss +193 -0
  64. package/src/scss/constants.scss +2 -1
  65. package/src/scss/warningImages.scss +8 -3
  66. package/src/types/index.ts +509 -0
  67. package/src/vite-env.d.ts +23 -0
  68. package/src/vue.ts +41 -0
  69. package/svgo.config.js +45 -0
  70. package/tests/README.md +430 -0
  71. package/tests/fixtures/mockWarningData.ts +152 -0
  72. package/tests/integration/warning-flow.spec.ts +445 -0
  73. package/tests/setup.ts +41 -0
  74. package/tests/unit/components/AlertClient.spec.ts +701 -0
  75. package/tests/unit/components/DayLarge.spec.ts +348 -0
  76. package/tests/unit/components/DaySmall.spec.ts +352 -0
  77. package/tests/unit/components/Days.spec.ts +548 -0
  78. package/tests/unit/components/DescriptionWarning.spec.ts +385 -0
  79. package/tests/unit/components/GrayScaleToggle.spec.ts +318 -0
  80. package/tests/unit/components/Legend.spec.ts +295 -0
  81. package/tests/unit/components/MapLarge.spec.ts +448 -0
  82. package/tests/unit/components/MapSmall.spec.ts +367 -0
  83. package/tests/unit/components/PopupRow.spec.ts +270 -0
  84. package/tests/unit/components/Region.spec.ts +373 -0
  85. package/tests/unit/components/RegionWarning.snapshot.spec.ts +361 -0
  86. package/tests/unit/components/RegionWarning.spec.ts +381 -0
  87. package/tests/unit/components/Regions.spec.ts +503 -0
  88. package/tests/unit/components/Warning.snapshot.spec.ts +483 -0
  89. package/tests/unit/components/Warning.spec.ts +489 -0
  90. package/tests/unit/components/Warnings.spec.ts +343 -0
  91. package/tests/unit/components/__snapshots__/RegionWarning.snapshot.spec.ts.snap +41 -0
  92. package/tests/unit/components/__snapshots__/Warning.snapshot.spec.ts.snap +433 -0
  93. package/tests/unit/composables/useConfig.spec.ts +279 -0
  94. package/tests/unit/composables/useI18n.spec.ts +116 -0
  95. package/tests/unit/composables/useKeyCodes.spec.ts +27 -0
  96. package/tests/unit/composables/useUtils.spec.ts +213 -0
  97. package/tsconfig.json +43 -0
  98. package/tsconfig.node.json +11 -0
  99. package/vite.config.js +96 -26
  100. package/vitest.config.js +40 -0
  101. package/dist/favicon.ico +0 -0
  102. package/dist/index.dark.html +0 -20
  103. package/dist/index.en.html +0 -15
  104. package/dist/index.fi.html +0 -15
  105. package/dist/index.html +0 -15
  106. package/dist/index.js +0 -281
  107. package/dist/index.mjs +0 -281
  108. package/dist/index.mjs.map +0 -1
  109. package/dist/index.relative.html +0 -19
  110. package/dist/index.start.html +0 -20
  111. package/dist/index.sv.html +0 -15
  112. package/playwright.config.ts +0 -18
  113. package/public/index.relative.html +0 -19
  114. package/public/index.start.html +0 -20
  115. package/src/mixins/config.js +0 -1378
  116. package/src/mixins/fields.js +0 -26
  117. package/src/mixins/i18n.js +0 -25
  118. package/src/mixins/keycodes.js +0 -10
  119. package/src/mixins/panzoom.js +0 -900
  120. package/src/mixins/utils.js +0 -900
  121. package/src/plugins/index.js +0 -3
  122. package/test/snapshot.test.ts +0 -126
  123. package/vitest.config.ts +0 -6
@@ -0,0 +1,548 @@
1
+ import { describe, it, expect, afterEach, vi } from 'vitest'
2
+ import { mount, VueWrapper } from '@vue/test-utils'
3
+ import Days from '@/components/Days.vue'
4
+ import type { Day, DayRegions, Theme, Language } from '@/types'
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ type ComponentInstance = any
8
+
9
+ const mockDaysInput: Day[] = [
10
+ {
11
+ weekdayName: 'thursday',
12
+ day: 31,
13
+ month: 10,
14
+ year: 2025,
15
+ severity: 3,
16
+ updatedDate: '31.10.2025',
17
+ updatedTime: '14:00',
18
+ },
19
+ {
20
+ weekdayName: 'friday',
21
+ day: 1,
22
+ month: 11,
23
+ year: 2025,
24
+ severity: 2,
25
+ updatedDate: '31.10.2025',
26
+ updatedTime: '14:00',
27
+ },
28
+ {
29
+ weekdayName: 'saturday',
30
+ day: 2,
31
+ month: 11,
32
+ year: 2025,
33
+ severity: 0,
34
+ updatedDate: '31.10.2025',
35
+ updatedTime: '14:00',
36
+ },
37
+ {
38
+ weekdayName: 'sunday',
39
+ day: 3,
40
+ month: 11,
41
+ year: 2025,
42
+ severity: 0,
43
+ updatedDate: '31.10.2025',
44
+ updatedTime: '14:00',
45
+ },
46
+ {
47
+ weekdayName: 'monday',
48
+ day: 4,
49
+ month: 11,
50
+ year: 2025,
51
+ severity: 0,
52
+ updatedDate: '31.10.2025',
53
+ updatedTime: '14:00',
54
+ },
55
+ ]
56
+
57
+ const mockRegions: DayRegions[] = [
58
+ { land: [], sea: [] },
59
+ { land: [], sea: [] },
60
+ { land: [], sea: [] },
61
+ { land: [], sea: [] },
62
+ { land: [], sea: [] },
63
+ ]
64
+
65
+ describe('Days.vue', () => {
66
+ let wrapper: VueWrapper | null = null
67
+
68
+ afterEach(() => {
69
+ if (wrapper) {
70
+ wrapper.unmount()
71
+ wrapper = null
72
+ }
73
+ })
74
+
75
+ describe('Component mounting', () => {
76
+ it('should mount with required props', () => {
77
+ wrapper = mount(Days, {
78
+ props: {
79
+ input: mockDaysInput,
80
+ regions: mockRegions,
81
+ geometryId: 2021,
82
+ language: 'fi' as Language,
83
+ },
84
+ global: {
85
+ stubs: {
86
+ 'b-tabs': false,
87
+ 'b-tab': false,
88
+ },
89
+ },
90
+ })
91
+
92
+ expect(wrapper.exists()).toBe(true)
93
+ })
94
+
95
+ it('should initialize with selectedDay prop', () => {
96
+ wrapper = mount(Days, {
97
+ props: {
98
+ input: mockDaysInput,
99
+ regions: mockRegions,
100
+ geometryId: 2021,
101
+ selectedDay: 2,
102
+ language: 'fi' as Language,
103
+ },
104
+ })
105
+
106
+ expect((wrapper.vm as ComponentInstance).day).toBe(2)
107
+ })
108
+
109
+ it('should have default selectedDay of 0', () => {
110
+ wrapper = mount(Days, {
111
+ props: {
112
+ input: mockDaysInput,
113
+ regions: mockRegions,
114
+ geometryId: 2021,
115
+ language: 'fi' as Language,
116
+ },
117
+ })
118
+
119
+ expect((wrapper.vm as ComponentInstance).day).toBe(0)
120
+ })
121
+ })
122
+
123
+ describe('Props validation', () => {
124
+ it('should accept valid selectedDay values (0-4)', () => {
125
+ const validDays: (0 | 1 | 2 | 3 | 4)[] = [0, 1, 2, 3, 4]
126
+
127
+ validDays.forEach((day) => {
128
+ wrapper = mount(Days, {
129
+ props: {
130
+ input: mockDaysInput,
131
+ regions: mockRegions,
132
+ geometryId: 2021,
133
+ selectedDay: day,
134
+ language: 'fi' as Language,
135
+ },
136
+ })
137
+
138
+ expect((wrapper.vm as ComponentInstance).selectedDay).toBe(day)
139
+ })
140
+ })
141
+
142
+ it('should accept staticDays boolean prop', () => {
143
+ wrapper = mount(Days, {
144
+ props: {
145
+ input: mockDaysInput,
146
+ regions: mockRegions,
147
+ geometryId: 2021,
148
+ staticDays: false,
149
+ language: 'fi' as Language,
150
+ },
151
+ })
152
+
153
+ expect((wrapper.vm as ComponentInstance).staticDays).toBe(false)
154
+ })
155
+
156
+ it('should accept timeOffset number prop', () => {
157
+ wrapper = mount(Days, {
158
+ props: {
159
+ input: mockDaysInput,
160
+ regions: mockRegions,
161
+ geometryId: 2021,
162
+ timeOffset: 3600000,
163
+ language: 'fi' as Language,
164
+ },
165
+ })
166
+
167
+ expect((wrapper.vm as ComponentInstance).timeOffset).toBe(3600000)
168
+ })
169
+
170
+ it('should accept loading prop', () => {
171
+ wrapper = mount(Days, {
172
+ props: {
173
+ input: mockDaysInput,
174
+ regions: mockRegions,
175
+ geometryId: 2021,
176
+ loading: false,
177
+ language: 'fi' as Language,
178
+ },
179
+ })
180
+
181
+ expect((wrapper.vm as ComponentInstance).loading).toBe(false)
182
+ })
183
+ })
184
+
185
+ describe('Computed properties', () => {
186
+ it('should compute numberOfDays as 5', () => {
187
+ wrapper = mount(Days, {
188
+ props: {
189
+ input: mockDaysInput,
190
+ regions: mockRegions,
191
+ geometryId: 2021,
192
+ language: 'fi' as Language,
193
+ },
194
+ })
195
+
196
+ expect((wrapper.vm as ComponentInstance).numberOfDays).toBe(5)
197
+ })
198
+ })
199
+
200
+ describe('Day selection', () => {
201
+ it('should emit daySelected event when day changes', async () => {
202
+ wrapper = mount(Days, {
203
+ props: {
204
+ input: mockDaysInput,
205
+ regions: mockRegions,
206
+ geometryId: 2021,
207
+ language: 'fi' as Language,
208
+ },
209
+ })
210
+ ;(wrapper.vm as ComponentInstance).day = 2
211
+
212
+ await wrapper.vm.$nextTick()
213
+
214
+ expect(wrapper.emitted('daySelected')).toBeTruthy()
215
+ expect(wrapper.emitted('daySelected')![0]).toEqual([2])
216
+ })
217
+
218
+ it('should call onDaySelected when day changes', async () => {
219
+ wrapper = mount(Days, {
220
+ props: {
221
+ input: mockDaysInput,
222
+ regions: mockRegions,
223
+ geometryId: 2021,
224
+ language: 'fi' as Language,
225
+ },
226
+ })
227
+ ;(wrapper.vm as ComponentInstance).day = 3
228
+
229
+ await wrapper.vm.$nextTick()
230
+
231
+ expect(wrapper.emitted('daySelected')).toBeTruthy()
232
+ const emitted = wrapper.emitted('daySelected')!
233
+ expect(emitted[emitted.length - 1]).toEqual([3])
234
+ })
235
+ })
236
+
237
+ describe('Edge cases', () => {
238
+ it('should handle empty input array', () => {
239
+ wrapper = mount(Days, {
240
+ props: {
241
+ input: [],
242
+ regions: [],
243
+ geometryId: 2021,
244
+ language: 'fi' as Language,
245
+ },
246
+ })
247
+
248
+ expect(wrapper.exists()).toBe(true)
249
+ expect((wrapper.vm as ComponentInstance).input.length).toBe(0)
250
+ })
251
+
252
+ it('should handle mismatched regions and days', () => {
253
+ wrapper = mount(Days, {
254
+ props: {
255
+ input: mockDaysInput,
256
+ regions: [{ land: [], sea: [] }],
257
+ geometryId: 2021,
258
+ language: 'fi' as Language,
259
+ },
260
+ })
261
+
262
+ expect(wrapper.exists()).toBe(true)
263
+ })
264
+
265
+ it('should handle boundary selected day values', () => {
266
+ wrapper = mount(Days, {
267
+ props: {
268
+ input: mockDaysInput,
269
+ regions: mockRegions,
270
+ selectedDay: 4,
271
+ geometryId: 2021,
272
+ language: 'fi' as Language,
273
+ },
274
+ })
275
+
276
+ expect(wrapper.exists()).toBe(true)
277
+ expect((wrapper.vm as ComponentInstance).day).toBe(4)
278
+ })
279
+
280
+ it('should handle first day selection', () => {
281
+ wrapper = mount(Days, {
282
+ props: {
283
+ input: mockDaysInput,
284
+ regions: mockRegions,
285
+ selectedDay: 0,
286
+ geometryId: 2021,
287
+ language: 'fi' as Language,
288
+ },
289
+ })
290
+
291
+ expect(wrapper.exists()).toBe(true)
292
+ expect((wrapper.vm as ComponentInstance).day).toBe(0)
293
+ })
294
+
295
+ it('should handle malformed day data', () => {
296
+ const malformedData = [
297
+ { severity: 1 },
298
+ { weekdayName: 'friday' },
299
+ ] as unknown as Day[]
300
+
301
+ wrapper = mount(Days, {
302
+ props: {
303
+ input: malformedData,
304
+ regions: mockRegions,
305
+ geometryId: 2021,
306
+ language: 'fi' as Language,
307
+ },
308
+ })
309
+
310
+ expect(wrapper.exists()).toBe(true)
311
+ })
312
+ })
313
+
314
+ describe('Additional keyboard navigation', () => {
315
+ it('should have switchDay method', () => {
316
+ wrapper = mount(Days, {
317
+ props: {
318
+ input: mockDaysInput,
319
+ regions: mockRegions,
320
+ geometryId: 2021,
321
+ language: 'fi' as Language,
322
+ },
323
+ })
324
+
325
+ expect(typeof (wrapper.vm as ComponentInstance).switchDay).toBe(
326
+ 'function'
327
+ )
328
+ })
329
+
330
+ it('should navigate left with arrow key', async () => {
331
+ wrapper = mount(Days, {
332
+ props: {
333
+ input: mockDaysInput,
334
+ regions: mockRegions,
335
+ geometryId: 2021,
336
+ selectedDay: 2,
337
+ language: 'fi' as Language,
338
+ },
339
+ })
340
+ ;(wrapper.vm as ComponentInstance).$el.querySelector = vi.fn(() => ({
341
+ focus: vi.fn(),
342
+ }))
343
+
344
+ const event = {
345
+ keyCode: 37,
346
+ preventDefault: vi.fn(),
347
+ }
348
+
349
+ ;(wrapper.vm as ComponentInstance).switchDay(event)
350
+
351
+ expect((wrapper.vm as ComponentInstance).day).toBe(1)
352
+ expect(event.preventDefault).toHaveBeenCalled()
353
+ })
354
+
355
+ it('should navigate right with arrow key', async () => {
356
+ wrapper = mount(Days, {
357
+ props: {
358
+ input: mockDaysInput,
359
+ regions: mockRegions,
360
+ geometryId: 2021,
361
+ selectedDay: 2,
362
+ language: 'fi' as Language,
363
+ },
364
+ })
365
+ ;(wrapper.vm as ComponentInstance).$el.querySelector = vi.fn(() => ({
366
+ focus: vi.fn(),
367
+ }))
368
+
369
+ const event = {
370
+ keyCode: 39,
371
+ preventDefault: vi.fn(),
372
+ }
373
+
374
+ ;(wrapper.vm as ComponentInstance).switchDay(event)
375
+
376
+ expect((wrapper.vm as ComponentInstance).day).toBe(3)
377
+ expect(event.preventDefault).toHaveBeenCalled()
378
+ })
379
+
380
+ it('should navigate to first day with Home key', async () => {
381
+ wrapper = mount(Days, {
382
+ props: {
383
+ input: mockDaysInput,
384
+ regions: mockRegions,
385
+ geometryId: 2021,
386
+ selectedDay: 3,
387
+ language: 'fi' as Language,
388
+ },
389
+ })
390
+ ;(wrapper.vm as ComponentInstance).$el.querySelector = vi.fn(() => ({
391
+ focus: vi.fn(),
392
+ }))
393
+
394
+ const event = {
395
+ keyCode: 36,
396
+ preventDefault: vi.fn(),
397
+ }
398
+
399
+ ;(wrapper.vm as ComponentInstance).switchDay(event)
400
+
401
+ expect((wrapper.vm as ComponentInstance).day).toBe(0)
402
+ expect(event.preventDefault).toHaveBeenCalled()
403
+ })
404
+
405
+ it('should navigate to last day with End key', async () => {
406
+ wrapper = mount(Days, {
407
+ props: {
408
+ input: mockDaysInput,
409
+ regions: mockRegions,
410
+ geometryId: 2021,
411
+ selectedDay: 1,
412
+ language: 'fi' as Language,
413
+ },
414
+ })
415
+ ;(wrapper.vm as ComponentInstance).$el.querySelector = vi.fn(() => ({
416
+ focus: vi.fn(),
417
+ }))
418
+
419
+ const event = {
420
+ keyCode: 35,
421
+ preventDefault: vi.fn(),
422
+ }
423
+
424
+ ;(wrapper.vm as ComponentInstance).switchDay(event)
425
+
426
+ expect((wrapper.vm as ComponentInstance).day).toBe(4)
427
+ expect(event.preventDefault).toHaveBeenCalled()
428
+ })
429
+
430
+ it('should not go below day 0 when navigating left', () => {
431
+ wrapper = mount(Days, {
432
+ props: {
433
+ input: mockDaysInput,
434
+ regions: mockRegions,
435
+ geometryId: 2021,
436
+ selectedDay: 0,
437
+ language: 'fi' as Language,
438
+ },
439
+ })
440
+ ;(wrapper.vm as ComponentInstance).$el.querySelector = vi.fn(() => ({
441
+ focus: vi.fn(),
442
+ }))
443
+
444
+ const event = {
445
+ keyCode: 37,
446
+ preventDefault: vi.fn(),
447
+ }
448
+
449
+ ;(wrapper.vm as ComponentInstance).switchDay(event)
450
+
451
+ expect((wrapper.vm as ComponentInstance).day).toBe(0)
452
+ })
453
+
454
+ it('should not go above day 4 when navigating right', () => {
455
+ wrapper = mount(Days, {
456
+ props: {
457
+ input: mockDaysInput,
458
+ regions: mockRegions,
459
+ geometryId: 2021,
460
+ selectedDay: 4,
461
+ language: 'fi' as Language,
462
+ },
463
+ })
464
+ ;(wrapper.vm as ComponentInstance).$el.querySelector = vi.fn(() => ({
465
+ focus: vi.fn(),
466
+ }))
467
+
468
+ const event = {
469
+ keyCode: 39,
470
+ preventDefault: vi.fn(),
471
+ }
472
+
473
+ ;(wrapper.vm as ComponentInstance).switchDay(event)
474
+
475
+ expect((wrapper.vm as ComponentInstance).day).toBe(4)
476
+ })
477
+ })
478
+
479
+ describe('Event handling', () => {
480
+ it('should emit loaded event when child emits', () => {
481
+ wrapper = mount(Days, {
482
+ props: {
483
+ input: mockDaysInput,
484
+ regions: mockRegions,
485
+ geometryId: 2021,
486
+ language: 'fi' as Language,
487
+ },
488
+ })
489
+ ;(wrapper.vm as ComponentInstance).onLoaded(true)
490
+
491
+ expect(wrapper.emitted('loaded')).toBeTruthy()
492
+ expect(wrapper.emitted('loaded')![0]).toEqual([true])
493
+ })
494
+
495
+ it('should not emit loaded event when child emits false', () => {
496
+ wrapper = mount(Days, {
497
+ props: {
498
+ input: mockDaysInput,
499
+ regions: mockRegions,
500
+ geometryId: 2021,
501
+ language: 'fi' as Language,
502
+ },
503
+ })
504
+ ;(wrapper.vm as ComponentInstance).onLoaded(false)
505
+
506
+ expect(wrapper.emitted('loaded')).toBeFalsy()
507
+ })
508
+ })
509
+
510
+ describe('Theme support', () => {
511
+ it('should apply theme class', () => {
512
+ wrapper = mount(Days, {
513
+ props: {
514
+ input: mockDaysInput,
515
+ regions: mockRegions,
516
+ geometryId: 2021,
517
+ theme: 'dark-theme' as Theme,
518
+ language: 'fi' as Language,
519
+ },
520
+ })
521
+
522
+ expect(wrapper.find('.date-selector').classes()).toContain('dark-theme')
523
+ })
524
+
525
+ it('should support all theme variants', () => {
526
+ const themes: Theme[] = [
527
+ 'light-theme',
528
+ 'dark-theme',
529
+ 'light-gray-theme',
530
+ 'dark-gray-theme',
531
+ ]
532
+
533
+ themes.forEach((theme) => {
534
+ wrapper = mount(Days, {
535
+ props: {
536
+ input: mockDaysInput,
537
+ regions: mockRegions,
538
+ geometryId: 2021,
539
+ theme,
540
+ language: 'fi' as Language,
541
+ },
542
+ })
543
+
544
+ expect(wrapper.find('.date-selector').classes()).toContain(theme)
545
+ })
546
+ })
547
+ })
548
+ })