@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,252 +1,252 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
-
import MainColumnsBar from '../../../../src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue';
|
|
4
|
-
|
|
5
|
-
describe('MainColumnsBar', () => {
|
|
6
|
-
let wrapper: VueWrapper;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
wrapper = mount(MainColumnsBar, {
|
|
10
|
-
global: {
|
|
11
|
-
stubs: {
|
|
12
|
-
'v-divider': {
|
|
13
|
-
template: '<hr class="v-divider" data-testid="v-divider" v-bind="$attrs" />',
|
|
14
|
-
props: ['vertical', 'thickness'],
|
|
15
|
-
inheritAttrs: false
|
|
16
|
-
},
|
|
17
|
-
'v-btn': {
|
|
18
|
-
template: '<button class="v-btn" :disabled="disabled" :readonly="readonly" @click="handleClick" data-testid="root" v-bind="$attrs"><span v-if="prependIcon" class="prepend-icon"></span><slot /><span v-if="appendIcon" class="append-icon"></span></button>',
|
|
19
|
-
props: ['disabled', 'loading', 'variant', 'color', 'size', 'density', 'rounded', 'elevation', 'flat', 'readonly', 'prependIcon', 'appendIcon'],
|
|
20
|
-
emits: ['click'],
|
|
21
|
-
inheritAttrs: false,
|
|
22
|
-
methods: {
|
|
23
|
-
handleClick(event) {
|
|
24
|
-
if (!this.disabled) {
|
|
25
|
-
this.$emit('click', event);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
describe('Component Rendering', () => {
|
|
36
|
-
it('should render the component', () => {
|
|
37
|
-
expect(wrapper.find('.d-flex.flex-row.justify-space-between').exists()).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should render all five buttons', () => {
|
|
41
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
42
|
-
expect(buttons).toHaveLength(5);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should render all dividers', () => {
|
|
46
|
-
const dividers = wrapper.findAll('.v-divider');
|
|
47
|
-
expect(dividers).toHaveLength(6); // 6 vertical dividers
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('should have correct button labels', () => {
|
|
51
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
52
|
-
const expectedLabels = ['Draft', 'Design', 'Production', 'Shipping', 'Treatment'];
|
|
53
|
-
|
|
54
|
-
buttons.forEach((button, index) => {
|
|
55
|
-
expect(button.text()).toContain(expectedLabels[index]);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
describe('Button Properties', () => {
|
|
61
|
-
it('should have correct button styling', () => {
|
|
62
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
63
|
-
buttons.forEach(button => {
|
|
64
|
-
expect(button.exists()).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('should have h4 tags for button text', () => {
|
|
69
|
-
const headers = wrapper.findAll('h4');
|
|
70
|
-
expect(headers).toHaveLength(5);
|
|
71
|
-
|
|
72
|
-
const expectedTexts = ['Draft', 'Design', 'Production', 'Shipping', 'Treatment'];
|
|
73
|
-
headers.forEach((header, index) => {
|
|
74
|
-
expect(header.text()).toBe(expectedTexts[index]);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('Events', () => {
|
|
80
|
-
it('should emit click:draft when Draft button is clicked', async () => {
|
|
81
|
-
const draftButton = wrapper.findAll('.v-btn')[0];
|
|
82
|
-
await draftButton.trigger('click');
|
|
83
|
-
|
|
84
|
-
expect(wrapper.emitted('click:draft')).toBeTruthy();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('should emit click:design when Design button is clicked', async () => {
|
|
88
|
-
const designButton = wrapper.findAll('.v-btn')[1];
|
|
89
|
-
await designButton.trigger('click');
|
|
90
|
-
|
|
91
|
-
expect(wrapper.emitted('click:design')).toBeTruthy();
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('should emit click:production when Production button is clicked', async () => {
|
|
95
|
-
const productionButton = wrapper.findAll('.v-btn')[2];
|
|
96
|
-
await productionButton.trigger('click');
|
|
97
|
-
|
|
98
|
-
expect(wrapper.emitted('click:production')).toBeTruthy();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('should emit click:shipping when Shipping button is clicked', async () => {
|
|
102
|
-
const shippingButton = wrapper.findAll('.v-btn')[3];
|
|
103
|
-
await shippingButton.trigger('click');
|
|
104
|
-
|
|
105
|
-
expect(wrapper.emitted('click:shipping')).toBeTruthy();
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should emit click:treatment when Treatment button is clicked', async () => {
|
|
109
|
-
const treatmentButton = wrapper.findAll('.v-btn')[4];
|
|
110
|
-
await treatmentButton.trigger('click');
|
|
111
|
-
|
|
112
|
-
expect(wrapper.emitted('click:treatment')).toBeTruthy();
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
describe('Event Handling', () => {
|
|
117
|
-
it('should handle multiple clicks on the same button', async () => {
|
|
118
|
-
const draftButton = wrapper.findAll('.v-btn')[0];
|
|
119
|
-
|
|
120
|
-
await draftButton.trigger('click');
|
|
121
|
-
await draftButton.trigger('click');
|
|
122
|
-
await draftButton.trigger('click');
|
|
123
|
-
|
|
124
|
-
expect(wrapper.emitted('click:draft')).toHaveLength(3);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('should handle clicks on different buttons', async () => {
|
|
128
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
129
|
-
|
|
130
|
-
await buttons[0].trigger('click'); // Draft
|
|
131
|
-
await buttons[1].trigger('click'); // Design
|
|
132
|
-
await buttons[2].trigger('click'); // Production
|
|
133
|
-
await buttons[3].trigger('click'); // Shipping
|
|
134
|
-
await buttons[4].trigger('click'); // Treatment
|
|
135
|
-
|
|
136
|
-
expect(wrapper.emitted('click:draft')).toHaveLength(1);
|
|
137
|
-
expect(wrapper.emitted('click:design')).toHaveLength(1);
|
|
138
|
-
expect(wrapper.emitted('click:production')).toHaveLength(1);
|
|
139
|
-
expect(wrapper.emitted('click:shipping')).toHaveLength(1);
|
|
140
|
-
expect(wrapper.emitted('click:treatment')).toHaveLength(1);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('should emit correct event names', () => {
|
|
144
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
145
|
-
const expectedEvents = [
|
|
146
|
-
'click:draft',
|
|
147
|
-
'click:design',
|
|
148
|
-
'click:production',
|
|
149
|
-
'click:shipping',
|
|
150
|
-
'click:treatment'
|
|
151
|
-
];
|
|
152
|
-
|
|
153
|
-
// Check that all expected events are defined in emits
|
|
154
|
-
const emitsOptions = wrapper.vm.$options.emits;
|
|
155
|
-
expectedEvents.forEach(event => {
|
|
156
|
-
expect(emitsOptions).toContain(event);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
describe('Layout and Structure', () => {
|
|
162
|
-
it('should have correct root layout', () => {
|
|
163
|
-
const root = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
164
|
-
expect(root.exists()).toBe(true);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('should have vertical dividers', () => {
|
|
168
|
-
const dividers = wrapper.findAll('.v-divider');
|
|
169
|
-
expect(dividers).toHaveLength(6);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('should alternate between dividers and buttons', () => {
|
|
173
|
-
const children = wrapper.find('.d-flex.flex-row.justify-space-between').element.children;
|
|
174
|
-
|
|
175
|
-
// Should start with divider, then button, then divider, etc.
|
|
176
|
-
for (let i = 0; i < children.length; i++) {
|
|
177
|
-
if (i % 2 === 0) {
|
|
178
|
-
// Even indices should be dividers
|
|
179
|
-
expect(children[i].classList.contains('v-divider')).toBe(true);
|
|
180
|
-
} else {
|
|
181
|
-
// Odd indices should be buttons
|
|
182
|
-
expect(children[i].classList.contains('v-btn')).toBe(true);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
describe('Button Icons', () => {
|
|
189
|
-
it('should have correct append icons', () => {
|
|
190
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
191
|
-
expect(buttons).toHaveLength(5);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
describe('Component Behavior', () => {
|
|
196
|
-
it('should be functional without any props', () => {
|
|
197
|
-
// The component doesn't take any props, so it should work with default mount
|
|
198
|
-
expect(wrapper.vm).toBeTruthy();
|
|
199
|
-
expect(wrapper.findAll('.v-btn')).toHaveLength(5);
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it('should maintain consistent styling across all buttons', () => {
|
|
203
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
204
|
-
expect(buttons).toHaveLength(5);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
describe('Accessibility', () => {
|
|
209
|
-
it('should have meaningful button text', () => {
|
|
210
|
-
const buttons = wrapper.findAll('.v-btn');
|
|
211
|
-
const buttonTexts = buttons.map(button => button.text());
|
|
212
|
-
|
|
213
|
-
buttonTexts.forEach(text => {
|
|
214
|
-
expect(text.trim()).not.toBe('');
|
|
215
|
-
expect(text.trim().length).toBeGreaterThan(0);
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it('should use semantic h4 elements for button text', () => {
|
|
220
|
-
const headers = wrapper.findAll('h4');
|
|
221
|
-
expect(headers).toHaveLength(5);
|
|
222
|
-
|
|
223
|
-
headers.forEach(header => {
|
|
224
|
-
expect(header.text().trim()).not.toBe('');
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
describe('Visual Structure', () => {
|
|
230
|
-
it('should have correct number of elements', () => {
|
|
231
|
-
// Should have 6 dividers + 5 buttons = 11 total children
|
|
232
|
-
const container = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
233
|
-
expect(container.element.children).toHaveLength(11);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('should start and end with dividers', () => {
|
|
237
|
-
const container = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
238
|
-
const firstChild = container.element.children[0];
|
|
239
|
-
const lastChild = container.element.children[container.element.children.length - 1];
|
|
240
|
-
|
|
241
|
-
expect(firstChild.classList.contains('v-divider')).toBe(true);
|
|
242
|
-
expect(lastChild.classList.contains('v-divider')).toBe(true);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
describe('Responsiveness', () => {
|
|
247
|
-
it('should use justify-space-between for even distribution', () => {
|
|
248
|
-
const container = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
249
|
-
expect(container.exists()).toBe(true);
|
|
250
|
-
});
|
|
251
|
-
});
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
+
import MainColumnsBar from '../../../../src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue';
|
|
4
|
+
|
|
5
|
+
describe('MainColumnsBar', () => {
|
|
6
|
+
let wrapper: VueWrapper;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
wrapper = mount(MainColumnsBar, {
|
|
10
|
+
global: {
|
|
11
|
+
stubs: {
|
|
12
|
+
'v-divider': {
|
|
13
|
+
template: '<hr class="v-divider" data-testid="v-divider" v-bind="$attrs" />',
|
|
14
|
+
props: ['vertical', 'thickness'],
|
|
15
|
+
inheritAttrs: false
|
|
16
|
+
},
|
|
17
|
+
'v-btn': {
|
|
18
|
+
template: '<button class="v-btn" :disabled="disabled" :readonly="readonly" @click="handleClick" data-testid="root" v-bind="$attrs"><span v-if="prependIcon" class="prepend-icon"></span><slot /><span v-if="appendIcon" class="append-icon"></span></button>',
|
|
19
|
+
props: ['disabled', 'loading', 'variant', 'color', 'size', 'density', 'rounded', 'elevation', 'flat', 'readonly', 'prependIcon', 'appendIcon'],
|
|
20
|
+
emits: ['click'],
|
|
21
|
+
inheritAttrs: false,
|
|
22
|
+
methods: {
|
|
23
|
+
handleClick(event) {
|
|
24
|
+
if (!this.disabled) {
|
|
25
|
+
this.$emit('click', event);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('Component Rendering', () => {
|
|
36
|
+
it('should render the component', () => {
|
|
37
|
+
expect(wrapper.find('.d-flex.flex-row.justify-space-between').exists()).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should render all five buttons', () => {
|
|
41
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
42
|
+
expect(buttons).toHaveLength(5);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('should render all dividers', () => {
|
|
46
|
+
const dividers = wrapper.findAll('.v-divider');
|
|
47
|
+
expect(dividers).toHaveLength(6); // 6 vertical dividers
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should have correct button labels', () => {
|
|
51
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
52
|
+
const expectedLabels = ['Draft', 'Design', 'Production', 'Shipping', 'Treatment'];
|
|
53
|
+
|
|
54
|
+
buttons.forEach((button, index) => {
|
|
55
|
+
expect(button.text()).toContain(expectedLabels[index]);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('Button Properties', () => {
|
|
61
|
+
it('should have correct button styling', () => {
|
|
62
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
63
|
+
buttons.forEach(button => {
|
|
64
|
+
expect(button.exists()).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should have h4 tags for button text', () => {
|
|
69
|
+
const headers = wrapper.findAll('h4');
|
|
70
|
+
expect(headers).toHaveLength(5);
|
|
71
|
+
|
|
72
|
+
const expectedTexts = ['Draft', 'Design', 'Production', 'Shipping', 'Treatment'];
|
|
73
|
+
headers.forEach((header, index) => {
|
|
74
|
+
expect(header.text()).toBe(expectedTexts[index]);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('Events', () => {
|
|
80
|
+
it('should emit click:draft when Draft button is clicked', async () => {
|
|
81
|
+
const draftButton = wrapper.findAll('.v-btn')[0];
|
|
82
|
+
await draftButton.trigger('click');
|
|
83
|
+
|
|
84
|
+
expect(wrapper.emitted('click:draft')).toBeTruthy();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should emit click:design when Design button is clicked', async () => {
|
|
88
|
+
const designButton = wrapper.findAll('.v-btn')[1];
|
|
89
|
+
await designButton.trigger('click');
|
|
90
|
+
|
|
91
|
+
expect(wrapper.emitted('click:design')).toBeTruthy();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should emit click:production when Production button is clicked', async () => {
|
|
95
|
+
const productionButton = wrapper.findAll('.v-btn')[2];
|
|
96
|
+
await productionButton.trigger('click');
|
|
97
|
+
|
|
98
|
+
expect(wrapper.emitted('click:production')).toBeTruthy();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should emit click:shipping when Shipping button is clicked', async () => {
|
|
102
|
+
const shippingButton = wrapper.findAll('.v-btn')[3];
|
|
103
|
+
await shippingButton.trigger('click');
|
|
104
|
+
|
|
105
|
+
expect(wrapper.emitted('click:shipping')).toBeTruthy();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should emit click:treatment when Treatment button is clicked', async () => {
|
|
109
|
+
const treatmentButton = wrapper.findAll('.v-btn')[4];
|
|
110
|
+
await treatmentButton.trigger('click');
|
|
111
|
+
|
|
112
|
+
expect(wrapper.emitted('click:treatment')).toBeTruthy();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
describe('Event Handling', () => {
|
|
117
|
+
it('should handle multiple clicks on the same button', async () => {
|
|
118
|
+
const draftButton = wrapper.findAll('.v-btn')[0];
|
|
119
|
+
|
|
120
|
+
await draftButton.trigger('click');
|
|
121
|
+
await draftButton.trigger('click');
|
|
122
|
+
await draftButton.trigger('click');
|
|
123
|
+
|
|
124
|
+
expect(wrapper.emitted('click:draft')).toHaveLength(3);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('should handle clicks on different buttons', async () => {
|
|
128
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
129
|
+
|
|
130
|
+
await buttons[0].trigger('click'); // Draft
|
|
131
|
+
await buttons[1].trigger('click'); // Design
|
|
132
|
+
await buttons[2].trigger('click'); // Production
|
|
133
|
+
await buttons[3].trigger('click'); // Shipping
|
|
134
|
+
await buttons[4].trigger('click'); // Treatment
|
|
135
|
+
|
|
136
|
+
expect(wrapper.emitted('click:draft')).toHaveLength(1);
|
|
137
|
+
expect(wrapper.emitted('click:design')).toHaveLength(1);
|
|
138
|
+
expect(wrapper.emitted('click:production')).toHaveLength(1);
|
|
139
|
+
expect(wrapper.emitted('click:shipping')).toHaveLength(1);
|
|
140
|
+
expect(wrapper.emitted('click:treatment')).toHaveLength(1);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should emit correct event names', () => {
|
|
144
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
145
|
+
const expectedEvents = [
|
|
146
|
+
'click:draft',
|
|
147
|
+
'click:design',
|
|
148
|
+
'click:production',
|
|
149
|
+
'click:shipping',
|
|
150
|
+
'click:treatment'
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
// Check that all expected events are defined in emits
|
|
154
|
+
const emitsOptions = wrapper.vm.$options.emits;
|
|
155
|
+
expectedEvents.forEach(event => {
|
|
156
|
+
expect(emitsOptions).toContain(event);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe('Layout and Structure', () => {
|
|
162
|
+
it('should have correct root layout', () => {
|
|
163
|
+
const root = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
164
|
+
expect(root.exists()).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('should have vertical dividers', () => {
|
|
168
|
+
const dividers = wrapper.findAll('.v-divider');
|
|
169
|
+
expect(dividers).toHaveLength(6);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('should alternate between dividers and buttons', () => {
|
|
173
|
+
const children = wrapper.find('.d-flex.flex-row.justify-space-between').element.children;
|
|
174
|
+
|
|
175
|
+
// Should start with divider, then button, then divider, etc.
|
|
176
|
+
for (let i = 0; i < children.length; i++) {
|
|
177
|
+
if (i % 2 === 0) {
|
|
178
|
+
// Even indices should be dividers
|
|
179
|
+
expect(children[i].classList.contains('v-divider')).toBe(true);
|
|
180
|
+
} else {
|
|
181
|
+
// Odd indices should be buttons
|
|
182
|
+
expect(children[i].classList.contains('v-btn')).toBe(true);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('Button Icons', () => {
|
|
189
|
+
it('should have correct append icons', () => {
|
|
190
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
191
|
+
expect(buttons).toHaveLength(5);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
describe('Component Behavior', () => {
|
|
196
|
+
it('should be functional without any props', () => {
|
|
197
|
+
// The component doesn't take any props, so it should work with default mount
|
|
198
|
+
expect(wrapper.vm).toBeTruthy();
|
|
199
|
+
expect(wrapper.findAll('.v-btn')).toHaveLength(5);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('should maintain consistent styling across all buttons', () => {
|
|
203
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
204
|
+
expect(buttons).toHaveLength(5);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe('Accessibility', () => {
|
|
209
|
+
it('should have meaningful button text', () => {
|
|
210
|
+
const buttons = wrapper.findAll('.v-btn');
|
|
211
|
+
const buttonTexts = buttons.map(button => button.text());
|
|
212
|
+
|
|
213
|
+
buttonTexts.forEach(text => {
|
|
214
|
+
expect(text.trim()).not.toBe('');
|
|
215
|
+
expect(text.trim().length).toBeGreaterThan(0);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('should use semantic h4 elements for button text', () => {
|
|
220
|
+
const headers = wrapper.findAll('h4');
|
|
221
|
+
expect(headers).toHaveLength(5);
|
|
222
|
+
|
|
223
|
+
headers.forEach(header => {
|
|
224
|
+
expect(header.text().trim()).not.toBe('');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
describe('Visual Structure', () => {
|
|
230
|
+
it('should have correct number of elements', () => {
|
|
231
|
+
// Should have 6 dividers + 5 buttons = 11 total children
|
|
232
|
+
const container = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
233
|
+
expect(container.element.children).toHaveLength(11);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('should start and end with dividers', () => {
|
|
237
|
+
const container = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
238
|
+
const firstChild = container.element.children[0];
|
|
239
|
+
const lastChild = container.element.children[container.element.children.length - 1];
|
|
240
|
+
|
|
241
|
+
expect(firstChild.classList.contains('v-divider')).toBe(true);
|
|
242
|
+
expect(lastChild.classList.contains('v-divider')).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('Responsiveness', () => {
|
|
247
|
+
it('should use justify-space-between for even distribution', () => {
|
|
248
|
+
const container = wrapper.find('.d-flex.flex-row.justify-space-between');
|
|
249
|
+
expect(container.exists()).toBe(true);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
252
|
});
|