@zap-wunschlachen/wl-shared-components 1.0.38 → 1.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/playwright.yml +205 -205
- package/.github/workflows/static.yml +61 -61
- package/.github/workflows/update-snapshots.yml +37 -37
- package/.prettierrc +5 -5
- package/.storybook/main.ts +18 -18
- package/.storybook/preview.ts +37 -37
- package/.storybook/storyWrapper.vue +18 -18
- package/.storybook/withVuetifyTheme.decorator.ts +21 -21
- package/App.vue +33 -33
- 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 +234 -232
- package/src/assets/css/variables.css +112 -109
- package/src/components/Accordion/Accordion.css +59 -59
- package/src/components/Accordion/AccordionGroup.vue +51 -51
- package/src/components/Accordion/AccordionItem.vue +66 -66
- package/src/components/Appointment/Card/Actions.css +54 -54
- package/src/components/Appointment/Card/Actions.vue +99 -99
- package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
- package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
- package/src/components/Appointment/Card/Card.css +80 -80
- package/src/components/Appointment/Card/Card.vue +93 -93
- package/src/components/Appointment/Card/Details.css +50 -50
- package/src/components/Appointment/Card/Details.vue +43 -43
- package/src/components/Audio/Audio.vue +187 -187
- package/src/components/Audio/Waveform.vue +118 -118
- package/src/components/Button/Button.vue +174 -174
- package/src/components/CheckBox/CheckBox.css +214 -214
- package/src/components/CheckBox/Checkbox.vue +138 -138
- package/src/components/DateInput/DateInput.css +2 -2
- package/src/components/DateInput/DateInput.vue +262 -262
- package/src/components/Dialog/Dialog.css +6 -6
- package/src/components/Dialog/Dialog.vue +38 -38
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +202 -202
- package/src/components/ErrorPage/ErrorPage.css +172 -172
- package/src/components/IconBullet/IconBullet.vue +86 -86
- package/src/components/IconBullet/IconBulletList.vue +41 -41
- package/src/components/Icons/AdvanceAppointments.vue +153 -153
- package/src/components/Icons/Audio/CloudFailed.vue +20 -20
- package/src/components/Icons/Audio/CloudSaved.vue +21 -21
- package/src/components/Icons/Audio/Delete.vue +15 -15
- package/src/components/Icons/Audio/Pause.vue +18 -18
- package/src/components/Icons/Audio/Play.vue +15 -15
- package/src/components/Icons/{calendar.vue → Calendar.vue} +17 -17
- 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/checkbox.vue +19 -19
- package/src/components/Icons/outlineChecked.vue +27 -27
- package/src/components/Icons/play.vue +5 -5
- package/src/components/Input/Input.css +187 -187
- package/src/components/Input/Input.vue +253 -253
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
- package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
- package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
- package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
- package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
- package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
- package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
- package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
- package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
- package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
- package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
- package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
- package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
- package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
- package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
- package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
- package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
- package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
- package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
- package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
- package/src/components/Loader/Loader.css +71 -71
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -127
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
- package/src/components/Modal/Modal.css +5 -5
- package/src/components/Modal/Modal.vue +22 -22
- package/src/components/NotificationBubble/NotificationBubble.css +4 -4
- package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
- package/src/components/OtpInput/OtpInput.css +39 -39
- package/src/components/OtpInput/OtpInput.vue +151 -151
- package/src/components/PhoneInput/PhoneInput.css +31 -31
- package/src/components/PhoneInput/PhoneInput.vue +113 -113
- package/src/components/Select/Select.css +150 -150
- package/src/components/Select/Select.vue +316 -316
- package/src/components/TextArea/TextArea.css +3 -3
- package/src/components/TextArea/TextArea.vue +126 -126
- package/src/components/TickBox/TickBox.css +49 -49
- package/src/components/TickBox/TickBox.vue +126 -126
- package/src/components/accessibility.css +218 -218
- package/src/components/index.ts +29 -29
- 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 +116 -109
- package/src/vite-env.d.ts +1 -1
- package/tests/e2e/README.md +220 -220
- package/tests/e2e/accessibility.spec.ts +638 -638
- package/tests/e2e/accordion.spec.ts +42 -42
- package/tests/e2e/additional-components.spec.ts +437 -437
- package/tests/e2e/all-components.spec.ts +135 -135
- package/tests/e2e/appointment-card.spec.ts +816 -816
- package/tests/e2e/button-fixed.spec.ts +58 -58
- package/tests/e2e/button.spec.ts +76 -76
- package/tests/e2e/checkbox.spec.ts +50 -50
- package/tests/e2e/date-input.spec.ts +46 -46
- package/tests/e2e/debug.spec.ts +51 -51
- package/tests/e2e/dialog.spec.ts +58 -58
- package/tests/e2e/input.spec.ts +55 -55
- package/tests/e2e/laboratory-components.spec.ts +320 -320
- package/tests/e2e/otp-input.spec.ts +50 -50
- package/tests/e2e/select.spec.ts +52 -52
- package/tests/e2e/storybook-utils.ts +59 -59
- package/tests/e2e/test-basic.spec.ts +33 -33
- package/tests/e2e/visual-regression.spec.ts +350 -350
- package/tests/unit/accessibility/component-a11y.spec.ts +469 -469
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -292
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
- package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
- package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
- package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
- package/tests/unit/components/Audio/Audio.spec.ts +403 -403
- package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
- package/tests/unit/components/Background/Background.spec.ts +177 -177
- package/tests/unit/components/Core/Button.spec.ts +336 -336
- package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
- package/tests/unit/components/Core/DateInput.spec.ts +690 -690
- package/tests/unit/components/Core/Dialog.spec.ts +485 -485
- package/tests/unit/components/Core/EditField.spec.ts +782 -782
- package/tests/unit/components/Core/Input.spec.ts +512 -512
- package/tests/unit/components/Core/Modal.spec.ts +518 -518
- package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
- package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
- package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
- package/tests/unit/components/Core/Select.spec.ts +712 -712
- package/tests/unit/components/Core/TextArea.spec.ts +565 -565
- package/tests/unit/components/Core/TickBox.spec.ts +779 -779
- package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -313
- package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
- package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
- package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
- package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +61 -61
- package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
- package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
- package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
- package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
- package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
- package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
- package/tests/unit/components/Icons/Chair.spec.ts +234 -234
- package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
- package/tests/unit/components/Icons/Circle.spec.ts +255 -255
- package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
- package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
- package/tests/unit/components/Icons/Group3.spec.ts +355 -355
- package/tests/unit/components/Icons/Logo.spec.ts +228 -228
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
- package/tests/unit/components/Icons/calendar.spec.ts +286 -286
- package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
- package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
- package/tests/unit/components/Icons/play.spec.ts +308 -308
- package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
- package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
- package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
- package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
- package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
- package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
- package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
- package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
- package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
- package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
- package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
- package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
- package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
- package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
- package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
- package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
- package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
- package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
- package/tests/unit/components/Loader/Loader.spec.ts +197 -197
- package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
- package/tests/unit/constants/iconEnums.spec.ts +39 -39
- package/tests/unit/i18n/i18n.spec.ts +88 -88
- package/tests/unit/plugins/vuetify.spec.ts +220 -220
- package/tests/unit/setup.ts +189 -189
- package/tests/unit/src/components/index.spec.ts.skip +192 -192
- package/tests/unit/src/index.spec.ts.skip +182 -182
- package/tests/unit/src/main.spec.ts +151 -151
- package/tests/unit/utils/accessibility.spec.ts +318 -318
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
|
@@ -1,228 +1,228 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import Logo from '@components/Icons/Logo.vue';
|
|
4
|
-
|
|
5
|
-
// Mock siteColors
|
|
6
|
-
vi.mock('@/utils/index', () => ({
|
|
7
|
-
siteColors: {
|
|
8
|
-
domain: 'domain-dental',
|
|
9
|
-
font_color_code: '#172774'
|
|
10
|
-
}
|
|
11
|
-
}));
|
|
12
|
-
|
|
13
|
-
describe('Logo', () => {
|
|
14
|
-
describe('Default Behavior', () => {
|
|
15
|
-
it('renders SVG element', () => {
|
|
16
|
-
const wrapper = mount(Logo);
|
|
17
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('renders with default dimensions', () => {
|
|
21
|
-
const wrapper = mount(Logo);
|
|
22
|
-
const svg = wrapper.find('svg');
|
|
23
|
-
expect(svg.attributes('width')).toBe('120');
|
|
24
|
-
expect(svg.attributes('height')).toBe('30');
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
describe('Props', () => {
|
|
29
|
-
it('accepts custom width', () => {
|
|
30
|
-
const wrapper = mount(Logo, {
|
|
31
|
-
props: { width: '200' }
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const svg = wrapper.find('svg');
|
|
35
|
-
expect(svg.attributes('width')).toBe('200');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('accepts custom height', () => {
|
|
39
|
-
const wrapper = mount(Logo, {
|
|
40
|
-
props: { height: '50' }
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
const svg = wrapper.find('svg');
|
|
44
|
-
expect(svg.attributes('height')).toBe('50');
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('accepts custom domain', () => {
|
|
48
|
-
const wrapper = mount(Logo, {
|
|
49
|
-
props: { domain: 'domain-cocoon' }
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
expect(wrapper.vm.domain).toBe('domain-cocoon');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('uses siteColors domain when domain prop is empty', () => {
|
|
56
|
-
const wrapper = mount(Logo, {
|
|
57
|
-
props: { domain: '' }
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// Should fall back to siteColors domain (dental)
|
|
61
|
-
const svg = wrapper.find('svg');
|
|
62
|
-
expect(svg.attributes('viewBox')).toBe('0 0 120 43');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
describe('Domain-specific Rendering', () => {
|
|
67
|
-
it('renders dental logo by default', () => {
|
|
68
|
-
const wrapper = mount(Logo);
|
|
69
|
-
|
|
70
|
-
const svg = wrapper.find('svg');
|
|
71
|
-
expect(svg.attributes('viewBox')).toBe('0 0 120 43');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('renders cocoon logo when domain is domain-cocoon', () => {
|
|
75
|
-
const wrapper = mount(Logo, {
|
|
76
|
-
props: { domain: 'domain-cocoon' }
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
const svg = wrapper.find('svg');
|
|
80
|
-
expect(svg.attributes('viewBox')).toBe('0 0 124 41');
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
describe('SVG Structure', () => {
|
|
85
|
-
it('has proper viewBox attribute', () => {
|
|
86
|
-
const wrapper = mount(Logo);
|
|
87
|
-
const svg = wrapper.find('svg');
|
|
88
|
-
expect(svg.attributes('viewBox')).toBeDefined();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('contains path elements', () => {
|
|
92
|
-
const wrapper = mount(Logo);
|
|
93
|
-
const paths = wrapper.findAll('path');
|
|
94
|
-
expect(paths.length).toBeGreaterThan(0);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('has fill attribute on paths', () => {
|
|
98
|
-
const wrapper = mount(Logo);
|
|
99
|
-
const paths = wrapper.findAll('path');
|
|
100
|
-
|
|
101
|
-
paths.forEach(path => {
|
|
102
|
-
expect(path.attributes('fill')).toBeDefined();
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
describe('Accessibility', () => {
|
|
108
|
-
it('SVG can be used as decorative image', () => {
|
|
109
|
-
// By default the Logo should render an SVG without an accessible name
|
|
110
|
-
const wrapper = mount(Logo);
|
|
111
|
-
const svg = wrapper.find('svg');
|
|
112
|
-
expect(svg.exists()).toBe(true);
|
|
113
|
-
|
|
114
|
-
// Decorative by default: no aria-label and should be hidden from assistive tech
|
|
115
|
-
expect(svg.attributes('aria-label')).toBeUndefined();
|
|
116
|
-
// If the component is used decoratively, authors may add aria-hidden
|
|
117
|
-
// but by default we ensure no accessible name is present
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('exposes accessible name when labelled via attributes', () => {
|
|
121
|
-
const wrapper = mount(Logo, {
|
|
122
|
-
attrs: {
|
|
123
|
-
'aria-label': 'Company Logo',
|
|
124
|
-
role: 'img'
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const svg = wrapper.find('svg');
|
|
129
|
-
expect(svg.exists()).toBe(true);
|
|
130
|
-
expect(svg.attributes('aria-label')).toBe('Company Logo');
|
|
131
|
-
expect(svg.attributes('role')).toBe('img');
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it('has appropriate namespace', () => {
|
|
135
|
-
const wrapper = mount(Logo);
|
|
136
|
-
const svg = wrapper.find('svg');
|
|
137
|
-
expect(svg.attributes('xmlns')).toBe('http://www.w3.org/2000/svg');
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('renders without visual errors', () => {
|
|
141
|
-
const wrapper = mount(Logo, {
|
|
142
|
-
props: {
|
|
143
|
-
width: '100',
|
|
144
|
-
height: '25'
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
149
|
-
expect(wrapper.findAll('path').length).toBeGreaterThan(0);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
describe('Theming', () => {
|
|
154
|
-
it('applies font color from siteColors', () => {
|
|
155
|
-
const wrapper = mount(Logo);
|
|
156
|
-
const paths = wrapper.findAll('path');
|
|
157
|
-
|
|
158
|
-
// All paths should use the theme color
|
|
159
|
-
expect(paths.length).toBeGreaterThan(0);
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
describe('Edge Cases', () => {
|
|
164
|
-
it('handles zero dimensions', () => {
|
|
165
|
-
const wrapper = mount(Logo, {
|
|
166
|
-
props: {
|
|
167
|
-
width: '0',
|
|
168
|
-
height: '0'
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
const svg = wrapper.find('svg');
|
|
173
|
-
expect(svg.attributes('width')).toBe('0');
|
|
174
|
-
expect(svg.attributes('height')).toBe('0');
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('handles very large dimensions', () => {
|
|
178
|
-
const wrapper = mount(Logo, {
|
|
179
|
-
props: {
|
|
180
|
-
width: '1000',
|
|
181
|
-
height: '500'
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
const svg = wrapper.find('svg');
|
|
186
|
-
expect(svg.attributes('width')).toBe('1000');
|
|
187
|
-
expect(svg.attributes('height')).toBe('500');
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('handles empty string domain', () => {
|
|
191
|
-
const wrapper = mount(Logo, {
|
|
192
|
-
props: { domain: '' }
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('handles unknown domain gracefully', () => {
|
|
199
|
-
const wrapper = mount(Logo, {
|
|
200
|
-
props: { domain: 'unknown-domain' }
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// Should still render (falls back to dental)
|
|
204
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
describe('Size Variations', () => {
|
|
209
|
-
const sizes = [
|
|
210
|
-
{ width: '50', height: '15' },
|
|
211
|
-
{ width: '120', height: '30' },
|
|
212
|
-
{ width: '200', height: '50' },
|
|
213
|
-
{ width: '400', height: '100' }
|
|
214
|
-
];
|
|
215
|
-
|
|
216
|
-
sizes.forEach(({ width, height }) => {
|
|
217
|
-
it(`renders correctly at ${width}x${height}`, () => {
|
|
218
|
-
const wrapper = mount(Logo, {
|
|
219
|
-
props: { width, height }
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
const svg = wrapper.find('svg');
|
|
223
|
-
expect(svg.attributes('width')).toBe(width);
|
|
224
|
-
expect(svg.attributes('height')).toBe(height);
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
});
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import Logo from '@components/Icons/Logo.vue';
|
|
4
|
+
|
|
5
|
+
// Mock siteColors
|
|
6
|
+
vi.mock('@/utils/index', () => ({
|
|
7
|
+
siteColors: {
|
|
8
|
+
domain: 'domain-dental',
|
|
9
|
+
font_color_code: '#172774'
|
|
10
|
+
}
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
describe('Logo', () => {
|
|
14
|
+
describe('Default Behavior', () => {
|
|
15
|
+
it('renders SVG element', () => {
|
|
16
|
+
const wrapper = mount(Logo);
|
|
17
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders with default dimensions', () => {
|
|
21
|
+
const wrapper = mount(Logo);
|
|
22
|
+
const svg = wrapper.find('svg');
|
|
23
|
+
expect(svg.attributes('width')).toBe('120');
|
|
24
|
+
expect(svg.attributes('height')).toBe('30');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe('Props', () => {
|
|
29
|
+
it('accepts custom width', () => {
|
|
30
|
+
const wrapper = mount(Logo, {
|
|
31
|
+
props: { width: '200' }
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const svg = wrapper.find('svg');
|
|
35
|
+
expect(svg.attributes('width')).toBe('200');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('accepts custom height', () => {
|
|
39
|
+
const wrapper = mount(Logo, {
|
|
40
|
+
props: { height: '50' }
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const svg = wrapper.find('svg');
|
|
44
|
+
expect(svg.attributes('height')).toBe('50');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('accepts custom domain', () => {
|
|
48
|
+
const wrapper = mount(Logo, {
|
|
49
|
+
props: { domain: 'domain-cocoon' }
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
expect(wrapper.vm.domain).toBe('domain-cocoon');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('uses siteColors domain when domain prop is empty', () => {
|
|
56
|
+
const wrapper = mount(Logo, {
|
|
57
|
+
props: { domain: '' }
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Should fall back to siteColors domain (dental)
|
|
61
|
+
const svg = wrapper.find('svg');
|
|
62
|
+
expect(svg.attributes('viewBox')).toBe('0 0 120 43');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('Domain-specific Rendering', () => {
|
|
67
|
+
it('renders dental logo by default', () => {
|
|
68
|
+
const wrapper = mount(Logo);
|
|
69
|
+
|
|
70
|
+
const svg = wrapper.find('svg');
|
|
71
|
+
expect(svg.attributes('viewBox')).toBe('0 0 120 43');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('renders cocoon logo when domain is domain-cocoon', () => {
|
|
75
|
+
const wrapper = mount(Logo, {
|
|
76
|
+
props: { domain: 'domain-cocoon' }
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const svg = wrapper.find('svg');
|
|
80
|
+
expect(svg.attributes('viewBox')).toBe('0 0 124 41');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('SVG Structure', () => {
|
|
85
|
+
it('has proper viewBox attribute', () => {
|
|
86
|
+
const wrapper = mount(Logo);
|
|
87
|
+
const svg = wrapper.find('svg');
|
|
88
|
+
expect(svg.attributes('viewBox')).toBeDefined();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('contains path elements', () => {
|
|
92
|
+
const wrapper = mount(Logo);
|
|
93
|
+
const paths = wrapper.findAll('path');
|
|
94
|
+
expect(paths.length).toBeGreaterThan(0);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('has fill attribute on paths', () => {
|
|
98
|
+
const wrapper = mount(Logo);
|
|
99
|
+
const paths = wrapper.findAll('path');
|
|
100
|
+
|
|
101
|
+
paths.forEach(path => {
|
|
102
|
+
expect(path.attributes('fill')).toBeDefined();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe('Accessibility', () => {
|
|
108
|
+
it('SVG can be used as decorative image', () => {
|
|
109
|
+
// By default the Logo should render an SVG without an accessible name
|
|
110
|
+
const wrapper = mount(Logo);
|
|
111
|
+
const svg = wrapper.find('svg');
|
|
112
|
+
expect(svg.exists()).toBe(true);
|
|
113
|
+
|
|
114
|
+
// Decorative by default: no aria-label and should be hidden from assistive tech
|
|
115
|
+
expect(svg.attributes('aria-label')).toBeUndefined();
|
|
116
|
+
// If the component is used decoratively, authors may add aria-hidden
|
|
117
|
+
// but by default we ensure no accessible name is present
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('exposes accessible name when labelled via attributes', () => {
|
|
121
|
+
const wrapper = mount(Logo, {
|
|
122
|
+
attrs: {
|
|
123
|
+
'aria-label': 'Company Logo',
|
|
124
|
+
role: 'img'
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const svg = wrapper.find('svg');
|
|
129
|
+
expect(svg.exists()).toBe(true);
|
|
130
|
+
expect(svg.attributes('aria-label')).toBe('Company Logo');
|
|
131
|
+
expect(svg.attributes('role')).toBe('img');
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('has appropriate namespace', () => {
|
|
135
|
+
const wrapper = mount(Logo);
|
|
136
|
+
const svg = wrapper.find('svg');
|
|
137
|
+
expect(svg.attributes('xmlns')).toBe('http://www.w3.org/2000/svg');
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('renders without visual errors', () => {
|
|
141
|
+
const wrapper = mount(Logo, {
|
|
142
|
+
props: {
|
|
143
|
+
width: '100',
|
|
144
|
+
height: '25'
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
149
|
+
expect(wrapper.findAll('path').length).toBeGreaterThan(0);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe('Theming', () => {
|
|
154
|
+
it('applies font color from siteColors', () => {
|
|
155
|
+
const wrapper = mount(Logo);
|
|
156
|
+
const paths = wrapper.findAll('path');
|
|
157
|
+
|
|
158
|
+
// All paths should use the theme color
|
|
159
|
+
expect(paths.length).toBeGreaterThan(0);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
describe('Edge Cases', () => {
|
|
164
|
+
it('handles zero dimensions', () => {
|
|
165
|
+
const wrapper = mount(Logo, {
|
|
166
|
+
props: {
|
|
167
|
+
width: '0',
|
|
168
|
+
height: '0'
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const svg = wrapper.find('svg');
|
|
173
|
+
expect(svg.attributes('width')).toBe('0');
|
|
174
|
+
expect(svg.attributes('height')).toBe('0');
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('handles very large dimensions', () => {
|
|
178
|
+
const wrapper = mount(Logo, {
|
|
179
|
+
props: {
|
|
180
|
+
width: '1000',
|
|
181
|
+
height: '500'
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const svg = wrapper.find('svg');
|
|
186
|
+
expect(svg.attributes('width')).toBe('1000');
|
|
187
|
+
expect(svg.attributes('height')).toBe('500');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('handles empty string domain', () => {
|
|
191
|
+
const wrapper = mount(Logo, {
|
|
192
|
+
props: { domain: '' }
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('handles unknown domain gracefully', () => {
|
|
199
|
+
const wrapper = mount(Logo, {
|
|
200
|
+
props: { domain: 'unknown-domain' }
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Should still render (falls back to dental)
|
|
204
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe('Size Variations', () => {
|
|
209
|
+
const sizes = [
|
|
210
|
+
{ width: '50', height: '15' },
|
|
211
|
+
{ width: '120', height: '30' },
|
|
212
|
+
{ width: '200', height: '50' },
|
|
213
|
+
{ width: '400', height: '100' }
|
|
214
|
+
];
|
|
215
|
+
|
|
216
|
+
sizes.forEach(({ width, height }) => {
|
|
217
|
+
it(`renders correctly at ${width}x${height}`, () => {
|
|
218
|
+
const wrapper = mount(Logo, {
|
|
219
|
+
props: { width, height }
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const svg = wrapper.find('svg');
|
|
223
|
+
expect(svg.attributes('width')).toBe(width);
|
|
224
|
+
expect(svg.attributes('height')).toBe(height);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
});
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import MiniLogo from '@components/Icons/MiniLogo.vue';
|
|
4
|
-
|
|
5
|
-
// Mock siteColors
|
|
6
|
-
vi.mock('@/utils/index', () => ({
|
|
7
|
-
siteColors: {
|
|
8
|
-
font_color_code: '#172774'
|
|
9
|
-
}
|
|
10
|
-
}));
|
|
11
|
-
|
|
12
|
-
describe('MiniLogo', () => {
|
|
13
|
-
describe('Default Behavior', () => {
|
|
14
|
-
it('renders SVG element', () => {
|
|
15
|
-
const wrapper = mount(MiniLogo);
|
|
16
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
describe('Accessibility', () => {
|
|
21
|
-
it('has accessible attributes', () => {
|
|
22
|
-
const wrapper = mount(MiniLogo);
|
|
23
|
-
const svg = wrapper.find('svg');
|
|
24
|
-
expect(svg.exists()).toBe(true);
|
|
25
|
-
// Add checks for actual accessibility attributes:
|
|
26
|
-
// expect(svg.attributes('role')).toBe('img');
|
|
27
|
-
// expect(svg.attributes('aria-label')).toBeTruthy();
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe('Visual Structure', () => {
|
|
32
|
-
it('contains path elements for logo rendering', () => {
|
|
33
|
-
const wrapper = mount(MiniLogo);
|
|
34
|
-
const paths = wrapper.findAll('path');
|
|
35
|
-
expect(paths.length).toBeGreaterThan(0);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
});
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import MiniLogo from '@components/Icons/MiniLogo.vue';
|
|
4
|
+
|
|
5
|
+
// Mock siteColors
|
|
6
|
+
vi.mock('@/utils/index', () => ({
|
|
7
|
+
siteColors: {
|
|
8
|
+
font_color_code: '#172774'
|
|
9
|
+
}
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
describe('MiniLogo', () => {
|
|
13
|
+
describe('Default Behavior', () => {
|
|
14
|
+
it('renders SVG element', () => {
|
|
15
|
+
const wrapper = mount(MiniLogo);
|
|
16
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('Accessibility', () => {
|
|
21
|
+
it('has accessible attributes', () => {
|
|
22
|
+
const wrapper = mount(MiniLogo);
|
|
23
|
+
const svg = wrapper.find('svg');
|
|
24
|
+
expect(svg.exists()).toBe(true);
|
|
25
|
+
// Add checks for actual accessibility attributes:
|
|
26
|
+
// expect(svg.attributes('role')).toBe('img');
|
|
27
|
+
// expect(svg.attributes('aria-label')).toBeTruthy();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('Visual Structure', () => {
|
|
32
|
+
it('contains path elements for logo rendering', () => {
|
|
33
|
+
const wrapper = mount(MiniLogo);
|
|
34
|
+
const paths = wrapper.findAll('path');
|
|
35
|
+
expect(paths.length).toBeGreaterThan(0);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|