@zap-wunschlachen/wl-shared-components 1.0.38 → 1.0.40
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,197 +1,197 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import Loader from '@components/Loader/Loader.vue';
|
|
4
|
-
|
|
5
|
-
// Mock siteColors
|
|
6
|
-
vi.mock('@/utils/index', () => ({
|
|
7
|
-
siteColors: {
|
|
8
|
-
font_color_code: '#172774'
|
|
9
|
-
}
|
|
10
|
-
}));
|
|
11
|
-
|
|
12
|
-
describe('Loader', () => {
|
|
13
|
-
describe('Default Behavior', () => {
|
|
14
|
-
it('renders with default props', () => {
|
|
15
|
-
const wrapper = mount(Loader);
|
|
16
|
-
|
|
17
|
-
expect(wrapper.find('.loader-container').exists()).toBe(true);
|
|
18
|
-
expect(wrapper.find('.loader-svg').exists()).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('renders spinner SVG', () => {
|
|
22
|
-
const wrapper = mount(Loader);
|
|
23
|
-
expect(wrapper.find('svg').exists()).toBe(true);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('applies default size of 96px', () => {
|
|
27
|
-
const wrapper = mount(Loader);
|
|
28
|
-
expect(wrapper.vm.size).toBe(96);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('Props', () => {
|
|
33
|
-
it('accepts custom size prop', () => {
|
|
34
|
-
const wrapper = mount(Loader, {
|
|
35
|
-
props: {
|
|
36
|
-
size: 48
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
expect(wrapper.vm.size).toBe(48);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('applies size to SVG element', () => {
|
|
44
|
-
const wrapper = mount(Loader, {
|
|
45
|
-
props: {
|
|
46
|
-
size: 64
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const svg = wrapper.find('.loader-svg');
|
|
51
|
-
expect(svg.attributes('style')).toContain('width: 64px');
|
|
52
|
-
expect(svg.attributes('style')).toContain('height: 64px');
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
describe('Accessibility', () => {
|
|
57
|
-
it('has role="alert" for screen readers', () => {
|
|
58
|
-
const wrapper = mount(Loader);
|
|
59
|
-
expect(wrapper.find('[role="alert"]').exists()).toBe(true);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('has aria-live="assertive" for immediate announcement', () => {
|
|
63
|
-
const wrapper = mount(Loader);
|
|
64
|
-
expect(wrapper.find('[aria-live="assertive"]').exists()).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('has aria-busy="true" to indicate loading state', () => {
|
|
68
|
-
const wrapper = mount(Loader);
|
|
69
|
-
expect(wrapper.find('[aria-busy="true"]').exists()).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('has role="status" for the spinner', () => {
|
|
73
|
-
const wrapper = mount(Loader);
|
|
74
|
-
expect(wrapper.find('[role="status"]').exists()).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('has aria-hidden="true" on decorative SVG', () => {
|
|
78
|
-
const wrapper = mount(Loader);
|
|
79
|
-
const svg = wrapper.find('svg');
|
|
80
|
-
expect(svg.attributes('aria-hidden')).toBe('true');
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('provides proper semantic structure for assistive technologies', () => {
|
|
84
|
-
const wrapper = mount(Loader);
|
|
85
|
-
|
|
86
|
-
// Container announces loading state
|
|
87
|
-
const container = wrapper.find('.loader-container');
|
|
88
|
-
expect(container.attributes('role')).toBe('alert');
|
|
89
|
-
expect(container.attributes('aria-live')).toBe('assertive');
|
|
90
|
-
expect(container.attributes('aria-busy')).toBe('true');
|
|
91
|
-
|
|
92
|
-
// Inner status provides spinner context
|
|
93
|
-
const status = wrapper.find('[role="status"]');
|
|
94
|
-
expect(status.exists()).toBe(true);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('follows WCAG 2.1 guidelines for loading indicators', () => {
|
|
98
|
-
const wrapper = mount(Loader);
|
|
99
|
-
|
|
100
|
-
// Should have proper ARIA attributes
|
|
101
|
-
expect(wrapper.find('[aria-busy]').exists()).toBe(true);
|
|
102
|
-
expect(wrapper.find('[aria-live]').exists()).toBe(true);
|
|
103
|
-
|
|
104
|
-
// SVG should be hidden from screen readers
|
|
105
|
-
expect(wrapper.find('svg[aria-hidden="true"]').exists()).toBe(true);
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
describe('Visual Structure', () => {
|
|
110
|
-
it('has loader-container wrapper', () => {
|
|
111
|
-
const wrapper = mount(Loader);
|
|
112
|
-
expect(wrapper.find('.loader-container').exists()).toBe(true);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('has loader-content for centering', () => {
|
|
116
|
-
const wrapper = mount(Loader);
|
|
117
|
-
expect(wrapper.find('.loader-content').exists()).toBe(true);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('contains animated spinner arc', () => {
|
|
121
|
-
const wrapper = mount(Loader);
|
|
122
|
-
expect(wrapper.find('.loader-spinner-arc').exists()).toBe(true);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
describe('SVG Content', () => {
|
|
127
|
-
it('renders SVG with proper viewBox', () => {
|
|
128
|
-
const wrapper = mount(Loader);
|
|
129
|
-
const svg = wrapper.find('svg');
|
|
130
|
-
expect(svg.attributes('viewBox')).toBe('0 0 100 101');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('renders path elements for spinner', () => {
|
|
134
|
-
const wrapper = mount(Loader);
|
|
135
|
-
const paths = wrapper.findAll('path');
|
|
136
|
-
expect(paths.length).toBeGreaterThan(0);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('renders W logo in the center', () => {
|
|
140
|
-
const wrapper = mount(Loader);
|
|
141
|
-
// The W logo is inside a g element
|
|
142
|
-
const gElements = wrapper.findAll('g');
|
|
143
|
-
expect(gElements.length).toBeGreaterThan(0);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe('Size Variations', () => {
|
|
148
|
-
it('handles small size (24px)', () => {
|
|
149
|
-
const wrapper = mount(Loader, {
|
|
150
|
-
props: { size: 24 }
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
const svg = wrapper.find('.loader-svg');
|
|
154
|
-
expect(svg.attributes('style')).toContain('width: 24px');
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('handles large size (200px)', () => {
|
|
158
|
-
const wrapper = mount(Loader, {
|
|
159
|
-
props: { size: 200 }
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
const svg = wrapper.find('.loader-svg');
|
|
163
|
-
expect(svg.attributes('style')).toContain('width: 200px');
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('handles zero size gracefully', () => {
|
|
167
|
-
const wrapper = mount(Loader, {
|
|
168
|
-
props: { size: 0 }
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
expect(wrapper.vm.size).toBe(0);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
describe('Edge Cases', () => {
|
|
176
|
-
it('renders without props', () => {
|
|
177
|
-
const wrapper = mount(Loader);
|
|
178
|
-
expect(wrapper.find('.loader-container').exists()).toBe(true);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('maintains structure with undefined size', () => {
|
|
182
|
-
const wrapper = mount(Loader, {
|
|
183
|
-
props: { size: undefined }
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// Should fall back to default size
|
|
187
|
-
expect(wrapper.vm.size).toBe(96);
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
describe('Animation', () => {
|
|
192
|
-
it('has animated spinner arc class', () => {
|
|
193
|
-
const wrapper = mount(Loader);
|
|
194
|
-
expect(wrapper.find('.loader-spinner-arc').exists()).toBe(true);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
});
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import Loader from '@components/Loader/Loader.vue';
|
|
4
|
+
|
|
5
|
+
// Mock siteColors
|
|
6
|
+
vi.mock('@/utils/index', () => ({
|
|
7
|
+
siteColors: {
|
|
8
|
+
font_color_code: '#172774'
|
|
9
|
+
}
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
describe('Loader', () => {
|
|
13
|
+
describe('Default Behavior', () => {
|
|
14
|
+
it('renders with default props', () => {
|
|
15
|
+
const wrapper = mount(Loader);
|
|
16
|
+
|
|
17
|
+
expect(wrapper.find('.loader-container').exists()).toBe(true);
|
|
18
|
+
expect(wrapper.find('.loader-svg').exists()).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('renders spinner SVG', () => {
|
|
22
|
+
const wrapper = mount(Loader);
|
|
23
|
+
expect(wrapper.find('svg').exists()).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('applies default size of 96px', () => {
|
|
27
|
+
const wrapper = mount(Loader);
|
|
28
|
+
expect(wrapper.vm.size).toBe(96);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('Props', () => {
|
|
33
|
+
it('accepts custom size prop', () => {
|
|
34
|
+
const wrapper = mount(Loader, {
|
|
35
|
+
props: {
|
|
36
|
+
size: 48
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
expect(wrapper.vm.size).toBe(48);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('applies size to SVG element', () => {
|
|
44
|
+
const wrapper = mount(Loader, {
|
|
45
|
+
props: {
|
|
46
|
+
size: 64
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const svg = wrapper.find('.loader-svg');
|
|
51
|
+
expect(svg.attributes('style')).toContain('width: 64px');
|
|
52
|
+
expect(svg.attributes('style')).toContain('height: 64px');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe('Accessibility', () => {
|
|
57
|
+
it('has role="alert" for screen readers', () => {
|
|
58
|
+
const wrapper = mount(Loader);
|
|
59
|
+
expect(wrapper.find('[role="alert"]').exists()).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('has aria-live="assertive" for immediate announcement', () => {
|
|
63
|
+
const wrapper = mount(Loader);
|
|
64
|
+
expect(wrapper.find('[aria-live="assertive"]').exists()).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('has aria-busy="true" to indicate loading state', () => {
|
|
68
|
+
const wrapper = mount(Loader);
|
|
69
|
+
expect(wrapper.find('[aria-busy="true"]').exists()).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('has role="status" for the spinner', () => {
|
|
73
|
+
const wrapper = mount(Loader);
|
|
74
|
+
expect(wrapper.find('[role="status"]').exists()).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('has aria-hidden="true" on decorative SVG', () => {
|
|
78
|
+
const wrapper = mount(Loader);
|
|
79
|
+
const svg = wrapper.find('svg');
|
|
80
|
+
expect(svg.attributes('aria-hidden')).toBe('true');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('provides proper semantic structure for assistive technologies', () => {
|
|
84
|
+
const wrapper = mount(Loader);
|
|
85
|
+
|
|
86
|
+
// Container announces loading state
|
|
87
|
+
const container = wrapper.find('.loader-container');
|
|
88
|
+
expect(container.attributes('role')).toBe('alert');
|
|
89
|
+
expect(container.attributes('aria-live')).toBe('assertive');
|
|
90
|
+
expect(container.attributes('aria-busy')).toBe('true');
|
|
91
|
+
|
|
92
|
+
// Inner status provides spinner context
|
|
93
|
+
const status = wrapper.find('[role="status"]');
|
|
94
|
+
expect(status.exists()).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('follows WCAG 2.1 guidelines for loading indicators', () => {
|
|
98
|
+
const wrapper = mount(Loader);
|
|
99
|
+
|
|
100
|
+
// Should have proper ARIA attributes
|
|
101
|
+
expect(wrapper.find('[aria-busy]').exists()).toBe(true);
|
|
102
|
+
expect(wrapper.find('[aria-live]').exists()).toBe(true);
|
|
103
|
+
|
|
104
|
+
// SVG should be hidden from screen readers
|
|
105
|
+
expect(wrapper.find('svg[aria-hidden="true"]').exists()).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('Visual Structure', () => {
|
|
110
|
+
it('has loader-container wrapper', () => {
|
|
111
|
+
const wrapper = mount(Loader);
|
|
112
|
+
expect(wrapper.find('.loader-container').exists()).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('has loader-content for centering', () => {
|
|
116
|
+
const wrapper = mount(Loader);
|
|
117
|
+
expect(wrapper.find('.loader-content').exists()).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('contains animated spinner arc', () => {
|
|
121
|
+
const wrapper = mount(Loader);
|
|
122
|
+
expect(wrapper.find('.loader-spinner-arc').exists()).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('SVG Content', () => {
|
|
127
|
+
it('renders SVG with proper viewBox', () => {
|
|
128
|
+
const wrapper = mount(Loader);
|
|
129
|
+
const svg = wrapper.find('svg');
|
|
130
|
+
expect(svg.attributes('viewBox')).toBe('0 0 100 101');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('renders path elements for spinner', () => {
|
|
134
|
+
const wrapper = mount(Loader);
|
|
135
|
+
const paths = wrapper.findAll('path');
|
|
136
|
+
expect(paths.length).toBeGreaterThan(0);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('renders W logo in the center', () => {
|
|
140
|
+
const wrapper = mount(Loader);
|
|
141
|
+
// The W logo is inside a g element
|
|
142
|
+
const gElements = wrapper.findAll('g');
|
|
143
|
+
expect(gElements.length).toBeGreaterThan(0);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('Size Variations', () => {
|
|
148
|
+
it('handles small size (24px)', () => {
|
|
149
|
+
const wrapper = mount(Loader, {
|
|
150
|
+
props: { size: 24 }
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const svg = wrapper.find('.loader-svg');
|
|
154
|
+
expect(svg.attributes('style')).toContain('width: 24px');
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('handles large size (200px)', () => {
|
|
158
|
+
const wrapper = mount(Loader, {
|
|
159
|
+
props: { size: 200 }
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
const svg = wrapper.find('.loader-svg');
|
|
163
|
+
expect(svg.attributes('style')).toContain('width: 200px');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('handles zero size gracefully', () => {
|
|
167
|
+
const wrapper = mount(Loader, {
|
|
168
|
+
props: { size: 0 }
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
expect(wrapper.vm.size).toBe(0);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe('Edge Cases', () => {
|
|
176
|
+
it('renders without props', () => {
|
|
177
|
+
const wrapper = mount(Loader);
|
|
178
|
+
expect(wrapper.find('.loader-container').exists()).toBe(true);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('maintains structure with undefined size', () => {
|
|
182
|
+
const wrapper = mount(Loader, {
|
|
183
|
+
props: { size: undefined }
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Should fall back to default size
|
|
187
|
+
expect(wrapper.vm.size).toBe(96);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe('Animation', () => {
|
|
192
|
+
it('has animated spinner arc class', () => {
|
|
193
|
+
const wrapper = mount(Loader);
|
|
194
|
+
expect(wrapper.find('.loader-spinner-arc').exists()).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|