@zap-wunschlachen/wl-shared-components 1.0.38 → 1.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/playwright.yml +205 -205
- package/.github/workflows/static.yml +61 -61
- package/.github/workflows/update-snapshots.yml +37 -37
- package/.prettierrc +5 -5
- package/.storybook/main.ts +18 -18
- package/.storybook/preview.ts +37 -37
- package/.storybook/storyWrapper.vue +18 -18
- package/.storybook/withVuetifyTheme.decorator.ts +21 -21
- package/App.vue +33 -33
- package/README.md +56 -56
- package/heroicons.ts +75 -75
- package/index.html +19 -19
- package/package.json +67 -67
- package/playwright.config.ts +48 -48
- package/public/background.svg +60 -60
- package/public/style.css +187 -187
- package/public/technologies.svg +22 -22
- package/src/assets/css/base.css +234 -232
- package/src/assets/css/variables.css +112 -109
- package/src/components/Accordion/Accordion.css +59 -59
- package/src/components/Accordion/AccordionGroup.vue +51 -51
- package/src/components/Accordion/AccordionItem.vue +66 -66
- package/src/components/Appointment/Card/Actions.css +54 -54
- package/src/components/Appointment/Card/Actions.vue +99 -99
- package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
- package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
- package/src/components/Appointment/Card/Card.css +80 -80
- package/src/components/Appointment/Card/Card.vue +93 -93
- package/src/components/Appointment/Card/Details.css +50 -50
- package/src/components/Appointment/Card/Details.vue +43 -43
- package/src/components/Audio/Audio.vue +187 -187
- package/src/components/Audio/Waveform.vue +118 -118
- package/src/components/Button/Button.vue +174 -174
- package/src/components/CheckBox/CheckBox.css +214 -214
- package/src/components/CheckBox/Checkbox.vue +138 -138
- package/src/components/DateInput/DateInput.css +2 -2
- package/src/components/DateInput/DateInput.vue +262 -262
- package/src/components/Dialog/Dialog.css +6 -6
- package/src/components/Dialog/Dialog.vue +38 -38
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +202 -202
- package/src/components/ErrorPage/ErrorPage.css +172 -172
- package/src/components/IconBullet/IconBullet.vue +86 -86
- package/src/components/IconBullet/IconBulletList.vue +41 -41
- package/src/components/Icons/AdvanceAppointments.vue +153 -153
- package/src/components/Icons/Audio/CloudFailed.vue +20 -20
- package/src/components/Icons/Audio/CloudSaved.vue +21 -21
- package/src/components/Icons/Audio/Delete.vue +15 -15
- package/src/components/Icons/Audio/Pause.vue +18 -18
- package/src/components/Icons/Audio/Play.vue +15 -15
- package/src/components/Icons/{calendar.vue → Calendar.vue} +17 -17
- package/src/components/Icons/CalendarNotification.vue +126 -126
- package/src/components/Icons/Chair.vue +32 -32
- package/src/components/Icons/ChairNotification.vue +35 -35
- package/src/components/Icons/Circle.vue +66 -66
- package/src/components/Icons/FavIcon.vue +22 -22
- package/src/components/Icons/FilledCircle.vue +11 -11
- package/src/components/Icons/Group3.vue +46 -46
- package/src/components/Icons/RingNotification.vue +54 -54
- package/src/components/Icons/SolidArrowRight.vue +14 -14
- package/src/components/Icons/checkbox.vue +19 -19
- package/src/components/Icons/outlineChecked.vue +27 -27
- package/src/components/Icons/play.vue +5 -5
- package/src/components/Input/Input.css +187 -187
- package/src/components/Input/Input.vue +253 -253
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
- package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
- package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
- package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
- package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
- package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
- package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
- package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
- package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
- package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
- package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
- package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
- package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
- package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
- package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
- package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
- package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
- package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
- package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
- package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
- package/src/components/Loader/Loader.css +71 -71
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -127
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
- package/src/components/Modal/Modal.css +5 -5
- package/src/components/Modal/Modal.vue +22 -22
- package/src/components/NotificationBubble/NotificationBubble.css +4 -4
- package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
- package/src/components/OtpInput/OtpInput.css +39 -39
- package/src/components/OtpInput/OtpInput.vue +151 -151
- package/src/components/PhoneInput/PhoneInput.css +31 -31
- package/src/components/PhoneInput/PhoneInput.vue +113 -113
- package/src/components/Select/Select.css +150 -150
- package/src/components/Select/Select.vue +316 -316
- package/src/components/TextArea/TextArea.css +3 -3
- package/src/components/TextArea/TextArea.vue +126 -126
- package/src/components/TickBox/TickBox.css +49 -49
- package/src/components/TickBox/TickBox.vue +126 -126
- package/src/components/accessibility.css +218 -218
- package/src/components/index.ts +29 -29
- package/src/constants/iconEnums.ts +3 -3
- package/src/i18n/i18n.ts +15 -15
- package/src/i18n/locales/de.json +30 -30
- package/src/i18n/locales/en.json +30 -30
- package/src/index.ts +34 -34
- package/src/main.ts +11 -11
- package/src/plugins/vuetify.ts +141 -141
- package/src/shims-vue.d.ts +10 -10
- package/src/stories/Accordion.stories.ts +650 -650
- package/src/stories/Audio.stories.ts +28 -28
- package/src/stories/Button.stories.ts +263 -263
- package/src/stories/CheckBox.stories.ts +348 -348
- package/src/stories/DateInput.stories.ts +53 -53
- package/src/stories/Dialog.stories.ts +147 -147
- package/src/stories/EditField.stories.ts +78 -78
- package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
- package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
- package/src/stories/Input.stories.ts +351 -351
- package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
- package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
- package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
- package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
- package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
- package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
- package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
- package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
- package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
- package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
- package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
- package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
- package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
- package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
- package/src/stories/Laboratory/Timeline.stories.ts +403 -403
- package/src/stories/NotificationBubble.stories.ts +194 -194
- package/src/stories/OtpInput.stories.ts +100 -100
- package/src/stories/PhoneInput.stories.ts +52 -52
- package/src/stories/Select.stories.ts +419 -419
- package/src/stories/TextArea.stories.ts +112 -112
- package/src/stories/TickBox.stories.ts +294 -294
- package/src/stories/v-icon.stories.ts +91 -91
- package/src/utils/index.ts +116 -109
- package/src/vite-env.d.ts +1 -1
- package/tests/e2e/README.md +220 -220
- package/tests/e2e/accessibility.spec.ts +638 -638
- package/tests/e2e/accordion.spec.ts +42 -42
- package/tests/e2e/additional-components.spec.ts +437 -437
- package/tests/e2e/all-components.spec.ts +135 -135
- package/tests/e2e/appointment-card.spec.ts +816 -816
- package/tests/e2e/button-fixed.spec.ts +58 -58
- package/tests/e2e/button.spec.ts +76 -76
- package/tests/e2e/checkbox.spec.ts +50 -50
- package/tests/e2e/date-input.spec.ts +46 -46
- package/tests/e2e/debug.spec.ts +51 -51
- package/tests/e2e/dialog.spec.ts +58 -58
- package/tests/e2e/input.spec.ts +55 -55
- package/tests/e2e/laboratory-components.spec.ts +320 -320
- package/tests/e2e/otp-input.spec.ts +50 -50
- package/tests/e2e/select.spec.ts +52 -52
- package/tests/e2e/storybook-utils.ts +59 -59
- package/tests/e2e/test-basic.spec.ts +33 -33
- package/tests/e2e/visual-regression.spec.ts +350 -350
- package/tests/unit/accessibility/component-a11y.spec.ts +469 -469
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -292
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
- package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
- package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
- package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
- package/tests/unit/components/Audio/Audio.spec.ts +403 -403
- package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
- package/tests/unit/components/Background/Background.spec.ts +177 -177
- package/tests/unit/components/Core/Button.spec.ts +336 -336
- package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
- package/tests/unit/components/Core/DateInput.spec.ts +690 -690
- package/tests/unit/components/Core/Dialog.spec.ts +485 -485
- package/tests/unit/components/Core/EditField.spec.ts +782 -782
- package/tests/unit/components/Core/Input.spec.ts +512 -512
- package/tests/unit/components/Core/Modal.spec.ts +518 -518
- package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
- package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
- package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
- package/tests/unit/components/Core/Select.spec.ts +712 -712
- package/tests/unit/components/Core/TextArea.spec.ts +565 -565
- package/tests/unit/components/Core/TickBox.spec.ts +779 -779
- package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -313
- package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
- package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
- package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
- package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +61 -61
- package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
- package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
- package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
- package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
- package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
- package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
- package/tests/unit/components/Icons/Chair.spec.ts +234 -234
- package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
- package/tests/unit/components/Icons/Circle.spec.ts +255 -255
- package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
- package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
- package/tests/unit/components/Icons/Group3.spec.ts +355 -355
- package/tests/unit/components/Icons/Logo.spec.ts +228 -228
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
- package/tests/unit/components/Icons/calendar.spec.ts +286 -286
- package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
- package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
- package/tests/unit/components/Icons/play.spec.ts +308 -308
- package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
- package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
- package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
- package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
- package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
- package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
- package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
- package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
- package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
- package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
- package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
- package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
- package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
- package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
- package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
- package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
- package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
- package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
- package/tests/unit/components/Loader/Loader.spec.ts +197 -197
- package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
- package/tests/unit/constants/iconEnums.spec.ts +39 -39
- package/tests/unit/i18n/i18n.spec.ts +88 -88
- package/tests/unit/plugins/vuetify.spec.ts +220 -220
- package/tests/unit/setup.ts +189 -189
- package/tests/unit/src/components/index.spec.ts.skip +192 -192
- package/tests/unit/src/index.spec.ts.skip +182 -182
- package/tests/unit/src/main.spec.ts +151 -151
- package/tests/unit/utils/accessibility.spec.ts +318 -318
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
|
@@ -1,228 +1,228 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
|
|
4
|
-
|
|
5
|
-
describe('AccordionGroup', () => {
|
|
6
|
-
describe('Default Behavior', () => {
|
|
7
|
-
it('renders with default props', () => {
|
|
8
|
-
const wrapper = mount(AccordionGroup);
|
|
9
|
-
|
|
10
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
11
|
-
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
12
|
-
expect(wrapper.vm.multiple).toBe(false);
|
|
13
|
-
expect(wrapper.vm.variantGroup).toBe('accordion');
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('applies wl-accordion class', () => {
|
|
17
|
-
const wrapper = mount(AccordionGroup);
|
|
18
|
-
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
describe('Props', () => {
|
|
23
|
-
it('accepts modelValue as string', () => {
|
|
24
|
-
const wrapper = mount(AccordionGroup, {
|
|
25
|
-
props: {
|
|
26
|
-
modelValue: 'panel-1'
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
expect(wrapper.vm.modelValue).toBe('panel-1');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('accepts modelValue as number', () => {
|
|
34
|
-
const wrapper = mount(AccordionGroup, {
|
|
35
|
-
props: {
|
|
36
|
-
modelValue: 1
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
expect(wrapper.vm.modelValue).toBe(1);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('accepts modelValue as array for multiple selection', () => {
|
|
44
|
-
const wrapper = mount(AccordionGroup, {
|
|
45
|
-
props: {
|
|
46
|
-
modelValue: ['panel-1', 'panel-2'],
|
|
47
|
-
multiple: true
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
expect(wrapper.vm.modelValue).toEqual(['panel-1', 'panel-2']);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('handles multiple prop', () => {
|
|
55
|
-
const wrapper = mount(AccordionGroup, {
|
|
56
|
-
props: {
|
|
57
|
-
multiple: true
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
expect(wrapper.vm.multiple).toBe(true);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('accepts custom variantGroup', () => {
|
|
65
|
-
const wrapper = mount(AccordionGroup, {
|
|
66
|
-
props: {
|
|
67
|
-
variantGroup: 'inset'
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
expect(wrapper.vm.variantGroup).toBe('inset');
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
describe('v-model Support', () => {
|
|
76
|
-
it('emits update:modelValue when value changes', async () => {
|
|
77
|
-
const wrapper = mount(AccordionGroup, {
|
|
78
|
-
props: {
|
|
79
|
-
modelValue: null,
|
|
80
|
-
'onUpdate:modelValue': (value: string | number | string[] | null) => wrapper.setProps({ modelValue: value })
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Simulate internal value change
|
|
85
|
-
await wrapper.vm.$emit('update:modelValue', 'panel-1');
|
|
86
|
-
|
|
87
|
-
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
88
|
-
expect(wrapper.emitted('update:modelValue')![0]).toEqual(['panel-1']);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('syncs internal value with modelValue', () => {
|
|
92
|
-
const wrapper = mount(AccordionGroup, {
|
|
93
|
-
props: {
|
|
94
|
-
modelValue: 'panel-2'
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
expect(wrapper.vm.modelValue).toBe('panel-2');
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
describe('Slots', () => {
|
|
103
|
-
it('renders slot content', () => {
|
|
104
|
-
const wrapper = mount(AccordionGroup, {
|
|
105
|
-
slots: {
|
|
106
|
-
default: '<div class="test-panel">Panel Content</div>'
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
expect(wrapper.find('.test-panel').exists()).toBe(true);
|
|
111
|
-
expect(wrapper.find('.test-panel').text()).toBe('Panel Content');
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('renders multiple slot items', () => {
|
|
115
|
-
const wrapper = mount(AccordionGroup, {
|
|
116
|
-
slots: {
|
|
117
|
-
default: `
|
|
118
|
-
<div class="panel-1">Panel 1</div>
|
|
119
|
-
<div class="panel-2">Panel 2</div>
|
|
120
|
-
<div class="panel-3">Panel 3</div>
|
|
121
|
-
`
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
expect(wrapper.find('.panel-1').exists()).toBe(true);
|
|
126
|
-
expect(wrapper.find('.panel-2').exists()).toBe(true);
|
|
127
|
-
expect(wrapper.find('.panel-3').exists()).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
describe('Accessibility', () => {
|
|
132
|
-
it('has data-testid for testing', () => {
|
|
133
|
-
const wrapper = mount(AccordionGroup);
|
|
134
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it('has proper ARIA role through Vuetify component', () => {
|
|
138
|
-
const wrapper = mount(AccordionGroup);
|
|
139
|
-
// The accordion group should be accessible through Vuetify's expansion-panels
|
|
140
|
-
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('supports keyboard navigation structure', () => {
|
|
144
|
-
const wrapper = mount(AccordionGroup, {
|
|
145
|
-
slots: {
|
|
146
|
-
default: '<div class="panel">Content</div>'
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
// Accordion groups should be navigable via keyboard
|
|
151
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('maintains focus management for screen readers', () => {
|
|
155
|
-
const wrapper = mount(AccordionGroup);
|
|
156
|
-
|
|
157
|
-
// The component should render properly for assistive technologies
|
|
158
|
-
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
describe('Multiple Selection Mode', () => {
|
|
163
|
-
it('allows single panel open when multiple is false', () => {
|
|
164
|
-
const wrapper = mount(AccordionGroup, {
|
|
165
|
-
props: {
|
|
166
|
-
modelValue: 'panel-1',
|
|
167
|
-
multiple: false
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
expect(wrapper.vm.multiple).toBe(false);
|
|
172
|
-
expect(wrapper.vm.modelValue).toBe('panel-1');
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('allows multiple panels open when multiple is true', () => {
|
|
176
|
-
const wrapper = mount(AccordionGroup, {
|
|
177
|
-
props: {
|
|
178
|
-
modelValue: ['panel-1', 'panel-2'],
|
|
179
|
-
multiple: true
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
expect(wrapper.vm.multiple).toBe(true);
|
|
184
|
-
expect(wrapper.vm.modelValue).toEqual(['panel-1', 'panel-2']);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
describe('Edge Cases', () => {
|
|
189
|
-
it('handles null modelValue', () => {
|
|
190
|
-
const wrapper = mount(AccordionGroup, {
|
|
191
|
-
props: {
|
|
192
|
-
modelValue: null
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
expect(wrapper.vm.modelValue).toBeNull();
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('handles empty array modelValue', () => {
|
|
200
|
-
const wrapper = mount(AccordionGroup, {
|
|
201
|
-
props: {
|
|
202
|
-
modelValue: [],
|
|
203
|
-
multiple: true
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
expect(wrapper.vm.modelValue).toEqual([]);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('handles undefined modelValue', () => {
|
|
211
|
-
const wrapper = mount(AccordionGroup);
|
|
212
|
-
expect(wrapper.vm.modelValue).toBeNull();
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
it('renders correctly with no slot content', () => {
|
|
216
|
-
const wrapper = mount(AccordionGroup);
|
|
217
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
describe('Icon Configuration', () => {
|
|
222
|
-
it('uses heroicons for expand/collapse icons', () => {
|
|
223
|
-
const wrapper = mount(AccordionGroup);
|
|
224
|
-
// Icons are configured through Vuetify's expansion-panels
|
|
225
|
-
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
});
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
|
|
4
|
+
|
|
5
|
+
describe('AccordionGroup', () => {
|
|
6
|
+
describe('Default Behavior', () => {
|
|
7
|
+
it('renders with default props', () => {
|
|
8
|
+
const wrapper = mount(AccordionGroup);
|
|
9
|
+
|
|
10
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
11
|
+
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
12
|
+
expect(wrapper.vm.multiple).toBe(false);
|
|
13
|
+
expect(wrapper.vm.variantGroup).toBe('accordion');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('applies wl-accordion class', () => {
|
|
17
|
+
const wrapper = mount(AccordionGroup);
|
|
18
|
+
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('Props', () => {
|
|
23
|
+
it('accepts modelValue as string', () => {
|
|
24
|
+
const wrapper = mount(AccordionGroup, {
|
|
25
|
+
props: {
|
|
26
|
+
modelValue: 'panel-1'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
expect(wrapper.vm.modelValue).toBe('panel-1');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('accepts modelValue as number', () => {
|
|
34
|
+
const wrapper = mount(AccordionGroup, {
|
|
35
|
+
props: {
|
|
36
|
+
modelValue: 1
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
expect(wrapper.vm.modelValue).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('accepts modelValue as array for multiple selection', () => {
|
|
44
|
+
const wrapper = mount(AccordionGroup, {
|
|
45
|
+
props: {
|
|
46
|
+
modelValue: ['panel-1', 'panel-2'],
|
|
47
|
+
multiple: true
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
expect(wrapper.vm.modelValue).toEqual(['panel-1', 'panel-2']);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('handles multiple prop', () => {
|
|
55
|
+
const wrapper = mount(AccordionGroup, {
|
|
56
|
+
props: {
|
|
57
|
+
multiple: true
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
expect(wrapper.vm.multiple).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('accepts custom variantGroup', () => {
|
|
65
|
+
const wrapper = mount(AccordionGroup, {
|
|
66
|
+
props: {
|
|
67
|
+
variantGroup: 'inset'
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
expect(wrapper.vm.variantGroup).toBe('inset');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('v-model Support', () => {
|
|
76
|
+
it('emits update:modelValue when value changes', async () => {
|
|
77
|
+
const wrapper = mount(AccordionGroup, {
|
|
78
|
+
props: {
|
|
79
|
+
modelValue: null,
|
|
80
|
+
'onUpdate:modelValue': (value: string | number | string[] | null) => wrapper.setProps({ modelValue: value })
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Simulate internal value change
|
|
85
|
+
await wrapper.vm.$emit('update:modelValue', 'panel-1');
|
|
86
|
+
|
|
87
|
+
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
88
|
+
expect(wrapper.emitted('update:modelValue')![0]).toEqual(['panel-1']);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('syncs internal value with modelValue', () => {
|
|
92
|
+
const wrapper = mount(AccordionGroup, {
|
|
93
|
+
props: {
|
|
94
|
+
modelValue: 'panel-2'
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(wrapper.vm.modelValue).toBe('panel-2');
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe('Slots', () => {
|
|
103
|
+
it('renders slot content', () => {
|
|
104
|
+
const wrapper = mount(AccordionGroup, {
|
|
105
|
+
slots: {
|
|
106
|
+
default: '<div class="test-panel">Panel Content</div>'
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(wrapper.find('.test-panel').exists()).toBe(true);
|
|
111
|
+
expect(wrapper.find('.test-panel').text()).toBe('Panel Content');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('renders multiple slot items', () => {
|
|
115
|
+
const wrapper = mount(AccordionGroup, {
|
|
116
|
+
slots: {
|
|
117
|
+
default: `
|
|
118
|
+
<div class="panel-1">Panel 1</div>
|
|
119
|
+
<div class="panel-2">Panel 2</div>
|
|
120
|
+
<div class="panel-3">Panel 3</div>
|
|
121
|
+
`
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
expect(wrapper.find('.panel-1').exists()).toBe(true);
|
|
126
|
+
expect(wrapper.find('.panel-2').exists()).toBe(true);
|
|
127
|
+
expect(wrapper.find('.panel-3').exists()).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('Accessibility', () => {
|
|
132
|
+
it('has data-testid for testing', () => {
|
|
133
|
+
const wrapper = mount(AccordionGroup);
|
|
134
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('has proper ARIA role through Vuetify component', () => {
|
|
138
|
+
const wrapper = mount(AccordionGroup);
|
|
139
|
+
// The accordion group should be accessible through Vuetify's expansion-panels
|
|
140
|
+
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('supports keyboard navigation structure', () => {
|
|
144
|
+
const wrapper = mount(AccordionGroup, {
|
|
145
|
+
slots: {
|
|
146
|
+
default: '<div class="panel">Content</div>'
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Accordion groups should be navigable via keyboard
|
|
151
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('maintains focus management for screen readers', () => {
|
|
155
|
+
const wrapper = mount(AccordionGroup);
|
|
156
|
+
|
|
157
|
+
// The component should render properly for assistive technologies
|
|
158
|
+
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe('Multiple Selection Mode', () => {
|
|
163
|
+
it('allows single panel open when multiple is false', () => {
|
|
164
|
+
const wrapper = mount(AccordionGroup, {
|
|
165
|
+
props: {
|
|
166
|
+
modelValue: 'panel-1',
|
|
167
|
+
multiple: false
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
expect(wrapper.vm.multiple).toBe(false);
|
|
172
|
+
expect(wrapper.vm.modelValue).toBe('panel-1');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('allows multiple panels open when multiple is true', () => {
|
|
176
|
+
const wrapper = mount(AccordionGroup, {
|
|
177
|
+
props: {
|
|
178
|
+
modelValue: ['panel-1', 'panel-2'],
|
|
179
|
+
multiple: true
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
expect(wrapper.vm.multiple).toBe(true);
|
|
184
|
+
expect(wrapper.vm.modelValue).toEqual(['panel-1', 'panel-2']);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('Edge Cases', () => {
|
|
189
|
+
it('handles null modelValue', () => {
|
|
190
|
+
const wrapper = mount(AccordionGroup, {
|
|
191
|
+
props: {
|
|
192
|
+
modelValue: null
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
expect(wrapper.vm.modelValue).toBeNull();
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('handles empty array modelValue', () => {
|
|
200
|
+
const wrapper = mount(AccordionGroup, {
|
|
201
|
+
props: {
|
|
202
|
+
modelValue: [],
|
|
203
|
+
multiple: true
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
expect(wrapper.vm.modelValue).toEqual([]);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('handles undefined modelValue', () => {
|
|
211
|
+
const wrapper = mount(AccordionGroup);
|
|
212
|
+
expect(wrapper.vm.modelValue).toBeNull();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('renders correctly with no slot content', () => {
|
|
216
|
+
const wrapper = mount(AccordionGroup);
|
|
217
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
describe('Icon Configuration', () => {
|
|
222
|
+
it('uses heroicons for expand/collapse icons', () => {
|
|
223
|
+
const wrapper = mount(AccordionGroup);
|
|
224
|
+
// Icons are configured through Vuetify's expansion-panels
|
|
225
|
+
expect(wrapper.find('.wl-accordion').exists()).toBe(true);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
});
|