@zap-wunschlachen/wl-shared-components 1.0.37 → 1.0.38
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 -43
- 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 +232 -232
- package/src/assets/css/variables.css +109 -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/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/calendar.vue +17 -17
- 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/StagingBanner/StagingBanner.css +19 -0
- package/src/components/StagingBanner/StagingBanner.vue +82 -0
- 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 -28
- 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 +109 -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
- package/public/audio/test.aac +0 -0
|
@@ -1,292 +1,292 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import AccordionItem from '@components/Accordion/AccordionItem.vue';
|
|
4
|
-
|
|
5
|
-
describe('AccordionItem', () => {
|
|
6
|
-
describe('Default Behavior', () => {
|
|
7
|
-
it('renders with default props', () => {
|
|
8
|
-
const wrapper = mount(AccordionItem, {
|
|
9
|
-
props: {
|
|
10
|
-
value: 'panel-1'
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
15
|
-
expect(wrapper.vm.title).toBe('Default Title');
|
|
16
|
-
expect(wrapper.vm.text).toBe('Default text');
|
|
17
|
-
expect(wrapper.vm.variant).toBe('outlined');
|
|
18
|
-
expect(wrapper.vm.bgColor).toBe('var(--Soft-Concrete-0)');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('renders with custom title and text', () => {
|
|
22
|
-
const wrapper = mount(AccordionItem, {
|
|
23
|
-
props: {
|
|
24
|
-
value: 'panel-1',
|
|
25
|
-
title: 'Custom Title',
|
|
26
|
-
text: 'Custom content text'
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
expect(wrapper.vm.title).toBe('Custom Title');
|
|
31
|
-
expect(wrapper.vm.text).toBe('Custom content text');
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
describe('Props', () => {
|
|
36
|
-
it('accepts and applies variant prop - outlined', () => {
|
|
37
|
-
const wrapper = mount(AccordionItem, {
|
|
38
|
-
props: {
|
|
39
|
-
value: 'panel-1',
|
|
40
|
-
variant: 'outlined'
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
expect(wrapper.vm.variant).toBe('outlined');
|
|
45
|
-
expect(wrapper.find('.outlined-style').exists()).toBe(true);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('accepts and applies variant prop - plain', () => {
|
|
49
|
-
const wrapper = mount(AccordionItem, {
|
|
50
|
-
props: {
|
|
51
|
-
value: 'panel-1',
|
|
52
|
-
variant: 'plain'
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
expect(wrapper.vm.variant).toBe('plain');
|
|
57
|
-
expect(wrapper.find('.plain-style').exists()).toBe(true);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('accepts string value', () => {
|
|
61
|
-
const wrapper = mount(AccordionItem, {
|
|
62
|
-
props: {
|
|
63
|
-
value: 'string-value'
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
expect(wrapper.vm.value).toBe('string-value');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('accepts number value', () => {
|
|
71
|
-
const wrapper = mount(AccordionItem, {
|
|
72
|
-
props: {
|
|
73
|
-
value: 42
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
expect(wrapper.vm.value).toBe(42);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('accepts custom background color', () => {
|
|
81
|
-
const wrapper = mount(AccordionItem, {
|
|
82
|
-
props: {
|
|
83
|
-
value: 'panel-1',
|
|
84
|
-
bgColor: '#FFFFFF'
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
expect(wrapper.vm.bgColor).toBe('#FFFFFF');
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
describe('Slots', () => {
|
|
93
|
-
it('accepts title slot', () => {
|
|
94
|
-
const wrapper = mount(AccordionItem, {
|
|
95
|
-
props: {
|
|
96
|
-
value: 'panel-1'
|
|
97
|
-
},
|
|
98
|
-
slots: {
|
|
99
|
-
title: '<span class="custom-title">Slot Title</span>'
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
expect(wrapper.find('.custom-title').exists()).toBe(true);
|
|
104
|
-
expect(wrapper.text()).toContain('Slot Title');
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('accepts content slot', () => {
|
|
108
|
-
const wrapper = mount(AccordionItem, {
|
|
109
|
-
props: {
|
|
110
|
-
value: 'panel-1'
|
|
111
|
-
},
|
|
112
|
-
slots: {
|
|
113
|
-
content: '<div class="custom-content">Slot Content</div>'
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
expect(wrapper.find('.custom-content').exists()).toBe(true);
|
|
118
|
-
expect(wrapper.text()).toContain('Slot Content');
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('uses title prop as default content', () => {
|
|
122
|
-
const wrapper = mount(AccordionItem, {
|
|
123
|
-
props: {
|
|
124
|
-
value: 'panel-1',
|
|
125
|
-
title: 'Prop Title'
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
expect(wrapper.vm.title).toBe('Prop Title');
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('uses text prop as default content', () => {
|
|
133
|
-
const wrapper = mount(AccordionItem, {
|
|
134
|
-
props: {
|
|
135
|
-
value: 'panel-1',
|
|
136
|
-
text: 'Prop Text Content'
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
expect(wrapper.vm.text).toBe('Prop Text Content');
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
describe('Accessibility', () => {
|
|
145
|
-
it('has proper ARIA attributes on trigger and panel', async () => {
|
|
146
|
-
const wrapper = mount(AccordionItem, {
|
|
147
|
-
props: {
|
|
148
|
-
value: 'panel-1',
|
|
149
|
-
title: 'Accessible Title',
|
|
150
|
-
text: 'Test Content'
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// Find the interactive trigger (use data-testid or role)
|
|
155
|
-
const trigger = wrapper.find('[data-testid="root"] [role="button"], [data-testid="root"] button, [role="button"]');
|
|
156
|
-
expect(trigger.exists()).toBe(true);
|
|
157
|
-
|
|
158
|
-
// Trigger should expose aria attributes
|
|
159
|
-
const expanded = trigger.attributes('aria-expanded');
|
|
160
|
-
const controls = trigger.attributes('aria-controls');
|
|
161
|
-
const labelled = trigger.attributes('aria-labelledby');
|
|
162
|
-
|
|
163
|
-
expect(expanded).toBeDefined();
|
|
164
|
-
expect(controls).toBeDefined();
|
|
165
|
-
expect(labelled).toBeDefined();
|
|
166
|
-
|
|
167
|
-
// Panel should exist and have role region and matching id
|
|
168
|
-
const panelId = controls || '';
|
|
169
|
-
const panel = panelId ? wrapper.find(`#${panelId}`) : wrapper.find('[role="region"]');
|
|
170
|
-
expect(panel.exists()).toBe(true);
|
|
171
|
-
expect(panel.attributes('role')).toBe('region');
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('toggles expanded state via Enter and Space keys and manages focus', async () => {
|
|
175
|
-
const wrapper = mount(AccordionItem, {
|
|
176
|
-
attachTo: document.body,
|
|
177
|
-
props: {
|
|
178
|
-
value: 'panel-1',
|
|
179
|
-
title: 'Accessible Title',
|
|
180
|
-
text: 'Test Content'
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
const trigger = wrapper.find('[data-testid="root"] [role="button"], [data-testid="root"] button, [role="button"]');
|
|
185
|
-
expect(trigger.exists()).toBe(true);
|
|
186
|
-
|
|
187
|
-
// Initial state should be collapsed
|
|
188
|
-
expect(trigger.attributes('aria-expanded')).toBe('false');
|
|
189
|
-
|
|
190
|
-
// Press Enter to expand
|
|
191
|
-
await trigger.trigger('keydown.enter');
|
|
192
|
-
await wrapper.vm.$nextTick();
|
|
193
|
-
|
|
194
|
-
expect(trigger.attributes('aria-expanded')).toBe('true');
|
|
195
|
-
|
|
196
|
-
// Focus should remain or move to trigger; ensure trigger is focused
|
|
197
|
-
trigger.element.focus();
|
|
198
|
-
expect(document.activeElement).toBe(trigger.element);
|
|
199
|
-
|
|
200
|
-
// Press Space to collapse
|
|
201
|
-
await trigger.trigger('keydown.space');
|
|
202
|
-
await wrapper.vm.$nextTick();
|
|
203
|
-
|
|
204
|
-
expect(trigger.attributes('aria-expanded')).toBe('false');
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
describe('Edge Cases', () => {
|
|
209
|
-
it('handles empty title', () => {
|
|
210
|
-
const wrapper = mount(AccordionItem, {
|
|
211
|
-
props: {
|
|
212
|
-
value: 'panel-1',
|
|
213
|
-
title: ''
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
expect(wrapper.vm.title).toBe('');
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it('handles empty text', () => {
|
|
221
|
-
const wrapper = mount(AccordionItem, {
|
|
222
|
-
props: {
|
|
223
|
-
value: 'panel-1',
|
|
224
|
-
text: ''
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
expect(wrapper.vm.text).toBe('');
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it('handles very long title text', () => {
|
|
232
|
-
const longTitle = 'A'.repeat(500);
|
|
233
|
-
const wrapper = mount(AccordionItem, {
|
|
234
|
-
props: {
|
|
235
|
-
value: 'panel-1',
|
|
236
|
-
title: longTitle
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
expect(wrapper.vm.title).toBe(longTitle);
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('handles special characters in title and text', () => {
|
|
244
|
-
const wrapper = mount(AccordionItem, {
|
|
245
|
-
props: {
|
|
246
|
-
value: 'panel-1',
|
|
247
|
-
title: 'Title with <special> & "characters"',
|
|
248
|
-
text: 'Content with äöü ñ émojis 🎉'
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
expect(wrapper.vm.title).toBe('Title with <special> & "characters"');
|
|
253
|
-
expect(wrapper.vm.text).toBe('Content with äöü ñ émojis 🎉');
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
it('handles value of 0', () => {
|
|
257
|
-
const wrapper = mount(AccordionItem, {
|
|
258
|
-
props: {
|
|
259
|
-
value: 0
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
expect(wrapper.vm.value).toBe(0);
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
describe('Variant Styling', () => {
|
|
268
|
-
it('applies outlined-style class for outlined variant', () => {
|
|
269
|
-
const wrapper = mount(AccordionItem, {
|
|
270
|
-
props: {
|
|
271
|
-
value: 'panel-1',
|
|
272
|
-
variant: 'outlined'
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
expect(wrapper.find('.outlined-style').exists()).toBe(true);
|
|
277
|
-
expect(wrapper.find('.plain-style').exists()).toBe(false);
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
it('applies plain-style class for plain variant', () => {
|
|
281
|
-
const wrapper = mount(AccordionItem, {
|
|
282
|
-
props: {
|
|
283
|
-
value: 'panel-1',
|
|
284
|
-
variant: 'plain'
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
expect(wrapper.find('.plain-style').exists()).toBe(true);
|
|
289
|
-
expect(wrapper.find('.outlined-style').exists()).toBe(false);
|
|
290
|
-
});
|
|
291
|
-
});
|
|
292
|
-
});
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import AccordionItem from '@components/Accordion/AccordionItem.vue';
|
|
4
|
+
|
|
5
|
+
describe('AccordionItem', () => {
|
|
6
|
+
describe('Default Behavior', () => {
|
|
7
|
+
it('renders with default props', () => {
|
|
8
|
+
const wrapper = mount(AccordionItem, {
|
|
9
|
+
props: {
|
|
10
|
+
value: 'panel-1'
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
15
|
+
expect(wrapper.vm.title).toBe('Default Title');
|
|
16
|
+
expect(wrapper.vm.text).toBe('Default text');
|
|
17
|
+
expect(wrapper.vm.variant).toBe('outlined');
|
|
18
|
+
expect(wrapper.vm.bgColor).toBe('var(--Soft-Concrete-0)');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('renders with custom title and text', () => {
|
|
22
|
+
const wrapper = mount(AccordionItem, {
|
|
23
|
+
props: {
|
|
24
|
+
value: 'panel-1',
|
|
25
|
+
title: 'Custom Title',
|
|
26
|
+
text: 'Custom content text'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
expect(wrapper.vm.title).toBe('Custom Title');
|
|
31
|
+
expect(wrapper.vm.text).toBe('Custom content text');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('Props', () => {
|
|
36
|
+
it('accepts and applies variant prop - outlined', () => {
|
|
37
|
+
const wrapper = mount(AccordionItem, {
|
|
38
|
+
props: {
|
|
39
|
+
value: 'panel-1',
|
|
40
|
+
variant: 'outlined'
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
expect(wrapper.vm.variant).toBe('outlined');
|
|
45
|
+
expect(wrapper.find('.outlined-style').exists()).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('accepts and applies variant prop - plain', () => {
|
|
49
|
+
const wrapper = mount(AccordionItem, {
|
|
50
|
+
props: {
|
|
51
|
+
value: 'panel-1',
|
|
52
|
+
variant: 'plain'
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
expect(wrapper.vm.variant).toBe('plain');
|
|
57
|
+
expect(wrapper.find('.plain-style').exists()).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('accepts string value', () => {
|
|
61
|
+
const wrapper = mount(AccordionItem, {
|
|
62
|
+
props: {
|
|
63
|
+
value: 'string-value'
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
expect(wrapper.vm.value).toBe('string-value');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('accepts number value', () => {
|
|
71
|
+
const wrapper = mount(AccordionItem, {
|
|
72
|
+
props: {
|
|
73
|
+
value: 42
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
expect(wrapper.vm.value).toBe(42);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('accepts custom background color', () => {
|
|
81
|
+
const wrapper = mount(AccordionItem, {
|
|
82
|
+
props: {
|
|
83
|
+
value: 'panel-1',
|
|
84
|
+
bgColor: '#FFFFFF'
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
expect(wrapper.vm.bgColor).toBe('#FFFFFF');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe('Slots', () => {
|
|
93
|
+
it('accepts title slot', () => {
|
|
94
|
+
const wrapper = mount(AccordionItem, {
|
|
95
|
+
props: {
|
|
96
|
+
value: 'panel-1'
|
|
97
|
+
},
|
|
98
|
+
slots: {
|
|
99
|
+
title: '<span class="custom-title">Slot Title</span>'
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
expect(wrapper.find('.custom-title').exists()).toBe(true);
|
|
104
|
+
expect(wrapper.text()).toContain('Slot Title');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('accepts content slot', () => {
|
|
108
|
+
const wrapper = mount(AccordionItem, {
|
|
109
|
+
props: {
|
|
110
|
+
value: 'panel-1'
|
|
111
|
+
},
|
|
112
|
+
slots: {
|
|
113
|
+
content: '<div class="custom-content">Slot Content</div>'
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
expect(wrapper.find('.custom-content').exists()).toBe(true);
|
|
118
|
+
expect(wrapper.text()).toContain('Slot Content');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('uses title prop as default content', () => {
|
|
122
|
+
const wrapper = mount(AccordionItem, {
|
|
123
|
+
props: {
|
|
124
|
+
value: 'panel-1',
|
|
125
|
+
title: 'Prop Title'
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
expect(wrapper.vm.title).toBe('Prop Title');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('uses text prop as default content', () => {
|
|
133
|
+
const wrapper = mount(AccordionItem, {
|
|
134
|
+
props: {
|
|
135
|
+
value: 'panel-1',
|
|
136
|
+
text: 'Prop Text Content'
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(wrapper.vm.text).toBe('Prop Text Content');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe('Accessibility', () => {
|
|
145
|
+
it('has proper ARIA attributes on trigger and panel', async () => {
|
|
146
|
+
const wrapper = mount(AccordionItem, {
|
|
147
|
+
props: {
|
|
148
|
+
value: 'panel-1',
|
|
149
|
+
title: 'Accessible Title',
|
|
150
|
+
text: 'Test Content'
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// Find the interactive trigger (use data-testid or role)
|
|
155
|
+
const trigger = wrapper.find('[data-testid="root"] [role="button"], [data-testid="root"] button, [role="button"]');
|
|
156
|
+
expect(trigger.exists()).toBe(true);
|
|
157
|
+
|
|
158
|
+
// Trigger should expose aria attributes
|
|
159
|
+
const expanded = trigger.attributes('aria-expanded');
|
|
160
|
+
const controls = trigger.attributes('aria-controls');
|
|
161
|
+
const labelled = trigger.attributes('aria-labelledby');
|
|
162
|
+
|
|
163
|
+
expect(expanded).toBeDefined();
|
|
164
|
+
expect(controls).toBeDefined();
|
|
165
|
+
expect(labelled).toBeDefined();
|
|
166
|
+
|
|
167
|
+
// Panel should exist and have role region and matching id
|
|
168
|
+
const panelId = controls || '';
|
|
169
|
+
const panel = panelId ? wrapper.find(`#${panelId}`) : wrapper.find('[role="region"]');
|
|
170
|
+
expect(panel.exists()).toBe(true);
|
|
171
|
+
expect(panel.attributes('role')).toBe('region');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('toggles expanded state via Enter and Space keys and manages focus', async () => {
|
|
175
|
+
const wrapper = mount(AccordionItem, {
|
|
176
|
+
attachTo: document.body,
|
|
177
|
+
props: {
|
|
178
|
+
value: 'panel-1',
|
|
179
|
+
title: 'Accessible Title',
|
|
180
|
+
text: 'Test Content'
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const trigger = wrapper.find('[data-testid="root"] [role="button"], [data-testid="root"] button, [role="button"]');
|
|
185
|
+
expect(trigger.exists()).toBe(true);
|
|
186
|
+
|
|
187
|
+
// Initial state should be collapsed
|
|
188
|
+
expect(trigger.attributes('aria-expanded')).toBe('false');
|
|
189
|
+
|
|
190
|
+
// Press Enter to expand
|
|
191
|
+
await trigger.trigger('keydown.enter');
|
|
192
|
+
await wrapper.vm.$nextTick();
|
|
193
|
+
|
|
194
|
+
expect(trigger.attributes('aria-expanded')).toBe('true');
|
|
195
|
+
|
|
196
|
+
// Focus should remain or move to trigger; ensure trigger is focused
|
|
197
|
+
trigger.element.focus();
|
|
198
|
+
expect(document.activeElement).toBe(trigger.element);
|
|
199
|
+
|
|
200
|
+
// Press Space to collapse
|
|
201
|
+
await trigger.trigger('keydown.space');
|
|
202
|
+
await wrapper.vm.$nextTick();
|
|
203
|
+
|
|
204
|
+
expect(trigger.attributes('aria-expanded')).toBe('false');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe('Edge Cases', () => {
|
|
209
|
+
it('handles empty title', () => {
|
|
210
|
+
const wrapper = mount(AccordionItem, {
|
|
211
|
+
props: {
|
|
212
|
+
value: 'panel-1',
|
|
213
|
+
title: ''
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
expect(wrapper.vm.title).toBe('');
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it('handles empty text', () => {
|
|
221
|
+
const wrapper = mount(AccordionItem, {
|
|
222
|
+
props: {
|
|
223
|
+
value: 'panel-1',
|
|
224
|
+
text: ''
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
expect(wrapper.vm.text).toBe('');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('handles very long title text', () => {
|
|
232
|
+
const longTitle = 'A'.repeat(500);
|
|
233
|
+
const wrapper = mount(AccordionItem, {
|
|
234
|
+
props: {
|
|
235
|
+
value: 'panel-1',
|
|
236
|
+
title: longTitle
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
expect(wrapper.vm.title).toBe(longTitle);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it('handles special characters in title and text', () => {
|
|
244
|
+
const wrapper = mount(AccordionItem, {
|
|
245
|
+
props: {
|
|
246
|
+
value: 'panel-1',
|
|
247
|
+
title: 'Title with <special> & "characters"',
|
|
248
|
+
text: 'Content with äöü ñ émojis 🎉'
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
expect(wrapper.vm.title).toBe('Title with <special> & "characters"');
|
|
253
|
+
expect(wrapper.vm.text).toBe('Content with äöü ñ émojis 🎉');
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it('handles value of 0', () => {
|
|
257
|
+
const wrapper = mount(AccordionItem, {
|
|
258
|
+
props: {
|
|
259
|
+
value: 0
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
expect(wrapper.vm.value).toBe(0);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
describe('Variant Styling', () => {
|
|
268
|
+
it('applies outlined-style class for outlined variant', () => {
|
|
269
|
+
const wrapper = mount(AccordionItem, {
|
|
270
|
+
props: {
|
|
271
|
+
value: 'panel-1',
|
|
272
|
+
variant: 'outlined'
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
expect(wrapper.find('.outlined-style').exists()).toBe(true);
|
|
277
|
+
expect(wrapper.find('.plain-style').exists()).toBe(false);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('applies plain-style class for plain variant', () => {
|
|
281
|
+
const wrapper = mount(AccordionItem, {
|
|
282
|
+
props: {
|
|
283
|
+
value: 'panel-1',
|
|
284
|
+
variant: 'plain'
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
expect(wrapper.find('.plain-style').exists()).toBe(true);
|
|
289
|
+
expect(wrapper.find('.outlined-style').exists()).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|