@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,229 +1,229 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
-
import DocumentCard from '../../../../src/components/Laboratory/DocumentCard/DocumentCard.vue';
|
|
4
|
-
|
|
5
|
-
describe('DocumentCard', () => {
|
|
6
|
-
let wrapper: VueWrapper;
|
|
7
|
-
|
|
8
|
-
const defaultProps = {
|
|
9
|
-
title: 'Test Documents',
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
wrapper = mount(DocumentCard, {
|
|
14
|
-
props: defaultProps,
|
|
15
|
-
global: {
|
|
16
|
-
stubs: {
|
|
17
|
-
'Button': {
|
|
18
|
-
template: '<button data-testid="download-button" @click="$emit(\'click\')">{{ label }}</button>',
|
|
19
|
-
props: ['label', 'color', 'variant']
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
describe('Component Rendering', () => {
|
|
27
|
-
it('should render the component', () => {
|
|
28
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
29
|
-
expect(wrapper.find('.document-card').exists()).toBe(true);
|
|
30
|
-
expect(wrapper.find('.v-card').exists()).toBe(true);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should display the title', () => {
|
|
34
|
-
expect(wrapper.text()).toContain('Test Documents');
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('should render download all button', () => {
|
|
38
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
39
|
-
expect(button.exists()).toBe(true);
|
|
40
|
-
expect(button.text()).toBe('Download all');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should have slot for content', () => {
|
|
44
|
-
const contentContainer = wrapper.find('.d-flex.flex-column.ga-4');
|
|
45
|
-
expect(contentContainer.exists()).toBe(true);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe('Props', () => {
|
|
50
|
-
it('should use default title when not provided', async () => {
|
|
51
|
-
await wrapper.setProps({ title: undefined });
|
|
52
|
-
expect(wrapper.text()).toContain('Attachments');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should accept custom title', async () => {
|
|
56
|
-
await wrapper.setProps({ title: 'Custom Documents' });
|
|
57
|
-
expect(wrapper.text()).toContain('Custom Documents');
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('should update title when prop changes', async () => {
|
|
61
|
-
await wrapper.setProps({ title: 'Updated Title' });
|
|
62
|
-
expect(wrapper.text()).toContain('Updated Title');
|
|
63
|
-
expect(wrapper.text()).not.toContain('Test Documents');
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('Events', () => {
|
|
68
|
-
it('should emit download:all when download button is clicked', async () => {
|
|
69
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
70
|
-
await button.trigger('click');
|
|
71
|
-
|
|
72
|
-
expect(wrapper.emitted('download:all')).toBeTruthy();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('should call handleDownloadAll method when button is clicked', async () => {
|
|
76
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
77
|
-
await button.trigger('click');
|
|
78
|
-
|
|
79
|
-
expect(wrapper.emitted('download:all')).toBeTruthy();
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe('Slot Content', () => {
|
|
84
|
-
it('should render slot content', () => {
|
|
85
|
-
const wrapperWithSlot = mount(DocumentCard, {
|
|
86
|
-
props: defaultProps,
|
|
87
|
-
slots: {
|
|
88
|
-
default: '<div data-testid="slot-content">Custom Slot Content</div>'
|
|
89
|
-
},
|
|
90
|
-
global: {
|
|
91
|
-
stubs: {
|
|
92
|
-
'Button': {
|
|
93
|
-
template: '<button @click="$emit(\'click\')" data-testid="download-button">{{ label }}</button>',
|
|
94
|
-
props: ['label', 'color', 'variant']
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
expect(wrapperWithSlot.find('[data-testid="slot-content"]').exists()).toBe(true);
|
|
101
|
-
expect(wrapperWithSlot.text()).toContain('Custom Slot Content');
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('should render multiple slot items', () => {
|
|
105
|
-
const wrapperWithSlots = mount(DocumentCard, {
|
|
106
|
-
props: defaultProps,
|
|
107
|
-
slots: {
|
|
108
|
-
default: `
|
|
109
|
-
<div data-testid="slot-item-1">Item 1</div>
|
|
110
|
-
<div data-testid="slot-item-2">Item 2</div>
|
|
111
|
-
<div data-testid="slot-item-3">Item 3</div>
|
|
112
|
-
`
|
|
113
|
-
},
|
|
114
|
-
global: {
|
|
115
|
-
stubs: {
|
|
116
|
-
'Button': {
|
|
117
|
-
template: '<button @click="$emit(\'click\')" data-testid="download-button">{{ label }}</button>',
|
|
118
|
-
props: ['label', 'color', 'variant']
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
expect(wrapperWithSlots.find('[data-testid="slot-item-1"]').exists()).toBe(true);
|
|
125
|
-
expect(wrapperWithSlots.find('[data-testid="slot-item-2"]').exists()).toBe(true);
|
|
126
|
-
expect(wrapperWithSlots.find('[data-testid="slot-item-3"]').exists()).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe('Card Properties', () => {
|
|
131
|
-
it('should have correct card elevation', () => {
|
|
132
|
-
const card = wrapper.find('.v-card');
|
|
133
|
-
expect(card.exists()).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('should have correct card rounded property', () => {
|
|
137
|
-
const card = wrapper.find('.v-card');
|
|
138
|
-
expect(card.exists()).toBe(true);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('should have document-card class', () => {
|
|
142
|
-
const card = wrapper.find('.v-card');
|
|
143
|
-
expect(card.classes()).toContain('document-card');
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe('Button Properties', () => {
|
|
148
|
-
it('should have correct button styling', () => {
|
|
149
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
150
|
-
expect(button.exists()).toBe(true);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('should have download all as button text', () => {
|
|
154
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
155
|
-
expect(button.text()).toBe('Download all');
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
describe('Layout and Structure', () => {
|
|
160
|
-
it('should have correct title layout', () => {
|
|
161
|
-
const titleContainer = wrapper.find('.d-flex.flex-row.align-center');
|
|
162
|
-
expect(titleContainer.exists()).toBe(true);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('should have title with mr-auto class', () => {
|
|
166
|
-
const title = wrapper.find('h4.mr-auto');
|
|
167
|
-
expect(title.exists()).toBe(true);
|
|
168
|
-
expect(title.text()).toBe('Test Documents');
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('should have correct content layout', () => {
|
|
172
|
-
const contentContainer = wrapper.find('.d-flex.flex-column.ga-4');
|
|
173
|
-
expect(contentContainer.exists()).toBe(true);
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
describe('Title Variations', () => {
|
|
178
|
-
it('should handle long titles', async () => {
|
|
179
|
-
const longTitle = 'This is a very long title for testing how the component handles lengthy titles';
|
|
180
|
-
await wrapper.setProps({ title: longTitle });
|
|
181
|
-
expect(wrapper.text()).toContain(longTitle);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('should handle empty title', async () => {
|
|
185
|
-
await wrapper.setProps({ title: '' });
|
|
186
|
-
const title = wrapper.find('h4');
|
|
187
|
-
expect(title.text()).toBe('');
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('should handle title with special characters', async () => {
|
|
191
|
-
const specialTitle = 'Documents & Attachments (2024) - Test #1';
|
|
192
|
-
await wrapper.setProps({ title: specialTitle });
|
|
193
|
-
expect(wrapper.text()).toContain(specialTitle);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
describe('Event Handling', () => {
|
|
198
|
-
it('should handle multiple download button clicks', async () => {
|
|
199
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
200
|
-
|
|
201
|
-
await button.trigger('click');
|
|
202
|
-
await button.trigger('click');
|
|
203
|
-
await button.trigger('click');
|
|
204
|
-
|
|
205
|
-
// Due to event bubbling in the test environment, each click triggers twice
|
|
206
|
-
expect(wrapper.emitted('download:all')).toHaveLength(6); // 3 clicks * 2 events each
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it('should emit event with correct event name', async () => {
|
|
210
|
-
const button = wrapper.find('[data-testid="download-button"]');
|
|
211
|
-
await button.trigger('click');
|
|
212
|
-
|
|
213
|
-
const emitted = wrapper.emitted();
|
|
214
|
-
expect(Object.keys(emitted)).toContain('download:all');
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
describe('Template Structure', () => {
|
|
219
|
-
it('should use template slots correctly', () => {
|
|
220
|
-
// Title template
|
|
221
|
-
const titleSection = wrapper.find('.v-card .d-flex.flex-row.align-center');
|
|
222
|
-
expect(titleSection.exists()).toBe(true);
|
|
223
|
-
|
|
224
|
-
// Content template should contain slot
|
|
225
|
-
const textSection = wrapper.find('.d-flex.flex-column.ga-4');
|
|
226
|
-
expect(textSection.exists()).toBe(true);
|
|
227
|
-
});
|
|
228
|
-
});
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
+
import DocumentCard from '../../../../src/components/Laboratory/DocumentCard/DocumentCard.vue';
|
|
4
|
+
|
|
5
|
+
describe('DocumentCard', () => {
|
|
6
|
+
let wrapper: VueWrapper;
|
|
7
|
+
|
|
8
|
+
const defaultProps = {
|
|
9
|
+
title: 'Test Documents',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
wrapper = mount(DocumentCard, {
|
|
14
|
+
props: defaultProps,
|
|
15
|
+
global: {
|
|
16
|
+
stubs: {
|
|
17
|
+
'Button': {
|
|
18
|
+
template: '<button data-testid="download-button" @click="$emit(\'click\')">{{ label }}</button>',
|
|
19
|
+
props: ['label', 'color', 'variant']
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('Component Rendering', () => {
|
|
27
|
+
it('should render the component', () => {
|
|
28
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
29
|
+
expect(wrapper.find('.document-card').exists()).toBe(true);
|
|
30
|
+
expect(wrapper.find('.v-card').exists()).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should display the title', () => {
|
|
34
|
+
expect(wrapper.text()).toContain('Test Documents');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should render download all button', () => {
|
|
38
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
39
|
+
expect(button.exists()).toBe(true);
|
|
40
|
+
expect(button.text()).toBe('Download all');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should have slot for content', () => {
|
|
44
|
+
const contentContainer = wrapper.find('.d-flex.flex-column.ga-4');
|
|
45
|
+
expect(contentContainer.exists()).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe('Props', () => {
|
|
50
|
+
it('should use default title when not provided', async () => {
|
|
51
|
+
await wrapper.setProps({ title: undefined });
|
|
52
|
+
expect(wrapper.text()).toContain('Attachments');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should accept custom title', async () => {
|
|
56
|
+
await wrapper.setProps({ title: 'Custom Documents' });
|
|
57
|
+
expect(wrapper.text()).toContain('Custom Documents');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should update title when prop changes', async () => {
|
|
61
|
+
await wrapper.setProps({ title: 'Updated Title' });
|
|
62
|
+
expect(wrapper.text()).toContain('Updated Title');
|
|
63
|
+
expect(wrapper.text()).not.toContain('Test Documents');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('Events', () => {
|
|
68
|
+
it('should emit download:all when download button is clicked', async () => {
|
|
69
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
70
|
+
await button.trigger('click');
|
|
71
|
+
|
|
72
|
+
expect(wrapper.emitted('download:all')).toBeTruthy();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should call handleDownloadAll method when button is clicked', async () => {
|
|
76
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
77
|
+
await button.trigger('click');
|
|
78
|
+
|
|
79
|
+
expect(wrapper.emitted('download:all')).toBeTruthy();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('Slot Content', () => {
|
|
84
|
+
it('should render slot content', () => {
|
|
85
|
+
const wrapperWithSlot = mount(DocumentCard, {
|
|
86
|
+
props: defaultProps,
|
|
87
|
+
slots: {
|
|
88
|
+
default: '<div data-testid="slot-content">Custom Slot Content</div>'
|
|
89
|
+
},
|
|
90
|
+
global: {
|
|
91
|
+
stubs: {
|
|
92
|
+
'Button': {
|
|
93
|
+
template: '<button @click="$emit(\'click\')" data-testid="download-button">{{ label }}</button>',
|
|
94
|
+
props: ['label', 'color', 'variant']
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
expect(wrapperWithSlot.find('[data-testid="slot-content"]').exists()).toBe(true);
|
|
101
|
+
expect(wrapperWithSlot.text()).toContain('Custom Slot Content');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should render multiple slot items', () => {
|
|
105
|
+
const wrapperWithSlots = mount(DocumentCard, {
|
|
106
|
+
props: defaultProps,
|
|
107
|
+
slots: {
|
|
108
|
+
default: `
|
|
109
|
+
<div data-testid="slot-item-1">Item 1</div>
|
|
110
|
+
<div data-testid="slot-item-2">Item 2</div>
|
|
111
|
+
<div data-testid="slot-item-3">Item 3</div>
|
|
112
|
+
`
|
|
113
|
+
},
|
|
114
|
+
global: {
|
|
115
|
+
stubs: {
|
|
116
|
+
'Button': {
|
|
117
|
+
template: '<button @click="$emit(\'click\')" data-testid="download-button">{{ label }}</button>',
|
|
118
|
+
props: ['label', 'color', 'variant']
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
expect(wrapperWithSlots.find('[data-testid="slot-item-1"]').exists()).toBe(true);
|
|
125
|
+
expect(wrapperWithSlots.find('[data-testid="slot-item-2"]').exists()).toBe(true);
|
|
126
|
+
expect(wrapperWithSlots.find('[data-testid="slot-item-3"]').exists()).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
describe('Card Properties', () => {
|
|
131
|
+
it('should have correct card elevation', () => {
|
|
132
|
+
const card = wrapper.find('.v-card');
|
|
133
|
+
expect(card.exists()).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should have correct card rounded property', () => {
|
|
137
|
+
const card = wrapper.find('.v-card');
|
|
138
|
+
expect(card.exists()).toBe(true);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('should have document-card class', () => {
|
|
142
|
+
const card = wrapper.find('.v-card');
|
|
143
|
+
expect(card.classes()).toContain('document-card');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('Button Properties', () => {
|
|
148
|
+
it('should have correct button styling', () => {
|
|
149
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
150
|
+
expect(button.exists()).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('should have download all as button text', () => {
|
|
154
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
155
|
+
expect(button.text()).toBe('Download all');
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe('Layout and Structure', () => {
|
|
160
|
+
it('should have correct title layout', () => {
|
|
161
|
+
const titleContainer = wrapper.find('.d-flex.flex-row.align-center');
|
|
162
|
+
expect(titleContainer.exists()).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('should have title with mr-auto class', () => {
|
|
166
|
+
const title = wrapper.find('h4.mr-auto');
|
|
167
|
+
expect(title.exists()).toBe(true);
|
|
168
|
+
expect(title.text()).toBe('Test Documents');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('should have correct content layout', () => {
|
|
172
|
+
const contentContainer = wrapper.find('.d-flex.flex-column.ga-4');
|
|
173
|
+
expect(contentContainer.exists()).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe('Title Variations', () => {
|
|
178
|
+
it('should handle long titles', async () => {
|
|
179
|
+
const longTitle = 'This is a very long title for testing how the component handles lengthy titles';
|
|
180
|
+
await wrapper.setProps({ title: longTitle });
|
|
181
|
+
expect(wrapper.text()).toContain(longTitle);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('should handle empty title', async () => {
|
|
185
|
+
await wrapper.setProps({ title: '' });
|
|
186
|
+
const title = wrapper.find('h4');
|
|
187
|
+
expect(title.text()).toBe('');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('should handle title with special characters', async () => {
|
|
191
|
+
const specialTitle = 'Documents & Attachments (2024) - Test #1';
|
|
192
|
+
await wrapper.setProps({ title: specialTitle });
|
|
193
|
+
expect(wrapper.text()).toContain(specialTitle);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
describe('Event Handling', () => {
|
|
198
|
+
it('should handle multiple download button clicks', async () => {
|
|
199
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
200
|
+
|
|
201
|
+
await button.trigger('click');
|
|
202
|
+
await button.trigger('click');
|
|
203
|
+
await button.trigger('click');
|
|
204
|
+
|
|
205
|
+
// Due to event bubbling in the test environment, each click triggers twice
|
|
206
|
+
expect(wrapper.emitted('download:all')).toHaveLength(6); // 3 clicks * 2 events each
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('should emit event with correct event name', async () => {
|
|
210
|
+
const button = wrapper.find('[data-testid="download-button"]');
|
|
211
|
+
await button.trigger('click');
|
|
212
|
+
|
|
213
|
+
const emitted = wrapper.emitted();
|
|
214
|
+
expect(Object.keys(emitted)).toContain('download:all');
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
describe('Template Structure', () => {
|
|
219
|
+
it('should use template slots correctly', () => {
|
|
220
|
+
// Title template
|
|
221
|
+
const titleSection = wrapper.find('.v-card .d-flex.flex-row.align-center');
|
|
222
|
+
expect(titleSection.exists()).toBe(true);
|
|
223
|
+
|
|
224
|
+
// Content template should contain slot
|
|
225
|
+
const textSection = wrapper.find('.d-flex.flex-column.ga-4');
|
|
226
|
+
expect(textSection.exists()).toBe(true);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
229
|
});
|