@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,176 +1,176 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import AnamneseNotification from '@components/Appointment/Card/AnamneseNotification.vue';
|
|
4
|
-
|
|
5
|
-
// Mock vue-i18n
|
|
6
|
-
vi.mock('vue-i18n', () => ({
|
|
7
|
-
useI18n: () => ({
|
|
8
|
-
t: (key: string) => {
|
|
9
|
-
const translations: Record<string, string> = {
|
|
10
|
-
'wl.appointment_card.fill_form_title': 'Bitte füllen Sie das Formular aus',
|
|
11
|
-
'wl.appointment_card.fill_form_description': 'Vor Ihrem Termin bitten wir Sie, den Anamnesebogen auszufüllen.',
|
|
12
|
-
'wl.appointment_card.anamnese_form': 'Anamnesebogen ausfüllen'
|
|
13
|
-
};
|
|
14
|
-
return translations[key] || key;
|
|
15
|
-
}
|
|
16
|
-
})
|
|
17
|
-
}));
|
|
18
|
-
|
|
19
|
-
// Mock Button component
|
|
20
|
-
vi.mock('@components/Button/Button.vue', () => ({
|
|
21
|
-
default: {
|
|
22
|
-
name: 'Button',
|
|
23
|
-
template: '<button class="wl-button" @click="$emit(\'click\')">{{ label }}</button>',
|
|
24
|
-
props: ['variant', 'label'],
|
|
25
|
-
emits: ['click']
|
|
26
|
-
}
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
describe('AnamneseNotification', () => {
|
|
30
|
-
describe('Default Behavior', () => {
|
|
31
|
-
it('renders notification container', () => {
|
|
32
|
-
const wrapper = mount(AnamneseNotification);
|
|
33
|
-
expect(wrapper.find('.main-container').exists()).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('renders title text', () => {
|
|
37
|
-
const wrapper = mount(AnamneseNotification);
|
|
38
|
-
expect(wrapper.text()).toContain('Bitte füllen Sie das Formular aus');
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('renders description text', () => {
|
|
42
|
-
const wrapper = mount(AnamneseNotification);
|
|
43
|
-
expect(wrapper.text()).toContain('Vor Ihrem Termin bitten wir Sie');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('renders action button', () => {
|
|
47
|
-
const wrapper = mount(AnamneseNotification);
|
|
48
|
-
const button = wrapper.find('.wl-button');
|
|
49
|
-
expect(button.exists()).toBe(true);
|
|
50
|
-
expect(button.text()).toBe('Anamnesebogen ausfüllen');
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe('Events', () => {
|
|
55
|
-
it('emits fillAnamnese event on button click', async () => {
|
|
56
|
-
const wrapper = mount(AnamneseNotification);
|
|
57
|
-
|
|
58
|
-
const button = wrapper.find('button');
|
|
59
|
-
await button.trigger('click');
|
|
60
|
-
|
|
61
|
-
expect(wrapper.emitted('fillAnamnese')).toBeTruthy();
|
|
62
|
-
expect(wrapper.emitted('fillAnamnese')!.length).toBe(1);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('emits fillAnamnese event multiple times on multiple clicks', async () => {
|
|
66
|
-
const wrapper = mount(AnamneseNotification);
|
|
67
|
-
|
|
68
|
-
const button = wrapper.find('button');
|
|
69
|
-
await button.trigger('click');
|
|
70
|
-
await button.trigger('click');
|
|
71
|
-
await button.trigger('click');
|
|
72
|
-
|
|
73
|
-
expect(wrapper.emitted('fillAnamnese')).toBeTruthy();
|
|
74
|
-
expect(wrapper.emitted('fillAnamnese')!.length).toBe(3);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
describe('Accessibility', () => {
|
|
79
|
-
it('has proper text hierarchy', () => {
|
|
80
|
-
const wrapper = mount(AnamneseNotification);
|
|
81
|
-
|
|
82
|
-
const paragraphs = wrapper.findAll('p');
|
|
83
|
-
expect(paragraphs.length).toBeGreaterThanOrEqual(1);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('has accessible button', () => {
|
|
87
|
-
const wrapper = mount(AnamneseNotification);
|
|
88
|
-
|
|
89
|
-
const button = wrapper.find('button');
|
|
90
|
-
expect(button.exists()).toBe(true);
|
|
91
|
-
expect(button.text()).toBeTruthy();
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('provides meaningful content for screen readers', () => {
|
|
95
|
-
const wrapper = mount(AnamneseNotification);
|
|
96
|
-
|
|
97
|
-
// Title should be clear
|
|
98
|
-
expect(wrapper.text()).toContain('Bitte füllen Sie das Formular aus');
|
|
99
|
-
|
|
100
|
-
// Description should provide context
|
|
101
|
-
expect(wrapper.text()).toContain('Anamnesebogen');
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('has proper text container structure', () => {
|
|
105
|
-
const wrapper = mount(AnamneseNotification);
|
|
106
|
-
|
|
107
|
-
expect(wrapper.find('.text-container').exists()).toBe(true);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('description has smaller text class', () => {
|
|
111
|
-
const wrapper = mount(AnamneseNotification);
|
|
112
|
-
|
|
113
|
-
expect(wrapper.find('.p-small').exists()).toBe(true);
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
describe('Visual Structure', () => {
|
|
118
|
-
it('has main container', () => {
|
|
119
|
-
const wrapper = mount(AnamneseNotification);
|
|
120
|
-
expect(wrapper.find('.main-container').exists()).toBe(true);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('has text container', () => {
|
|
124
|
-
const wrapper = mount(AnamneseNotification);
|
|
125
|
-
expect(wrapper.find('.text-container').exists()).toBe(true);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('button is outside text container', () => {
|
|
129
|
-
const wrapper = mount(AnamneseNotification);
|
|
130
|
-
|
|
131
|
-
const textContainer = wrapper.find('.text-container');
|
|
132
|
-
const button = textContainer.find('button');
|
|
133
|
-
|
|
134
|
-
// Button should not be inside text container
|
|
135
|
-
expect(button.exists()).toBe(false);
|
|
136
|
-
|
|
137
|
-
// But should exist in main container
|
|
138
|
-
expect(wrapper.find('button').exists()).toBe(true);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('uses translation for title', () => {
|
|
143
|
-
const wrapper = mount(AnamneseNotification);
|
|
144
|
-
|
|
145
|
-
const paragraphs = wrapper.findAll('p');
|
|
146
|
-
expect(paragraphs.length).toBeGreaterThan(0);
|
|
147
|
-
expect(paragraphs[0].text()).toBe('Bitte füllen Sie das Formular aus');
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('uses translation for description', () => {
|
|
152
|
-
const wrapper = mount(AnamneseNotification);
|
|
153
|
-
|
|
154
|
-
const smallP = wrapper.find('.p-small');
|
|
155
|
-
expect(smallP.text()).toContain('Anamnesebogen');
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('uses translation for button label', () => {
|
|
159
|
-
const wrapper = mount(AnamneseNotification);
|
|
160
|
-
|
|
161
|
-
const button = wrapper.find('.wl-button');
|
|
162
|
-
expect(button.text()).toBe('Anamnesebogen ausfüllen');
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
describe('Button Configuration', () => {
|
|
167
|
-
it('button has outlined variant', () => {
|
|
168
|
-
const wrapper = mount(AnamneseNotification);
|
|
169
|
-
|
|
170
|
-
// Button component receives variant prop
|
|
171
|
-
const buttonComponent = wrapper.findComponent({ name: 'Button' });
|
|
172
|
-
expect(buttonComponent.exists()).toBe(true);
|
|
173
|
-
expect(buttonComponent.props('variant')).toBe('outlined');
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
});
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import AnamneseNotification from '@components/Appointment/Card/AnamneseNotification.vue';
|
|
4
|
+
|
|
5
|
+
// Mock vue-i18n
|
|
6
|
+
vi.mock('vue-i18n', () => ({
|
|
7
|
+
useI18n: () => ({
|
|
8
|
+
t: (key: string) => {
|
|
9
|
+
const translations: Record<string, string> = {
|
|
10
|
+
'wl.appointment_card.fill_form_title': 'Bitte füllen Sie das Formular aus',
|
|
11
|
+
'wl.appointment_card.fill_form_description': 'Vor Ihrem Termin bitten wir Sie, den Anamnesebogen auszufüllen.',
|
|
12
|
+
'wl.appointment_card.anamnese_form': 'Anamnesebogen ausfüllen'
|
|
13
|
+
};
|
|
14
|
+
return translations[key] || key;
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
// Mock Button component
|
|
20
|
+
vi.mock('@components/Button/Button.vue', () => ({
|
|
21
|
+
default: {
|
|
22
|
+
name: 'Button',
|
|
23
|
+
template: '<button class="wl-button" @click="$emit(\'click\')">{{ label }}</button>',
|
|
24
|
+
props: ['variant', 'label'],
|
|
25
|
+
emits: ['click']
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
describe('AnamneseNotification', () => {
|
|
30
|
+
describe('Default Behavior', () => {
|
|
31
|
+
it('renders notification container', () => {
|
|
32
|
+
const wrapper = mount(AnamneseNotification);
|
|
33
|
+
expect(wrapper.find('.main-container').exists()).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('renders title text', () => {
|
|
37
|
+
const wrapper = mount(AnamneseNotification);
|
|
38
|
+
expect(wrapper.text()).toContain('Bitte füllen Sie das Formular aus');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('renders description text', () => {
|
|
42
|
+
const wrapper = mount(AnamneseNotification);
|
|
43
|
+
expect(wrapper.text()).toContain('Vor Ihrem Termin bitten wir Sie');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('renders action button', () => {
|
|
47
|
+
const wrapper = mount(AnamneseNotification);
|
|
48
|
+
const button = wrapper.find('.wl-button');
|
|
49
|
+
expect(button.exists()).toBe(true);
|
|
50
|
+
expect(button.text()).toBe('Anamnesebogen ausfüllen');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe('Events', () => {
|
|
55
|
+
it('emits fillAnamnese event on button click', async () => {
|
|
56
|
+
const wrapper = mount(AnamneseNotification);
|
|
57
|
+
|
|
58
|
+
const button = wrapper.find('button');
|
|
59
|
+
await button.trigger('click');
|
|
60
|
+
|
|
61
|
+
expect(wrapper.emitted('fillAnamnese')).toBeTruthy();
|
|
62
|
+
expect(wrapper.emitted('fillAnamnese')!.length).toBe(1);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('emits fillAnamnese event multiple times on multiple clicks', async () => {
|
|
66
|
+
const wrapper = mount(AnamneseNotification);
|
|
67
|
+
|
|
68
|
+
const button = wrapper.find('button');
|
|
69
|
+
await button.trigger('click');
|
|
70
|
+
await button.trigger('click');
|
|
71
|
+
await button.trigger('click');
|
|
72
|
+
|
|
73
|
+
expect(wrapper.emitted('fillAnamnese')).toBeTruthy();
|
|
74
|
+
expect(wrapper.emitted('fillAnamnese')!.length).toBe(3);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('Accessibility', () => {
|
|
79
|
+
it('has proper text hierarchy', () => {
|
|
80
|
+
const wrapper = mount(AnamneseNotification);
|
|
81
|
+
|
|
82
|
+
const paragraphs = wrapper.findAll('p');
|
|
83
|
+
expect(paragraphs.length).toBeGreaterThanOrEqual(1);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('has accessible button', () => {
|
|
87
|
+
const wrapper = mount(AnamneseNotification);
|
|
88
|
+
|
|
89
|
+
const button = wrapper.find('button');
|
|
90
|
+
expect(button.exists()).toBe(true);
|
|
91
|
+
expect(button.text()).toBeTruthy();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('provides meaningful content for screen readers', () => {
|
|
95
|
+
const wrapper = mount(AnamneseNotification);
|
|
96
|
+
|
|
97
|
+
// Title should be clear
|
|
98
|
+
expect(wrapper.text()).toContain('Bitte füllen Sie das Formular aus');
|
|
99
|
+
|
|
100
|
+
// Description should provide context
|
|
101
|
+
expect(wrapper.text()).toContain('Anamnesebogen');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('has proper text container structure', () => {
|
|
105
|
+
const wrapper = mount(AnamneseNotification);
|
|
106
|
+
|
|
107
|
+
expect(wrapper.find('.text-container').exists()).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('description has smaller text class', () => {
|
|
111
|
+
const wrapper = mount(AnamneseNotification);
|
|
112
|
+
|
|
113
|
+
expect(wrapper.find('.p-small').exists()).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe('Visual Structure', () => {
|
|
118
|
+
it('has main container', () => {
|
|
119
|
+
const wrapper = mount(AnamneseNotification);
|
|
120
|
+
expect(wrapper.find('.main-container').exists()).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('has text container', () => {
|
|
124
|
+
const wrapper = mount(AnamneseNotification);
|
|
125
|
+
expect(wrapper.find('.text-container').exists()).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('button is outside text container', () => {
|
|
129
|
+
const wrapper = mount(AnamneseNotification);
|
|
130
|
+
|
|
131
|
+
const textContainer = wrapper.find('.text-container');
|
|
132
|
+
const button = textContainer.find('button');
|
|
133
|
+
|
|
134
|
+
// Button should not be inside text container
|
|
135
|
+
expect(button.exists()).toBe(false);
|
|
136
|
+
|
|
137
|
+
// But should exist in main container
|
|
138
|
+
expect(wrapper.find('button').exists()).toBe(true);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('uses translation for title', () => {
|
|
143
|
+
const wrapper = mount(AnamneseNotification);
|
|
144
|
+
|
|
145
|
+
const paragraphs = wrapper.findAll('p');
|
|
146
|
+
expect(paragraphs.length).toBeGreaterThan(0);
|
|
147
|
+
expect(paragraphs[0].text()).toBe('Bitte füllen Sie das Formular aus');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('uses translation for description', () => {
|
|
152
|
+
const wrapper = mount(AnamneseNotification);
|
|
153
|
+
|
|
154
|
+
const smallP = wrapper.find('.p-small');
|
|
155
|
+
expect(smallP.text()).toContain('Anamnesebogen');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('uses translation for button label', () => {
|
|
159
|
+
const wrapper = mount(AnamneseNotification);
|
|
160
|
+
|
|
161
|
+
const button = wrapper.find('.wl-button');
|
|
162
|
+
expect(button.text()).toBe('Anamnesebogen ausfüllen');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('Button Configuration', () => {
|
|
167
|
+
it('button has outlined variant', () => {
|
|
168
|
+
const wrapper = mount(AnamneseNotification);
|
|
169
|
+
|
|
170
|
+
// Button component receives variant prop
|
|
171
|
+
const buttonComponent = wrapper.findComponent({ name: 'Button' });
|
|
172
|
+
expect(buttonComponent.exists()).toBe(true);
|
|
173
|
+
expect(buttonComponent.props('variant')).toBe('outlined');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|