@zap-wunschlachen/wl-shared-components 1.0.4 → 1.0.6
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 +190 -147
- 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 +235 -235
- package/src/assets/css/variables.css +96 -96
- 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 +28 -28
- package/src/components/Appointment/Card/Actions.vue +72 -72
- package/src/components/Appointment/Card/Card.css +81 -61
- package/src/components/Appointment/Card/Card.vue +88 -74
- 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 +117 -117
- package/src/components/Button/Button.vue +119 -119
- package/src/components/CheckBox/CheckBox.css +185 -185
- package/src/components/CheckBox/Checkbox.vue +130 -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 +29 -29
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +202 -202
- package/src/components/IconBullet/IconBullet.vue +86 -86
- package/src/components/IconBullet/IconBulletList.vue +41 -41
- package/src/components/Icons/AdvanceAppointments.vue +112 -0
- 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 +247 -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/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 +143 -143
- 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 +304 -304
- 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/index.ts +21 -21
- package/src/constants/iconEnums.ts +3 -3
- package/src/i18n/i18n.ts +15 -15
- package/src/i18n/locales/de.json +27 -27
- package/src/i18n/locales/en.json +27 -27
- package/src/index.ts +31 -31
- package/src/main.ts +11 -11
- package/src/plugins/vuetify.ts +131 -131
- 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/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/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- 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/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/IconBullet/IconBullet.spec.ts +356 -356
- package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
- 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/RingNotification.spec.ts +393 -393
- 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/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/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
-
import ChatBoxImage from '../../../../src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue';
|
|
4
|
-
|
|
5
|
-
describe('ChatBoxImage', () => {
|
|
6
|
-
let wrapper: VueWrapper;
|
|
7
|
-
|
|
8
|
-
const defaultProps = {
|
|
9
|
-
paragraphText: 'Test paragraph content',
|
|
10
|
-
imageSources: [
|
|
11
|
-
'https://example.com/image1.jpg',
|
|
12
|
-
'https://example.com/image2.jpg'
|
|
13
|
-
],
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
wrapper = mount(ChatBoxImage, {
|
|
18
|
-
props: defaultProps,
|
|
19
|
-
global: {
|
|
20
|
-
stubs: {
|
|
21
|
-
'Button': {
|
|
22
|
-
template: '<button :style="$attrs.style" data-testid="button" @click="$emit(\'click\')">{{ label }}</button>',
|
|
23
|
-
props: ['label', 'density', 'size', 'variant']
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
describe('Component Rendering', () => {
|
|
31
|
-
it('should render the component', () => {
|
|
32
|
-
expect(wrapper.find('.chat-box-image').exists()).toBe(true);
|
|
33
|
-
expect(wrapper.find('.v-card').exists()).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('should display the paragraph text', () => {
|
|
37
|
-
expect(wrapper.text()).toContain('Test paragraph content');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should render images from imageSources prop', () => {
|
|
41
|
-
const images = wrapper.findAll('.v-img');
|
|
42
|
-
expect(images).toHaveLength(2);
|
|
43
|
-
expect(images[0].attributes('src')).toBe('https://example.com/image1.jpg');
|
|
44
|
-
expect(images[1].attributes('src')).toBe('https://example.com/image2.jpg');
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should render two action buttons', () => {
|
|
48
|
-
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
49
|
-
expect(buttons).toHaveLength(2);
|
|
50
|
-
expect(buttons[0].text()).toBe('Approved');
|
|
51
|
-
expect(buttons[1].text()).toBe('Not Approved');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('Props', () => {
|
|
56
|
-
it('should use default paragraph text when not provided', async () => {
|
|
57
|
-
await wrapper.setProps({ paragraphText: undefined });
|
|
58
|
-
expect(wrapper.text()).toContain('Lorem ipsum dolor sit amet, consetetur sadipscing elitr...');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should use default image sources when not provided', async () => {
|
|
62
|
-
await wrapper.setProps({ imageSources: undefined });
|
|
63
|
-
const images = wrapper.findAll('.v-img');
|
|
64
|
-
expect(images).toHaveLength(2);
|
|
65
|
-
expect(images[0].attributes('src')).toBe('https://cdn.vuetifyjs.com/images/parallax/material.jpg');
|
|
66
|
-
expect(images[1].attributes('src')).toBe('https://cdn.vuetifyjs.com/images/parallax/material.jpg');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('should accept custom paragraph text', async () => {
|
|
70
|
-
const customText = 'Custom paragraph content for testing';
|
|
71
|
-
await wrapper.setProps({ paragraphText: customText });
|
|
72
|
-
expect(wrapper.text()).toContain(customText);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('should accept custom image sources array', async () => {
|
|
76
|
-
const customImages = [
|
|
77
|
-
'https://custom.com/image1.jpg',
|
|
78
|
-
'https://custom.com/image2.jpg',
|
|
79
|
-
'https://custom.com/image3.jpg'
|
|
80
|
-
];
|
|
81
|
-
await wrapper.setProps({ imageSources: customImages });
|
|
82
|
-
|
|
83
|
-
const images = wrapper.findAll('.v-img');
|
|
84
|
-
expect(images).toHaveLength(3);
|
|
85
|
-
expect(images[0].attributes('src')).toBe('https://custom.com/image1.jpg');
|
|
86
|
-
expect(images[1].attributes('src')).toBe('https://custom.com/image2.jpg');
|
|
87
|
-
expect(images[2].attributes('src')).toBe('https://custom.com/image3.jpg');
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('should handle empty image sources array', async () => {
|
|
91
|
-
await wrapper.setProps({ imageSources: [] });
|
|
92
|
-
const images = wrapper.findAll('.v-img');
|
|
93
|
-
expect(images).toHaveLength(0);
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
describe('Events', () => {
|
|
98
|
-
it('should emit click:approved when Approved button is clicked', async () => {
|
|
99
|
-
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
100
|
-
const approvedButton = buttons[0];
|
|
101
|
-
|
|
102
|
-
await approvedButton.trigger('click');
|
|
103
|
-
expect(wrapper.emitted('click:approved')).toBeTruthy();
|
|
104
|
-
// Due to event bubbling in the test environment, each click triggers twice
|
|
105
|
-
expect(wrapper.emitted('click:approved')).toHaveLength(2);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should emit click:not-approved when Not Approved button is clicked', async () => {
|
|
109
|
-
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
110
|
-
const notApprovedButton = buttons[1];
|
|
111
|
-
|
|
112
|
-
await notApprovedButton.trigger('click');
|
|
113
|
-
expect(wrapper.emitted('click:not-approved')).toBeTruthy();
|
|
114
|
-
// Due to event bubbling in the test environment, each click triggers twice
|
|
115
|
-
expect(wrapper.emitted('click:not-approved')).toHaveLength(2);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
describe('Button Properties', () => {
|
|
120
|
-
it('should have correct button styles', () => {
|
|
121
|
-
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
122
|
-
const approvedButton = buttons[0];
|
|
123
|
-
const notApprovedButton = buttons[1];
|
|
124
|
-
|
|
125
|
-
expect(approvedButton.exists()).toBe(true);
|
|
126
|
-
expect(notApprovedButton.exists()).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('should have correct button labels', () => {
|
|
130
|
-
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
131
|
-
expect(buttons[0].text()).toBe('Approved');
|
|
132
|
-
expect(buttons[1].text()).toBe('Not Approved');
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
describe('Layout and Structure', () => {
|
|
137
|
-
it('should have card with correct elevation and rounded properties', () => {
|
|
138
|
-
const card = wrapper.find('.v-card');
|
|
139
|
-
expect(card.attributes('elevation')).toBe('0');
|
|
140
|
-
expect(card.attributes('rounded')).toBe('lg');
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('should have images with correct properties', () => {
|
|
144
|
-
const images = wrapper.findAll('.v-img');
|
|
145
|
-
images.forEach(image => {
|
|
146
|
-
expect(image.attributes('aspect-ratio')).toBe('16/9');
|
|
147
|
-
expect(image.attributes('rounded')).toBe('lg');
|
|
148
|
-
expect(image.attributes('cover')).toBeDefined();
|
|
149
|
-
expect(image.classes()).toContain('ma-2');
|
|
150
|
-
expect(image.classes()).toContain('pa-2');
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('should have flex layout for images', () => {
|
|
155
|
-
const imageContainer = wrapper.find('.d-flex.flex-wrap');
|
|
156
|
-
expect(imageContainer.exists()).toBe(true);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('should have centered button layout', () => {
|
|
160
|
-
const buttonContainer = wrapper.find('.d-flex.flex-row.align-center.ga-3.w-100.justify-center');
|
|
161
|
-
expect(buttonContainer.exists()).toBe(true);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
describe('Styling', () => {
|
|
166
|
-
it('should apply custom styling to images', () => {
|
|
167
|
-
const images = wrapper.findAll('.v-img');
|
|
168
|
-
images.forEach(image => {
|
|
169
|
-
// Check for the presence of the image styling classes
|
|
170
|
-
expect(image.classes()).toContain('ma-2');
|
|
171
|
-
expect(image.classes()).toContain('pa-2');
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('should have padding on the card', () => {
|
|
176
|
-
const card = wrapper.find('.v-card');
|
|
177
|
-
expect(card.classes()).toContain('pa-2');
|
|
178
|
-
});
|
|
179
|
-
});
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { mount, VueWrapper } from '@vue/test-utils';
|
|
3
|
+
import ChatBoxImage from '../../../../src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue';
|
|
4
|
+
|
|
5
|
+
describe('ChatBoxImage', () => {
|
|
6
|
+
let wrapper: VueWrapper;
|
|
7
|
+
|
|
8
|
+
const defaultProps = {
|
|
9
|
+
paragraphText: 'Test paragraph content',
|
|
10
|
+
imageSources: [
|
|
11
|
+
'https://example.com/image1.jpg',
|
|
12
|
+
'https://example.com/image2.jpg'
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
wrapper = mount(ChatBoxImage, {
|
|
18
|
+
props: defaultProps,
|
|
19
|
+
global: {
|
|
20
|
+
stubs: {
|
|
21
|
+
'Button': {
|
|
22
|
+
template: '<button :style="$attrs.style" data-testid="button" @click="$emit(\'click\')">{{ label }}</button>',
|
|
23
|
+
props: ['label', 'density', 'size', 'variant']
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('Component Rendering', () => {
|
|
31
|
+
it('should render the component', () => {
|
|
32
|
+
expect(wrapper.find('.chat-box-image').exists()).toBe(true);
|
|
33
|
+
expect(wrapper.find('.v-card').exists()).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should display the paragraph text', () => {
|
|
37
|
+
expect(wrapper.text()).toContain('Test paragraph content');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should render images from imageSources prop', () => {
|
|
41
|
+
const images = wrapper.findAll('.v-img');
|
|
42
|
+
expect(images).toHaveLength(2);
|
|
43
|
+
expect(images[0].attributes('src')).toBe('https://example.com/image1.jpg');
|
|
44
|
+
expect(images[1].attributes('src')).toBe('https://example.com/image2.jpg');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should render two action buttons', () => {
|
|
48
|
+
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
49
|
+
expect(buttons).toHaveLength(2);
|
|
50
|
+
expect(buttons[0].text()).toBe('Approved');
|
|
51
|
+
expect(buttons[1].text()).toBe('Not Approved');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('Props', () => {
|
|
56
|
+
it('should use default paragraph text when not provided', async () => {
|
|
57
|
+
await wrapper.setProps({ paragraphText: undefined });
|
|
58
|
+
expect(wrapper.text()).toContain('Lorem ipsum dolor sit amet, consetetur sadipscing elitr...');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should use default image sources when not provided', async () => {
|
|
62
|
+
await wrapper.setProps({ imageSources: undefined });
|
|
63
|
+
const images = wrapper.findAll('.v-img');
|
|
64
|
+
expect(images).toHaveLength(2);
|
|
65
|
+
expect(images[0].attributes('src')).toBe('https://cdn.vuetifyjs.com/images/parallax/material.jpg');
|
|
66
|
+
expect(images[1].attributes('src')).toBe('https://cdn.vuetifyjs.com/images/parallax/material.jpg');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should accept custom paragraph text', async () => {
|
|
70
|
+
const customText = 'Custom paragraph content for testing';
|
|
71
|
+
await wrapper.setProps({ paragraphText: customText });
|
|
72
|
+
expect(wrapper.text()).toContain(customText);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should accept custom image sources array', async () => {
|
|
76
|
+
const customImages = [
|
|
77
|
+
'https://custom.com/image1.jpg',
|
|
78
|
+
'https://custom.com/image2.jpg',
|
|
79
|
+
'https://custom.com/image3.jpg'
|
|
80
|
+
];
|
|
81
|
+
await wrapper.setProps({ imageSources: customImages });
|
|
82
|
+
|
|
83
|
+
const images = wrapper.findAll('.v-img');
|
|
84
|
+
expect(images).toHaveLength(3);
|
|
85
|
+
expect(images[0].attributes('src')).toBe('https://custom.com/image1.jpg');
|
|
86
|
+
expect(images[1].attributes('src')).toBe('https://custom.com/image2.jpg');
|
|
87
|
+
expect(images[2].attributes('src')).toBe('https://custom.com/image3.jpg');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should handle empty image sources array', async () => {
|
|
91
|
+
await wrapper.setProps({ imageSources: [] });
|
|
92
|
+
const images = wrapper.findAll('.v-img');
|
|
93
|
+
expect(images).toHaveLength(0);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe('Events', () => {
|
|
98
|
+
it('should emit click:approved when Approved button is clicked', async () => {
|
|
99
|
+
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
100
|
+
const approvedButton = buttons[0];
|
|
101
|
+
|
|
102
|
+
await approvedButton.trigger('click');
|
|
103
|
+
expect(wrapper.emitted('click:approved')).toBeTruthy();
|
|
104
|
+
// Due to event bubbling in the test environment, each click triggers twice
|
|
105
|
+
expect(wrapper.emitted('click:approved')).toHaveLength(2);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should emit click:not-approved when Not Approved button is clicked', async () => {
|
|
109
|
+
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
110
|
+
const notApprovedButton = buttons[1];
|
|
111
|
+
|
|
112
|
+
await notApprovedButton.trigger('click');
|
|
113
|
+
expect(wrapper.emitted('click:not-approved')).toBeTruthy();
|
|
114
|
+
// Due to event bubbling in the test environment, each click triggers twice
|
|
115
|
+
expect(wrapper.emitted('click:not-approved')).toHaveLength(2);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe('Button Properties', () => {
|
|
120
|
+
it('should have correct button styles', () => {
|
|
121
|
+
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
122
|
+
const approvedButton = buttons[0];
|
|
123
|
+
const notApprovedButton = buttons[1];
|
|
124
|
+
|
|
125
|
+
expect(approvedButton.exists()).toBe(true);
|
|
126
|
+
expect(notApprovedButton.exists()).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should have correct button labels', () => {
|
|
130
|
+
const buttons = wrapper.findAll('[data-testid="button"]');
|
|
131
|
+
expect(buttons[0].text()).toBe('Approved');
|
|
132
|
+
expect(buttons[1].text()).toBe('Not Approved');
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('Layout and Structure', () => {
|
|
137
|
+
it('should have card with correct elevation and rounded properties', () => {
|
|
138
|
+
const card = wrapper.find('.v-card');
|
|
139
|
+
expect(card.attributes('elevation')).toBe('0');
|
|
140
|
+
expect(card.attributes('rounded')).toBe('lg');
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should have images with correct properties', () => {
|
|
144
|
+
const images = wrapper.findAll('.v-img');
|
|
145
|
+
images.forEach(image => {
|
|
146
|
+
expect(image.attributes('aspect-ratio')).toBe('16/9');
|
|
147
|
+
expect(image.attributes('rounded')).toBe('lg');
|
|
148
|
+
expect(image.attributes('cover')).toBeDefined();
|
|
149
|
+
expect(image.classes()).toContain('ma-2');
|
|
150
|
+
expect(image.classes()).toContain('pa-2');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should have flex layout for images', () => {
|
|
155
|
+
const imageContainer = wrapper.find('.d-flex.flex-wrap');
|
|
156
|
+
expect(imageContainer.exists()).toBe(true);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('should have centered button layout', () => {
|
|
160
|
+
const buttonContainer = wrapper.find('.d-flex.flex-row.align-center.ga-3.w-100.justify-center');
|
|
161
|
+
expect(buttonContainer.exists()).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('Styling', () => {
|
|
166
|
+
it('should apply custom styling to images', () => {
|
|
167
|
+
const images = wrapper.findAll('.v-img');
|
|
168
|
+
images.forEach(image => {
|
|
169
|
+
// Check for the presence of the image styling classes
|
|
170
|
+
expect(image.classes()).toContain('ma-2');
|
|
171
|
+
expect(image.classes()).toContain('pa-2');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should have padding on the card', () => {
|
|
176
|
+
const card = wrapper.find('.v-card');
|
|
177
|
+
expect(card.classes()).toContain('pa-2');
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
180
|
});
|