@zap-wunschlachen/wl-shared-components 1.0.25 → 1.0.26
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 +34 -176
- 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 +107 -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 +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 +117 -117
- package/src/components/Background/Background.css +39 -0
- package/src/components/Background/Background.vue +19 -0
- package/src/components/Background/WhiteCocoonBackground.vue +9 -0
- package/src/components/Background/WunschlachenBackground.vue +11 -0
- 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/ErrorPage/ErrorPage.css +124 -0
- package/src/components/ErrorPage/ErrorPage.vue +45 -0
- package/src/components/ErrorPage/ErrorPageLogo.vue +26 -0
- 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/Logo.vue +108 -0
- 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/Loader/Loader.css +51 -51
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +289 -0
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -0
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -0
- 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 +315 -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/index.ts +26 -24
- 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 +139 -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/utils/index.ts +106 -100
- 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,187 +1,187 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import CalendarNotification from '@components/Icons/CalendarNotification.vue';
|
|
4
|
-
|
|
5
|
-
describe('CalendarNotification Icon', () => {
|
|
6
|
-
// Test basic rendering
|
|
7
|
-
describe('Rendering', () => {
|
|
8
|
-
it('renders as SVG element', () => {
|
|
9
|
-
const wrapper = mount(CalendarNotification);
|
|
10
|
-
|
|
11
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('has correct SVG attributes', () => {
|
|
15
|
-
const wrapper = mount(CalendarNotification);
|
|
16
|
-
const svg = wrapper.find('svg');
|
|
17
|
-
|
|
18
|
-
expect(svg.attributes('width')).toBe('22');
|
|
19
|
-
expect(svg.attributes('height')).toBe('20');
|
|
20
|
-
expect(svg.attributes('viewBox')).toBe('0 0 22 20');
|
|
21
|
-
expect(svg.attributes('fill')).toBe('none');
|
|
22
|
-
expect(svg.attributes('xmlns')).toBe('http://www.w3.org/2000/svg');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('contains path elements', () => {
|
|
26
|
-
const wrapper = mount(CalendarNotification);
|
|
27
|
-
const paths = wrapper.findAll('path');
|
|
28
|
-
|
|
29
|
-
expect(paths.length).toBeGreaterThan(0);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('has calendar structure paths with correct stroke color', () => {
|
|
33
|
-
const wrapper = mount(CalendarNotification);
|
|
34
|
-
const paths = wrapper.findAll('path');
|
|
35
|
-
|
|
36
|
-
// Check that most paths have the expected stroke color
|
|
37
|
-
const strokePaths = paths.filter(path =>
|
|
38
|
-
path.attributes('stroke') === '#172774'
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
expect(strokePaths.length).toBeGreaterThan(0);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('has notification indicator with correct fill color', () => {
|
|
45
|
-
const wrapper = mount(CalendarNotification);
|
|
46
|
-
const paths = wrapper.findAll('path');
|
|
47
|
-
|
|
48
|
-
// Check for the notification circle with pink fill
|
|
49
|
-
const notificationPath = paths.find(path =>
|
|
50
|
-
path.attributes('fill') === '#F4297E'
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
expect(notificationPath).toBeDefined();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// Test accessibility
|
|
58
|
-
describe('Accessibility', () => {
|
|
59
|
-
it('is accessible as a decorative icon', () => {
|
|
60
|
-
const wrapper = mount(CalendarNotification);
|
|
61
|
-
const svg = wrapper.find('svg');
|
|
62
|
-
|
|
63
|
-
// SVG exists and can be styled or have aria attributes added by parent
|
|
64
|
-
expect(svg.exists()).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('can accept additional attributes', () => {
|
|
68
|
-
const wrapper = mount(CalendarNotification, {
|
|
69
|
-
attrs: {
|
|
70
|
-
'aria-label': 'Calendar with notification',
|
|
71
|
-
role: 'img'
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
const svg = wrapper.find('svg');
|
|
76
|
-
expect(svg.attributes('aria-label')).toBe('Calendar with notification');
|
|
77
|
-
expect(svg.attributes('role')).toBe('img');
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Test styling and customization
|
|
82
|
-
describe('Styling', () => {
|
|
83
|
-
it('maintains consistent dimensions', () => {
|
|
84
|
-
const wrapper = mount(CalendarNotification);
|
|
85
|
-
const svg = wrapper.find('svg');
|
|
86
|
-
|
|
87
|
-
expect(svg.attributes('width')).toBe('22');
|
|
88
|
-
expect(svg.attributes('height')).toBe('20');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('can be styled with CSS classes', () => {
|
|
92
|
-
const wrapper = mount(CalendarNotification, {
|
|
93
|
-
attrs: {
|
|
94
|
-
class: 'custom-icon-class'
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
expect(wrapper.classes()).toContain('custom-icon-class');
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('preserves viewBox for scalability', () => {
|
|
102
|
-
const wrapper = mount(CalendarNotification);
|
|
103
|
-
const svg = wrapper.find('svg');
|
|
104
|
-
|
|
105
|
-
expect(svg.attributes('viewBox')).toBe('0 0 22 20');
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// Test edge cases
|
|
110
|
-
describe('Edge Cases', () => {
|
|
111
|
-
it('handles additional props without breaking', () => {
|
|
112
|
-
expect(() => {
|
|
113
|
-
mount(CalendarNotification, {
|
|
114
|
-
props: {
|
|
115
|
-
customProp: 'value'
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}).not.toThrow();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('works within different container sizes', () => {
|
|
122
|
-
const wrapper = mount(CalendarNotification, {
|
|
123
|
-
attrs: {
|
|
124
|
-
style: 'width: 44px; height: 40px;'
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
// SVG should still maintain its viewBox
|
|
129
|
-
const svg = wrapper.find('svg');
|
|
130
|
-
expect(svg.attributes('viewBox')).toBe('0 0 22 20');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// Test SVG structure integrity
|
|
135
|
-
describe('SVG Structure', () => {
|
|
136
|
-
it('has all required path elements for complete icon', () => {
|
|
137
|
-
const wrapper = mount(CalendarNotification);
|
|
138
|
-
const paths = wrapper.findAll('path');
|
|
139
|
-
|
|
140
|
-
// Calendar notification icon should have multiple paths
|
|
141
|
-
expect(paths.length).toBeGreaterThanOrEqual(10);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('maintains proper stroke and fill attributes', () => {
|
|
145
|
-
const wrapper = mount(CalendarNotification);
|
|
146
|
-
const paths = wrapper.findAll('path');
|
|
147
|
-
|
|
148
|
-
let hasStroke = false;
|
|
149
|
-
let hasFill = false;
|
|
150
|
-
|
|
151
|
-
paths.forEach(path => {
|
|
152
|
-
if (path.attributes('stroke')) hasStroke = true;
|
|
153
|
-
if (path.attributes('fill')) hasFill = true;
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
expect(hasStroke).toBe(true);
|
|
157
|
-
expect(hasFill).toBe(true);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('uses consistent stroke width', () => {
|
|
161
|
-
const wrapper = mount(CalendarNotification);
|
|
162
|
-
const paths = wrapper.findAll('path');
|
|
163
|
-
|
|
164
|
-
const strokePaths = paths.filter(path =>
|
|
165
|
-
path.attributes('stroke-width')
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
strokePaths.forEach(path => {
|
|
169
|
-
expect(path.attributes('stroke-width')).toBe('1.5');
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('uses proper stroke line properties', () => {
|
|
174
|
-
const wrapper = mount(CalendarNotification);
|
|
175
|
-
const paths = wrapper.findAll('path');
|
|
176
|
-
|
|
177
|
-
const strokePaths = paths.filter(path =>
|
|
178
|
-
path.attributes('stroke')
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
strokePaths.forEach(path => {
|
|
182
|
-
expect(path.attributes('stroke-linecap')).toBe('round');
|
|
183
|
-
expect(path.attributes('stroke-linejoin')).toBe('round');
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
});
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import CalendarNotification from '@components/Icons/CalendarNotification.vue';
|
|
4
|
+
|
|
5
|
+
describe('CalendarNotification Icon', () => {
|
|
6
|
+
// Test basic rendering
|
|
7
|
+
describe('Rendering', () => {
|
|
8
|
+
it('renders as SVG element', () => {
|
|
9
|
+
const wrapper = mount(CalendarNotification);
|
|
10
|
+
|
|
11
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('has correct SVG attributes', () => {
|
|
15
|
+
const wrapper = mount(CalendarNotification);
|
|
16
|
+
const svg = wrapper.find('svg');
|
|
17
|
+
|
|
18
|
+
expect(svg.attributes('width')).toBe('22');
|
|
19
|
+
expect(svg.attributes('height')).toBe('20');
|
|
20
|
+
expect(svg.attributes('viewBox')).toBe('0 0 22 20');
|
|
21
|
+
expect(svg.attributes('fill')).toBe('none');
|
|
22
|
+
expect(svg.attributes('xmlns')).toBe('http://www.w3.org/2000/svg');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('contains path elements', () => {
|
|
26
|
+
const wrapper = mount(CalendarNotification);
|
|
27
|
+
const paths = wrapper.findAll('path');
|
|
28
|
+
|
|
29
|
+
expect(paths.length).toBeGreaterThan(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('has calendar structure paths with correct stroke color', () => {
|
|
33
|
+
const wrapper = mount(CalendarNotification);
|
|
34
|
+
const paths = wrapper.findAll('path');
|
|
35
|
+
|
|
36
|
+
// Check that most paths have the expected stroke color
|
|
37
|
+
const strokePaths = paths.filter(path =>
|
|
38
|
+
path.attributes('stroke') === '#172774'
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
expect(strokePaths.length).toBeGreaterThan(0);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('has notification indicator with correct fill color', () => {
|
|
45
|
+
const wrapper = mount(CalendarNotification);
|
|
46
|
+
const paths = wrapper.findAll('path');
|
|
47
|
+
|
|
48
|
+
// Check for the notification circle with pink fill
|
|
49
|
+
const notificationPath = paths.find(path =>
|
|
50
|
+
path.attributes('fill') === '#F4297E'
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
expect(notificationPath).toBeDefined();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Test accessibility
|
|
58
|
+
describe('Accessibility', () => {
|
|
59
|
+
it('is accessible as a decorative icon', () => {
|
|
60
|
+
const wrapper = mount(CalendarNotification);
|
|
61
|
+
const svg = wrapper.find('svg');
|
|
62
|
+
|
|
63
|
+
// SVG exists and can be styled or have aria attributes added by parent
|
|
64
|
+
expect(svg.exists()).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('can accept additional attributes', () => {
|
|
68
|
+
const wrapper = mount(CalendarNotification, {
|
|
69
|
+
attrs: {
|
|
70
|
+
'aria-label': 'Calendar with notification',
|
|
71
|
+
role: 'img'
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const svg = wrapper.find('svg');
|
|
76
|
+
expect(svg.attributes('aria-label')).toBe('Calendar with notification');
|
|
77
|
+
expect(svg.attributes('role')).toBe('img');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Test styling and customization
|
|
82
|
+
describe('Styling', () => {
|
|
83
|
+
it('maintains consistent dimensions', () => {
|
|
84
|
+
const wrapper = mount(CalendarNotification);
|
|
85
|
+
const svg = wrapper.find('svg');
|
|
86
|
+
|
|
87
|
+
expect(svg.attributes('width')).toBe('22');
|
|
88
|
+
expect(svg.attributes('height')).toBe('20');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('can be styled with CSS classes', () => {
|
|
92
|
+
const wrapper = mount(CalendarNotification, {
|
|
93
|
+
attrs: {
|
|
94
|
+
class: 'custom-icon-class'
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(wrapper.classes()).toContain('custom-icon-class');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('preserves viewBox for scalability', () => {
|
|
102
|
+
const wrapper = mount(CalendarNotification);
|
|
103
|
+
const svg = wrapper.find('svg');
|
|
104
|
+
|
|
105
|
+
expect(svg.attributes('viewBox')).toBe('0 0 22 20');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Test edge cases
|
|
110
|
+
describe('Edge Cases', () => {
|
|
111
|
+
it('handles additional props without breaking', () => {
|
|
112
|
+
expect(() => {
|
|
113
|
+
mount(CalendarNotification, {
|
|
114
|
+
props: {
|
|
115
|
+
customProp: 'value'
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}).not.toThrow();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('works within different container sizes', () => {
|
|
122
|
+
const wrapper = mount(CalendarNotification, {
|
|
123
|
+
attrs: {
|
|
124
|
+
style: 'width: 44px; height: 40px;'
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// SVG should still maintain its viewBox
|
|
129
|
+
const svg = wrapper.find('svg');
|
|
130
|
+
expect(svg.attributes('viewBox')).toBe('0 0 22 20');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Test SVG structure integrity
|
|
135
|
+
describe('SVG Structure', () => {
|
|
136
|
+
it('has all required path elements for complete icon', () => {
|
|
137
|
+
const wrapper = mount(CalendarNotification);
|
|
138
|
+
const paths = wrapper.findAll('path');
|
|
139
|
+
|
|
140
|
+
// Calendar notification icon should have multiple paths
|
|
141
|
+
expect(paths.length).toBeGreaterThanOrEqual(10);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('maintains proper stroke and fill attributes', () => {
|
|
145
|
+
const wrapper = mount(CalendarNotification);
|
|
146
|
+
const paths = wrapper.findAll('path');
|
|
147
|
+
|
|
148
|
+
let hasStroke = false;
|
|
149
|
+
let hasFill = false;
|
|
150
|
+
|
|
151
|
+
paths.forEach(path => {
|
|
152
|
+
if (path.attributes('stroke')) hasStroke = true;
|
|
153
|
+
if (path.attributes('fill')) hasFill = true;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
expect(hasStroke).toBe(true);
|
|
157
|
+
expect(hasFill).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('uses consistent stroke width', () => {
|
|
161
|
+
const wrapper = mount(CalendarNotification);
|
|
162
|
+
const paths = wrapper.findAll('path');
|
|
163
|
+
|
|
164
|
+
const strokePaths = paths.filter(path =>
|
|
165
|
+
path.attributes('stroke-width')
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
strokePaths.forEach(path => {
|
|
169
|
+
expect(path.attributes('stroke-width')).toBe('1.5');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('uses proper stroke line properties', () => {
|
|
174
|
+
const wrapper = mount(CalendarNotification);
|
|
175
|
+
const paths = wrapper.findAll('path');
|
|
176
|
+
|
|
177
|
+
const strokePaths = paths.filter(path =>
|
|
178
|
+
path.attributes('stroke')
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
strokePaths.forEach(path => {
|
|
182
|
+
expect(path.attributes('stroke-linecap')).toBe('round');
|
|
183
|
+
expect(path.attributes('stroke-linejoin')).toBe('round');
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
187
|
});
|