@zap-wunschlachen/wl-shared-components 1.0.35 → 1.0.37
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 +43 -38
- 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/audio/test.aac +0 -0
- 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 -117
- package/src/components/Button/Button.vue +174 -136
- package/src/components/CheckBox/CheckBox.css +214 -185
- package/src/components/CheckBox/Checkbox.vue +138 -130
- 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 -29
- 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 -247
- 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 -51
- package/src/components/Loader/Loader.vue +1 -0
- 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 -315
- 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 -0
- package/src/components/index.ts +28 -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 -0
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -0
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -0
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -0
- 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 -0
- 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 -0
- package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -0
- 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 -0
- 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 -0
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -0
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -0
- 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 -0
- package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -0
- 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 -0
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
-
import AppointmentCard from '../../../../src/components/Laboratory/AppointmentCard/AppointmentCard.vue';
|
|
4
|
-
|
|
5
|
-
describe('AppointmentCard', () => {
|
|
6
|
-
let wrapper: VueWrapper;
|
|
7
|
-
|
|
8
|
-
const defaultProps = {
|
|
9
|
-
date: '2024-01-15',
|
|
10
|
-
status: 'Done',
|
|
11
|
-
treatmentName: 'Root Canal',
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
wrapper = mount(AppointmentCard, {
|
|
16
|
-
props: defaultProps,
|
|
17
|
-
global: {
|
|
18
|
-
stubs: {
|
|
19
|
-
'TagLabel': {
|
|
20
|
-
template: '<div data-testid="tag-label">{{ status }}</div>',
|
|
21
|
-
props: ['status']
|
|
22
|
-
},
|
|
23
|
-
'v-btn': {
|
|
24
|
-
template: '<button class="v-btn" :readonly="readonly" :variant="variant" :prepend-icon="prependIcon" :size="size" :style="$attrs.style"><slot /></button>',
|
|
25
|
-
props: ['readonly', 'variant', 'prependIcon', 'size', 'rounded', 'color', 'appendIcon']
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('Component Rendering', () => {
|
|
33
|
-
it('should render the component', () => {
|
|
34
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
35
|
-
expect(wrapper.find('.appointment-card').exists()).toBe(true);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should display the date', () => {
|
|
39
|
-
expect(wrapper.text()).toContain('2024-01-15');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should display the treatment name', () => {
|
|
43
|
-
expect(wrapper.text()).toContain('Root Canal');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should display status label', () => {
|
|
47
|
-
expect(wrapper.text()).toContain('Status:');
|
|
48
|
-
const tagLabel = wrapper.find('[data-testid="tag-label"]');
|
|
49
|
-
expect(tagLabel.exists()).toBe(true);
|
|
50
|
-
expect(tagLabel.text()).toBe('Done');
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should display the default dentist name', () => {
|
|
54
|
-
expect(wrapper.text()).toContain('Martin Paetz');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should render two buttons', () => {
|
|
58
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
59
|
-
expect(buttons).toHaveLength(2);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
describe('Props', () => {
|
|
64
|
-
it('should accept custom dentist name', async () => {
|
|
65
|
-
await wrapper.setProps({ dentistName: 'Dr. Smith' });
|
|
66
|
-
expect(wrapper.text()).toContain('Dr. Smith');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('should accept custom button text color', async () => {
|
|
70
|
-
await wrapper.setProps({ buttonTextColor: '--custom-color' });
|
|
71
|
-
const button = wrapper.find('.v-btn');
|
|
72
|
-
expect(button.element.style.color).toContain('var(--custom-color)');
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('should accept custom button background color', async () => {
|
|
76
|
-
await wrapper.setProps({ buttonBackgroundColor: 'rgba(255, 0, 0, 0.5)' });
|
|
77
|
-
const button = wrapper.find('.v-btn');
|
|
78
|
-
expect(button.element.style.backgroundColor).toBe('rgba(255, 0, 0, 0.5)');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should accept custom button border color', async () => {
|
|
82
|
-
await wrapper.setProps({ buttonBorderColor: '--border-color' });
|
|
83
|
-
const button = wrapper.find('.v-btn');
|
|
84
|
-
const style = button.attributes('style');
|
|
85
|
-
expect(style).toContain('border:');
|
|
86
|
-
expect(style).toContain('--border-color');
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('should update when date prop changes', async () => {
|
|
90
|
-
await wrapper.setProps({ date: '2024-12-25' });
|
|
91
|
-
expect(wrapper.text()).toContain('2024-12-25');
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('should update when status prop changes', async () => {
|
|
95
|
-
await wrapper.setProps({ status: 'In Progress' });
|
|
96
|
-
const tagLabel = wrapper.find('[data-testid="tag-label"]');
|
|
97
|
-
expect(tagLabel.text()).toBe('In Progress');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should update when treatment name changes', async () => {
|
|
101
|
-
await wrapper.setProps({ treatmentName: 'Crown Installation' });
|
|
102
|
-
expect(wrapper.text()).toContain('Crown Installation');
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe('Button Properties', () => {
|
|
107
|
-
it('should have readonly treatment button', () => {
|
|
108
|
-
const treatmentButton = wrapper.findAll('.v-btn')[0];
|
|
109
|
-
expect(treatmentButton.attributes('readonly')).toBe('');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('should have readonly dentist button', () => {
|
|
113
|
-
const dentistButton = wrapper.findAll('.v-btn')[1];
|
|
114
|
-
expect(dentistButton.attributes('readonly')).toBe('');
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should have correct icons on buttons', () => {
|
|
118
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
119
|
-
expect(buttons[0].attributes('prepend-icon')).toBe('heroicons:document-check');
|
|
120
|
-
expect(buttons[1].attributes('prepend-icon')).toBe('heroicons:user-circle');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('should have correct button sizes', () => {
|
|
124
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
125
|
-
buttons.forEach(button => {
|
|
126
|
-
expect(button.attributes('size')).toBe('compact');
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
describe('Styling', () => {
|
|
132
|
-
it('should apply correct card styling', () => {
|
|
133
|
-
const card = wrapper.find('.v-card');
|
|
134
|
-
expect(card.attributes('elevation')).toBe('0');
|
|
135
|
-
expect(card.attributes('rounded')).toBe('lg');
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('should have correct button variants', () => {
|
|
139
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
140
|
-
expect(buttons[0].attributes('variant')).toBe('outlined');
|
|
141
|
-
expect(buttons[1].attributes('variant')).toBe('text');
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('should apply text-none class to buttons', () => {
|
|
145
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
146
|
-
buttons.forEach(button => {
|
|
147
|
-
expect(button.classes()).toContain('text-none');
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
describe('Layout', () => {
|
|
153
|
-
it('should have flex layout for title', () => {
|
|
154
|
-
const titleDiv = wrapper.find('.d-flex.flex-row.align-center');
|
|
155
|
-
expect(titleDiv.exists()).toBe(true);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('should have flex column layout for content', () => {
|
|
159
|
-
const contentDiv = wrapper.find('.d-flex.flex-column.ga-4');
|
|
160
|
-
expect(contentDiv.exists()).toBe(true);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('should have mr-auto class for proper spacing', () => {
|
|
164
|
-
const elements = wrapper.findAll('.mr-auto');
|
|
165
|
-
expect(elements.length).toBeGreaterThan(0);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
+
import AppointmentCard from '../../../../src/components/Laboratory/AppointmentCard/AppointmentCard.vue';
|
|
4
|
+
|
|
5
|
+
describe('AppointmentCard', () => {
|
|
6
|
+
let wrapper: VueWrapper;
|
|
7
|
+
|
|
8
|
+
const defaultProps = {
|
|
9
|
+
date: '2024-01-15',
|
|
10
|
+
status: 'Done',
|
|
11
|
+
treatmentName: 'Root Canal',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
wrapper = mount(AppointmentCard, {
|
|
16
|
+
props: defaultProps,
|
|
17
|
+
global: {
|
|
18
|
+
stubs: {
|
|
19
|
+
'TagLabel': {
|
|
20
|
+
template: '<div data-testid="tag-label">{{ status }}</div>',
|
|
21
|
+
props: ['status']
|
|
22
|
+
},
|
|
23
|
+
'v-btn': {
|
|
24
|
+
template: '<button class="v-btn" :readonly="readonly" :variant="variant" :prepend-icon="prependIcon" :size="size" :style="$attrs.style"><slot /></button>',
|
|
25
|
+
props: ['readonly', 'variant', 'prependIcon', 'size', 'rounded', 'color', 'appendIcon']
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('Component Rendering', () => {
|
|
33
|
+
it('should render the component', () => {
|
|
34
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
35
|
+
expect(wrapper.find('.appointment-card').exists()).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should display the date', () => {
|
|
39
|
+
expect(wrapper.text()).toContain('2024-01-15');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should display the treatment name', () => {
|
|
43
|
+
expect(wrapper.text()).toContain('Root Canal');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('should display status label', () => {
|
|
47
|
+
expect(wrapper.text()).toContain('Status:');
|
|
48
|
+
const tagLabel = wrapper.find('[data-testid="tag-label"]');
|
|
49
|
+
expect(tagLabel.exists()).toBe(true);
|
|
50
|
+
expect(tagLabel.text()).toBe('Done');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should display the default dentist name', () => {
|
|
54
|
+
expect(wrapper.text()).toContain('Martin Paetz');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should render two buttons', () => {
|
|
58
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
59
|
+
expect(buttons).toHaveLength(2);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('Props', () => {
|
|
64
|
+
it('should accept custom dentist name', async () => {
|
|
65
|
+
await wrapper.setProps({ dentistName: 'Dr. Smith' });
|
|
66
|
+
expect(wrapper.text()).toContain('Dr. Smith');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should accept custom button text color', async () => {
|
|
70
|
+
await wrapper.setProps({ buttonTextColor: '--custom-color' });
|
|
71
|
+
const button = wrapper.find('.v-btn');
|
|
72
|
+
expect(button.element.style.color).toContain('var(--custom-color)');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should accept custom button background color', async () => {
|
|
76
|
+
await wrapper.setProps({ buttonBackgroundColor: 'rgba(255, 0, 0, 0.5)' });
|
|
77
|
+
const button = wrapper.find('.v-btn');
|
|
78
|
+
expect(button.element.style.backgroundColor).toBe('rgba(255, 0, 0, 0.5)');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('should accept custom button border color', async () => {
|
|
82
|
+
await wrapper.setProps({ buttonBorderColor: '--border-color' });
|
|
83
|
+
const button = wrapper.find('.v-btn');
|
|
84
|
+
const style = button.attributes('style');
|
|
85
|
+
expect(style).toContain('border:');
|
|
86
|
+
expect(style).toContain('--border-color');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should update when date prop changes', async () => {
|
|
90
|
+
await wrapper.setProps({ date: '2024-12-25' });
|
|
91
|
+
expect(wrapper.text()).toContain('2024-12-25');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should update when status prop changes', async () => {
|
|
95
|
+
await wrapper.setProps({ status: 'In Progress' });
|
|
96
|
+
const tagLabel = wrapper.find('[data-testid="tag-label"]');
|
|
97
|
+
expect(tagLabel.text()).toBe('In Progress');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should update when treatment name changes', async () => {
|
|
101
|
+
await wrapper.setProps({ treatmentName: 'Crown Installation' });
|
|
102
|
+
expect(wrapper.text()).toContain('Crown Installation');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('Button Properties', () => {
|
|
107
|
+
it('should have readonly treatment button', () => {
|
|
108
|
+
const treatmentButton = wrapper.findAll('.v-btn')[0];
|
|
109
|
+
expect(treatmentButton.attributes('readonly')).toBe('');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('should have readonly dentist button', () => {
|
|
113
|
+
const dentistButton = wrapper.findAll('.v-btn')[1];
|
|
114
|
+
expect(dentistButton.attributes('readonly')).toBe('');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should have correct icons on buttons', () => {
|
|
118
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
119
|
+
expect(buttons[0].attributes('prepend-icon')).toBe('heroicons:document-check');
|
|
120
|
+
expect(buttons[1].attributes('prepend-icon')).toBe('heroicons:user-circle');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should have correct button sizes', () => {
|
|
124
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
125
|
+
buttons.forEach(button => {
|
|
126
|
+
expect(button.attributes('size')).toBe('compact');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('Styling', () => {
|
|
132
|
+
it('should apply correct card styling', () => {
|
|
133
|
+
const card = wrapper.find('.v-card');
|
|
134
|
+
expect(card.attributes('elevation')).toBe('0');
|
|
135
|
+
expect(card.attributes('rounded')).toBe('lg');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('should have correct button variants', () => {
|
|
139
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
140
|
+
expect(buttons[0].attributes('variant')).toBe('outlined');
|
|
141
|
+
expect(buttons[1].attributes('variant')).toBe('text');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should apply text-none class to buttons', () => {
|
|
145
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
146
|
+
buttons.forEach(button => {
|
|
147
|
+
expect(button.classes()).toContain('text-none');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('Layout', () => {
|
|
153
|
+
it('should have flex layout for title', () => {
|
|
154
|
+
const titleDiv = wrapper.find('.d-flex.flex-row.align-center');
|
|
155
|
+
expect(titleDiv.exists()).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('should have flex column layout for content', () => {
|
|
159
|
+
const contentDiv = wrapper.find('.d-flex.flex-column.ga-4');
|
|
160
|
+
expect(contentDiv.exists()).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should have mr-auto class for proper spacing', () => {
|
|
164
|
+
const elements = wrapper.findAll('.mr-auto');
|
|
165
|
+
expect(elements.length).toBeGreaterThan(0);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
168
|
});
|