@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,566 +1,566 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { mount } from '@vue/test-utils';
|
|
3
|
-
import TextArea from '@components/TextArea/TextArea.vue';
|
|
4
|
-
|
|
5
|
-
describe('TextArea', () => {
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
vi.clearAllMocks();
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
// Test default behavior and rendering
|
|
11
|
-
describe('Default Behavior', () => {
|
|
12
|
-
it('renders with default props', () => {
|
|
13
|
-
const wrapper = mount(TextArea);
|
|
14
|
-
|
|
15
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
16
|
-
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
17
|
-
expect(wrapper.vm.modelValue).toBe('');
|
|
18
|
-
expect(wrapper.vm.clearIcon).toBe('text-area');
|
|
19
|
-
expect(wrapper.vm.label).toBe('Label');
|
|
20
|
-
expect(wrapper.vm.prependIcon).toBeNull();
|
|
21
|
-
expect(wrapper.vm.prependInnerIcon).toBeNull();
|
|
22
|
-
expect(wrapper.vm.appendIcon).toBeNull();
|
|
23
|
-
expect(wrapper.vm.appendInnerIcon).toBeNull();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('has data-testid for testing', () => {
|
|
27
|
-
const wrapper = mount(TextArea);
|
|
28
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('applies text-area CSS class', () => {
|
|
32
|
-
const wrapper = mount(TextArea);
|
|
33
|
-
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
// Test v-model functionality
|
|
38
|
-
describe('v-model', () => {
|
|
39
|
-
it('displays initial modelValue', () => {
|
|
40
|
-
const wrapper = mount(TextArea, {
|
|
41
|
-
props: {
|
|
42
|
-
modelValue: 'Initial text content'
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
expect(wrapper.vm.internalValue).toBe('Initial text content');
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('emits update:modelValue when internalValue changes', async () => {
|
|
50
|
-
const wrapper = mount(TextArea);
|
|
51
|
-
|
|
52
|
-
wrapper.vm.internalValue = 'New text content';
|
|
53
|
-
|
|
54
|
-
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
55
|
-
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['New text content']);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('handles string modelValue', () => {
|
|
59
|
-
const wrapper = mount(TextArea, {
|
|
60
|
-
props: {
|
|
61
|
-
modelValue: 'String value'
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
expect(wrapper.vm.internalValue).toBe('String value');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('handles number modelValue', () => {
|
|
69
|
-
const wrapper = mount(TextArea, {
|
|
70
|
-
props: {
|
|
71
|
-
modelValue: 12345
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
expect(wrapper.vm.internalValue).toBe(12345);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('handles empty string modelValue', () => {
|
|
79
|
-
const wrapper = mount(TextArea, {
|
|
80
|
-
props: {
|
|
81
|
-
modelValue: ''
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
expect(wrapper.vm.internalValue).toBe('');
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('handles zero as modelValue', () => {
|
|
89
|
-
const wrapper = mount(TextArea, {
|
|
90
|
-
props: {
|
|
91
|
-
modelValue: 0
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
expect(wrapper.vm.internalValue).toBe(0);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('updates when modelValue prop changes', async () => {
|
|
99
|
-
const wrapper = mount(TextArea, {
|
|
100
|
-
props: {
|
|
101
|
-
modelValue: 'Initial'
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
expect(wrapper.vm.internalValue).toBe('Initial');
|
|
106
|
-
|
|
107
|
-
await wrapper.setProps({ modelValue: 'Updated' });
|
|
108
|
-
|
|
109
|
-
expect(wrapper.vm.internalValue).toBe('Updated');
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Test computed property
|
|
114
|
-
describe('Computed Property', () => {
|
|
115
|
-
it('internalValue getter returns modelValue', () => {
|
|
116
|
-
const wrapper = mount(TextArea, {
|
|
117
|
-
props: {
|
|
118
|
-
modelValue: 'Test content'
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
expect(wrapper.vm.internalValue).toBe('Test content');
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('internalValue setter emits update:modelValue', () => {
|
|
126
|
-
const wrapper = mount(TextArea);
|
|
127
|
-
|
|
128
|
-
wrapper.vm.internalValue = 'Updated content';
|
|
129
|
-
|
|
130
|
-
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
131
|
-
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['Updated content']);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it('handles multiple value updates', () => {
|
|
135
|
-
const wrapper = mount(TextArea);
|
|
136
|
-
|
|
137
|
-
wrapper.vm.internalValue = 'First update';
|
|
138
|
-
wrapper.vm.internalValue = 'Second update';
|
|
139
|
-
wrapper.vm.internalValue = 'Third update';
|
|
140
|
-
|
|
141
|
-
expect(wrapper.emitted('update:modelValue')).toHaveLength(3);
|
|
142
|
-
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['First update']);
|
|
143
|
-
expect(wrapper.emitted('update:modelValue')?.[1]).toEqual(['Second update']);
|
|
144
|
-
expect(wrapper.emitted('update:modelValue')?.[2]).toEqual(['Third update']);
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// Test label prop
|
|
149
|
-
describe('Label', () => {
|
|
150
|
-
it('uses default label', () => {
|
|
151
|
-
const wrapper = mount(TextArea);
|
|
152
|
-
expect(wrapper.vm.label).toBe('Label');
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('uses custom label', () => {
|
|
156
|
-
const wrapper = mount(TextArea, {
|
|
157
|
-
props: {
|
|
158
|
-
label: 'Custom TextArea Label'
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
expect(wrapper.vm.label).toBe('Custom TextArea Label');
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('handles empty label', () => {
|
|
166
|
-
const wrapper = mount(TextArea, {
|
|
167
|
-
props: {
|
|
168
|
-
label: ''
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
expect(wrapper.vm.label).toBe('');
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
// Test clear icon
|
|
177
|
-
describe('Clear Icon', () => {
|
|
178
|
-
it('uses default clear icon', () => {
|
|
179
|
-
const wrapper = mount(TextArea);
|
|
180
|
-
expect(wrapper.vm.clearIcon).toBe('text-area');
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('uses custom clear icon', () => {
|
|
184
|
-
const wrapper = mount(TextArea, {
|
|
185
|
-
props: {
|
|
186
|
-
clearIcon: 'mdi-close'
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
expect(wrapper.vm.clearIcon).toBe('mdi-close');
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('handles empty clear icon', () => {
|
|
194
|
-
const wrapper = mount(TextArea, {
|
|
195
|
-
props: {
|
|
196
|
-
clearIcon: ''
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
expect(wrapper.vm.clearIcon).toBe('');
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
// Test icons
|
|
205
|
-
describe('Icons', () => {
|
|
206
|
-
it('handles prepend icon', () => {
|
|
207
|
-
const wrapper = mount(TextArea, {
|
|
208
|
-
props: {
|
|
209
|
-
prependIcon: 'mdi-home'
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
expect(wrapper.vm.prependIcon).toBe('mdi-home');
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it('handles prepend inner icon', () => {
|
|
217
|
-
const wrapper = mount(TextArea, {
|
|
218
|
-
props: {
|
|
219
|
-
prependInnerIcon: 'mdi-search'
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
expect(wrapper.vm.prependInnerIcon).toBe('mdi-search');
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('handles append icon', () => {
|
|
227
|
-
const wrapper = mount(TextArea, {
|
|
228
|
-
props: {
|
|
229
|
-
appendIcon: 'mdi-arrow-right'
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
expect(wrapper.vm.appendIcon).toBe('mdi-arrow-right');
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('handles append inner icon', () => {
|
|
237
|
-
const wrapper = mount(TextArea, {
|
|
238
|
-
props: {
|
|
239
|
-
appendInnerIcon: 'mdi-eye'
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
expect(wrapper.vm.appendInnerIcon).toBe('mdi-eye');
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
it('handles all icons together', () => {
|
|
247
|
-
const wrapper = mount(TextArea, {
|
|
248
|
-
props: {
|
|
249
|
-
prependIcon: 'mdi-home',
|
|
250
|
-
prependInnerIcon: 'mdi-search',
|
|
251
|
-
appendIcon: 'mdi-arrow-right',
|
|
252
|
-
appendInnerIcon: 'mdi-eye'
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
expect(wrapper.vm.prependIcon).toBe('mdi-home');
|
|
257
|
-
expect(wrapper.vm.prependInnerIcon).toBe('mdi-search');
|
|
258
|
-
expect(wrapper.vm.appendIcon).toBe('mdi-arrow-right');
|
|
259
|
-
expect(wrapper.vm.appendInnerIcon).toBe('mdi-eye');
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('defaults icons to null', () => {
|
|
263
|
-
const wrapper = mount(TextArea);
|
|
264
|
-
|
|
265
|
-
expect(wrapper.vm.prependIcon).toBeNull();
|
|
266
|
-
expect(wrapper.vm.prependInnerIcon).toBeNull();
|
|
267
|
-
expect(wrapper.vm.appendIcon).toBeNull();
|
|
268
|
-
expect(wrapper.vm.appendInnerIcon).toBeNull();
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
// Test click events
|
|
273
|
-
describe('Click Events', () => {
|
|
274
|
-
it('emits click:append event', async () => {
|
|
275
|
-
const wrapper = mount(TextArea);
|
|
276
|
-
const mockEvent = { target: {} };
|
|
277
|
-
|
|
278
|
-
await wrapper.vm.$emit('click:append', mockEvent);
|
|
279
|
-
|
|
280
|
-
expect(wrapper.emitted('click:append')).toBeTruthy();
|
|
281
|
-
expect(wrapper.emitted('click:append')?.[0]).toEqual([mockEvent]);
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it('emits click:appendInner event', async () => {
|
|
285
|
-
const wrapper = mount(TextArea);
|
|
286
|
-
const mockEvent = { target: {} };
|
|
287
|
-
|
|
288
|
-
await wrapper.vm.$emit('click:appendInner', mockEvent);
|
|
289
|
-
|
|
290
|
-
expect(wrapper.emitted('click:appendInner')).toBeTruthy();
|
|
291
|
-
expect(wrapper.emitted('click:appendInner')?.[0]).toEqual([mockEvent]);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it('emits click:clear event', async () => {
|
|
295
|
-
const wrapper = mount(TextArea);
|
|
296
|
-
const mockEvent = { target: {} };
|
|
297
|
-
|
|
298
|
-
await wrapper.vm.$emit('click:clear', mockEvent);
|
|
299
|
-
|
|
300
|
-
expect(wrapper.emitted('click:clear')).toBeTruthy();
|
|
301
|
-
expect(wrapper.emitted('click:clear')?.[0]).toEqual([mockEvent]);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it('emits click:control event', async () => {
|
|
305
|
-
const wrapper = mount(TextArea);
|
|
306
|
-
const mockEvent = { target: {} };
|
|
307
|
-
|
|
308
|
-
await wrapper.vm.$emit('click:control', mockEvent);
|
|
309
|
-
|
|
310
|
-
expect(wrapper.emitted('click:control')).toBeTruthy();
|
|
311
|
-
expect(wrapper.emitted('click:control')?.[0]).toEqual([mockEvent]);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('emits click:prepend event', async () => {
|
|
315
|
-
const wrapper = mount(TextArea);
|
|
316
|
-
const mockEvent = { target: {} };
|
|
317
|
-
|
|
318
|
-
await wrapper.vm.$emit('click:prepend', mockEvent);
|
|
319
|
-
|
|
320
|
-
expect(wrapper.emitted('click:prepend')).toBeTruthy();
|
|
321
|
-
expect(wrapper.emitted('click:prepend')?.[0]).toEqual([mockEvent]);
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
it('emits click:prependInner event', async () => {
|
|
325
|
-
const wrapper = mount(TextArea);
|
|
326
|
-
const mockEvent = { target: {} };
|
|
327
|
-
|
|
328
|
-
await wrapper.vm.$emit('click:prependInner', mockEvent);
|
|
329
|
-
|
|
330
|
-
expect(wrapper.emitted('click:prependInner')).toBeTruthy();
|
|
331
|
-
expect(wrapper.emitted('click:prependInner')?.[0]).toEqual([mockEvent]);
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
it('handles multiple click events', async () => {
|
|
335
|
-
const wrapper = mount(TextArea);
|
|
336
|
-
const mockEvent1 = { target: { id: 'first' } };
|
|
337
|
-
const mockEvent2 = { target: { id: 'second' } };
|
|
338
|
-
|
|
339
|
-
await wrapper.vm.$emit('click:append', mockEvent1);
|
|
340
|
-
await wrapper.vm.$emit('click:append', mockEvent2);
|
|
341
|
-
|
|
342
|
-
expect(wrapper.emitted('click:append')).toHaveLength(2);
|
|
343
|
-
expect(wrapper.emitted('click:append')?.[0]).toEqual([mockEvent1]);
|
|
344
|
-
expect(wrapper.emitted('click:append')?.[1]).toEqual([mockEvent2]);
|
|
345
|
-
});
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
// Test Vuetify integration and styling
|
|
349
|
-
describe('Vuetify Integration', () => {
|
|
350
|
-
it('applies Vuetify props correctly', () => {
|
|
351
|
-
const wrapper = mount(TextArea);
|
|
352
|
-
|
|
353
|
-
// Verify the component renders with Vuetify stub
|
|
354
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
355
|
-
|
|
356
|
-
// Since we're using stubs, we can't directly test Vuetify props
|
|
357
|
-
// but we can verify the component renders correctly
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
it('uses clearable by default', () => {
|
|
361
|
-
const wrapper = mount(TextArea);
|
|
362
|
-
|
|
363
|
-
// The component template includes clearable attribute
|
|
364
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it('applies custom styling properties', () => {
|
|
368
|
-
const wrapper = mount(TextArea);
|
|
369
|
-
|
|
370
|
-
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
// Test CSS styling
|
|
375
|
-
describe('CSS Styling', () => {
|
|
376
|
-
it('applies text-area class', () => {
|
|
377
|
-
const wrapper = mount(TextArea);
|
|
378
|
-
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
it('includes CSS variables for Vuetify customization', () => {
|
|
382
|
-
const wrapper = mount(TextArea);
|
|
383
|
-
|
|
384
|
-
// The component template includes various color and styling props
|
|
385
|
-
// These are handled by Vuetify, so we just verify the component renders
|
|
386
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
// Test accessibility
|
|
391
|
-
describe('Accessibility', () => {
|
|
392
|
-
it('has data-testid for testing', () => {
|
|
393
|
-
const wrapper = mount(TextArea);
|
|
394
|
-
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
it('provides label for accessibility', () => {
|
|
398
|
-
const wrapper = mount(TextArea, {
|
|
399
|
-
props: {
|
|
400
|
-
label: 'Description field'
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
expect(wrapper.vm.label).toBe('Description field');
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
it('supports icon-based interactions', () => {
|
|
408
|
-
const wrapper = mount(TextArea, {
|
|
409
|
-
props: {
|
|
410
|
-
prependIcon: 'mdi-home',
|
|
411
|
-
appendIcon: 'mdi-send'
|
|
412
|
-
}
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
expect(wrapper.vm.prependIcon).toBe('mdi-home');
|
|
416
|
-
expect(wrapper.vm.appendIcon).toBe('mdi-send');
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
// Test edge cases
|
|
421
|
-
describe('Edge Cases', () => {
|
|
422
|
-
it('handles undefined modelValue gracefully', () => {
|
|
423
|
-
const wrapper = mount(TextArea, {
|
|
424
|
-
props: {
|
|
425
|
-
modelValue: undefined
|
|
426
|
-
}
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
// When undefined is passed, the component falls back to the default empty string
|
|
430
|
-
expect(wrapper.vm.internalValue).toBe('');
|
|
431
|
-
});
|
|
432
|
-
|
|
433
|
-
it('handles null modelValue gracefully', () => {
|
|
434
|
-
const wrapper = mount(TextArea, {
|
|
435
|
-
props: {
|
|
436
|
-
modelValue: null
|
|
437
|
-
}
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
expect(wrapper.vm.internalValue).toBeNull();
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
it('handles very long text content', () => {
|
|
444
|
-
const longText = 'Lorem ipsum '.repeat(1000);
|
|
445
|
-
const wrapper = mount(TextArea, {
|
|
446
|
-
props: {
|
|
447
|
-
modelValue: longText
|
|
448
|
-
}
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
expect(wrapper.vm.internalValue).toBe(longText);
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
it('handles special characters in text', () => {
|
|
455
|
-
const specialText = '!@#$%^&*()_+{}|:"<>?`~[]\\;\',./ \n\t\r';
|
|
456
|
-
const wrapper = mount(TextArea, {
|
|
457
|
-
props: {
|
|
458
|
-
modelValue: specialText
|
|
459
|
-
}
|
|
460
|
-
});
|
|
461
|
-
|
|
462
|
-
expect(wrapper.vm.internalValue).toBe(specialText);
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
it('handles newlines and multiline content', () => {
|
|
466
|
-
const multilineText = 'Line 1\nLine 2\nLine 3\n\nLine 5';
|
|
467
|
-
const wrapper = mount(TextArea, {
|
|
468
|
-
props: {
|
|
469
|
-
modelValue: multilineText
|
|
470
|
-
}
|
|
471
|
-
});
|
|
472
|
-
|
|
473
|
-
expect(wrapper.vm.internalValue).toBe(multilineText);
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
it('handles numeric values correctly', () => {
|
|
477
|
-
const wrapper = mount(TextArea, {
|
|
478
|
-
props: {
|
|
479
|
-
modelValue: 42.5
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
expect(wrapper.vm.internalValue).toBe(42.5);
|
|
484
|
-
|
|
485
|
-
wrapper.vm.internalValue = 100;
|
|
486
|
-
|
|
487
|
-
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([100]);
|
|
488
|
-
});
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
// Test complex scenarios
|
|
492
|
-
describe('Complex Scenarios', () => {
|
|
493
|
-
it('works with all props configured', () => {
|
|
494
|
-
const wrapper = mount(TextArea, {
|
|
495
|
-
props: {
|
|
496
|
-
modelValue: 'Full configuration test',
|
|
497
|
-
label: 'Complete TextArea',
|
|
498
|
-
clearIcon: 'mdi-close-circle',
|
|
499
|
-
prependIcon: 'mdi-format-text',
|
|
500
|
-
prependInnerIcon: 'mdi-pencil',
|
|
501
|
-
appendIcon: 'mdi-check',
|
|
502
|
-
appendInnerIcon: 'mdi-send'
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
|
|
506
|
-
expect(wrapper.vm.modelValue).toBe('Full configuration test');
|
|
507
|
-
expect(wrapper.vm.label).toBe('Complete TextArea');
|
|
508
|
-
expect(wrapper.vm.clearIcon).toBe('mdi-close-circle');
|
|
509
|
-
expect(wrapper.vm.prependIcon).toBe('mdi-format-text');
|
|
510
|
-
expect(wrapper.vm.prependInnerIcon).toBe('mdi-pencil');
|
|
511
|
-
expect(wrapper.vm.appendIcon).toBe('mdi-check');
|
|
512
|
-
expect(wrapper.vm.appendInnerIcon).toBe('mdi-send');
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
it('handles rapid value changes', async () => {
|
|
516
|
-
const wrapper = mount(TextArea);
|
|
517
|
-
|
|
518
|
-
const values = ['First', 'Second', 'Third', 'Fourth'];
|
|
519
|
-
|
|
520
|
-
for (const value of values) {
|
|
521
|
-
wrapper.vm.internalValue = value;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
expect(wrapper.emitted('update:modelValue')).toHaveLength(4);
|
|
525
|
-
expect(wrapper.emitted('update:modelValue')?.[3]).toEqual(['Fourth']);
|
|
526
|
-
});
|
|
527
|
-
|
|
528
|
-
it('handles switching between string and number values', async () => {
|
|
529
|
-
const wrapper = mount(TextArea, {
|
|
530
|
-
props: {
|
|
531
|
-
modelValue: 'Initial string'
|
|
532
|
-
}
|
|
533
|
-
});
|
|
534
|
-
|
|
535
|
-
expect(wrapper.vm.internalValue).toBe('Initial string');
|
|
536
|
-
|
|
537
|
-
await wrapper.setProps({ modelValue: 123 });
|
|
538
|
-
expect(wrapper.vm.internalValue).toBe(123);
|
|
539
|
-
|
|
540
|
-
await wrapper.setProps({ modelValue: 'Back to string' });
|
|
541
|
-
expect(wrapper.vm.internalValue).toBe('Back to string');
|
|
542
|
-
});
|
|
543
|
-
|
|
544
|
-
it('maintains reactivity with external prop changes', async () => {
|
|
545
|
-
const wrapper = mount(TextArea, {
|
|
546
|
-
props: {
|
|
547
|
-
modelValue: 'Original',
|
|
548
|
-
label: 'Original Label'
|
|
549
|
-
}
|
|
550
|
-
});
|
|
551
|
-
|
|
552
|
-
expect(wrapper.vm.internalValue).toBe('Original');
|
|
553
|
-
expect(wrapper.vm.label).toBe('Original Label');
|
|
554
|
-
|
|
555
|
-
await wrapper.setProps({
|
|
556
|
-
modelValue: 'Updated',
|
|
557
|
-
label: 'Updated Label',
|
|
558
|
-
clearIcon: 'new-icon'
|
|
559
|
-
});
|
|
560
|
-
|
|
561
|
-
expect(wrapper.vm.internalValue).toBe('Updated');
|
|
562
|
-
expect(wrapper.vm.label).toBe('Updated Label');
|
|
563
|
-
expect(wrapper.vm.clearIcon).toBe('new-icon');
|
|
564
|
-
});
|
|
565
|
-
});
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { mount } from '@vue/test-utils';
|
|
3
|
+
import TextArea from '@components/TextArea/TextArea.vue';
|
|
4
|
+
|
|
5
|
+
describe('TextArea', () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
vi.clearAllMocks();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
// Test default behavior and rendering
|
|
11
|
+
describe('Default Behavior', () => {
|
|
12
|
+
it('renders with default props', () => {
|
|
13
|
+
const wrapper = mount(TextArea);
|
|
14
|
+
|
|
15
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
16
|
+
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
17
|
+
expect(wrapper.vm.modelValue).toBe('');
|
|
18
|
+
expect(wrapper.vm.clearIcon).toBe('text-area');
|
|
19
|
+
expect(wrapper.vm.label).toBe('Label');
|
|
20
|
+
expect(wrapper.vm.prependIcon).toBeNull();
|
|
21
|
+
expect(wrapper.vm.prependInnerIcon).toBeNull();
|
|
22
|
+
expect(wrapper.vm.appendIcon).toBeNull();
|
|
23
|
+
expect(wrapper.vm.appendInnerIcon).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('has data-testid for testing', () => {
|
|
27
|
+
const wrapper = mount(TextArea);
|
|
28
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('applies text-area CSS class', () => {
|
|
32
|
+
const wrapper = mount(TextArea);
|
|
33
|
+
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Test v-model functionality
|
|
38
|
+
describe('v-model', () => {
|
|
39
|
+
it('displays initial modelValue', () => {
|
|
40
|
+
const wrapper = mount(TextArea, {
|
|
41
|
+
props: {
|
|
42
|
+
modelValue: 'Initial text content'
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(wrapper.vm.internalValue).toBe('Initial text content');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('emits update:modelValue when internalValue changes', async () => {
|
|
50
|
+
const wrapper = mount(TextArea);
|
|
51
|
+
|
|
52
|
+
wrapper.vm.internalValue = 'New text content';
|
|
53
|
+
|
|
54
|
+
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
55
|
+
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['New text content']);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('handles string modelValue', () => {
|
|
59
|
+
const wrapper = mount(TextArea, {
|
|
60
|
+
props: {
|
|
61
|
+
modelValue: 'String value'
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
expect(wrapper.vm.internalValue).toBe('String value');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('handles number modelValue', () => {
|
|
69
|
+
const wrapper = mount(TextArea, {
|
|
70
|
+
props: {
|
|
71
|
+
modelValue: 12345
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
expect(wrapper.vm.internalValue).toBe(12345);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('handles empty string modelValue', () => {
|
|
79
|
+
const wrapper = mount(TextArea, {
|
|
80
|
+
props: {
|
|
81
|
+
modelValue: ''
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
expect(wrapper.vm.internalValue).toBe('');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('handles zero as modelValue', () => {
|
|
89
|
+
const wrapper = mount(TextArea, {
|
|
90
|
+
props: {
|
|
91
|
+
modelValue: 0
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(wrapper.vm.internalValue).toBe(0);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('updates when modelValue prop changes', async () => {
|
|
99
|
+
const wrapper = mount(TextArea, {
|
|
100
|
+
props: {
|
|
101
|
+
modelValue: 'Initial'
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
expect(wrapper.vm.internalValue).toBe('Initial');
|
|
106
|
+
|
|
107
|
+
await wrapper.setProps({ modelValue: 'Updated' });
|
|
108
|
+
|
|
109
|
+
expect(wrapper.vm.internalValue).toBe('Updated');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Test computed property
|
|
114
|
+
describe('Computed Property', () => {
|
|
115
|
+
it('internalValue getter returns modelValue', () => {
|
|
116
|
+
const wrapper = mount(TextArea, {
|
|
117
|
+
props: {
|
|
118
|
+
modelValue: 'Test content'
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
expect(wrapper.vm.internalValue).toBe('Test content');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('internalValue setter emits update:modelValue', () => {
|
|
126
|
+
const wrapper = mount(TextArea);
|
|
127
|
+
|
|
128
|
+
wrapper.vm.internalValue = 'Updated content';
|
|
129
|
+
|
|
130
|
+
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
131
|
+
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['Updated content']);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('handles multiple value updates', () => {
|
|
135
|
+
const wrapper = mount(TextArea);
|
|
136
|
+
|
|
137
|
+
wrapper.vm.internalValue = 'First update';
|
|
138
|
+
wrapper.vm.internalValue = 'Second update';
|
|
139
|
+
wrapper.vm.internalValue = 'Third update';
|
|
140
|
+
|
|
141
|
+
expect(wrapper.emitted('update:modelValue')).toHaveLength(3);
|
|
142
|
+
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['First update']);
|
|
143
|
+
expect(wrapper.emitted('update:modelValue')?.[1]).toEqual(['Second update']);
|
|
144
|
+
expect(wrapper.emitted('update:modelValue')?.[2]).toEqual(['Third update']);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Test label prop
|
|
149
|
+
describe('Label', () => {
|
|
150
|
+
it('uses default label', () => {
|
|
151
|
+
const wrapper = mount(TextArea);
|
|
152
|
+
expect(wrapper.vm.label).toBe('Label');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('uses custom label', () => {
|
|
156
|
+
const wrapper = mount(TextArea, {
|
|
157
|
+
props: {
|
|
158
|
+
label: 'Custom TextArea Label'
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
expect(wrapper.vm.label).toBe('Custom TextArea Label');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('handles empty label', () => {
|
|
166
|
+
const wrapper = mount(TextArea, {
|
|
167
|
+
props: {
|
|
168
|
+
label: ''
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
expect(wrapper.vm.label).toBe('');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Test clear icon
|
|
177
|
+
describe('Clear Icon', () => {
|
|
178
|
+
it('uses default clear icon', () => {
|
|
179
|
+
const wrapper = mount(TextArea);
|
|
180
|
+
expect(wrapper.vm.clearIcon).toBe('text-area');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('uses custom clear icon', () => {
|
|
184
|
+
const wrapper = mount(TextArea, {
|
|
185
|
+
props: {
|
|
186
|
+
clearIcon: 'mdi-close'
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
expect(wrapper.vm.clearIcon).toBe('mdi-close');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('handles empty clear icon', () => {
|
|
194
|
+
const wrapper = mount(TextArea, {
|
|
195
|
+
props: {
|
|
196
|
+
clearIcon: ''
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
expect(wrapper.vm.clearIcon).toBe('');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// Test icons
|
|
205
|
+
describe('Icons', () => {
|
|
206
|
+
it('handles prepend icon', () => {
|
|
207
|
+
const wrapper = mount(TextArea, {
|
|
208
|
+
props: {
|
|
209
|
+
prependIcon: 'mdi-home'
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
expect(wrapper.vm.prependIcon).toBe('mdi-home');
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('handles prepend inner icon', () => {
|
|
217
|
+
const wrapper = mount(TextArea, {
|
|
218
|
+
props: {
|
|
219
|
+
prependInnerIcon: 'mdi-search'
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
expect(wrapper.vm.prependInnerIcon).toBe('mdi-search');
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('handles append icon', () => {
|
|
227
|
+
const wrapper = mount(TextArea, {
|
|
228
|
+
props: {
|
|
229
|
+
appendIcon: 'mdi-arrow-right'
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
expect(wrapper.vm.appendIcon).toBe('mdi-arrow-right');
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('handles append inner icon', () => {
|
|
237
|
+
const wrapper = mount(TextArea, {
|
|
238
|
+
props: {
|
|
239
|
+
appendInnerIcon: 'mdi-eye'
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
expect(wrapper.vm.appendInnerIcon).toBe('mdi-eye');
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('handles all icons together', () => {
|
|
247
|
+
const wrapper = mount(TextArea, {
|
|
248
|
+
props: {
|
|
249
|
+
prependIcon: 'mdi-home',
|
|
250
|
+
prependInnerIcon: 'mdi-search',
|
|
251
|
+
appendIcon: 'mdi-arrow-right',
|
|
252
|
+
appendInnerIcon: 'mdi-eye'
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
expect(wrapper.vm.prependIcon).toBe('mdi-home');
|
|
257
|
+
expect(wrapper.vm.prependInnerIcon).toBe('mdi-search');
|
|
258
|
+
expect(wrapper.vm.appendIcon).toBe('mdi-arrow-right');
|
|
259
|
+
expect(wrapper.vm.appendInnerIcon).toBe('mdi-eye');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
it('defaults icons to null', () => {
|
|
263
|
+
const wrapper = mount(TextArea);
|
|
264
|
+
|
|
265
|
+
expect(wrapper.vm.prependIcon).toBeNull();
|
|
266
|
+
expect(wrapper.vm.prependInnerIcon).toBeNull();
|
|
267
|
+
expect(wrapper.vm.appendIcon).toBeNull();
|
|
268
|
+
expect(wrapper.vm.appendInnerIcon).toBeNull();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// Test click events
|
|
273
|
+
describe('Click Events', () => {
|
|
274
|
+
it('emits click:append event', async () => {
|
|
275
|
+
const wrapper = mount(TextArea);
|
|
276
|
+
const mockEvent = { target: {} };
|
|
277
|
+
|
|
278
|
+
await wrapper.vm.$emit('click:append', mockEvent);
|
|
279
|
+
|
|
280
|
+
expect(wrapper.emitted('click:append')).toBeTruthy();
|
|
281
|
+
expect(wrapper.emitted('click:append')?.[0]).toEqual([mockEvent]);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('emits click:appendInner event', async () => {
|
|
285
|
+
const wrapper = mount(TextArea);
|
|
286
|
+
const mockEvent = { target: {} };
|
|
287
|
+
|
|
288
|
+
await wrapper.vm.$emit('click:appendInner', mockEvent);
|
|
289
|
+
|
|
290
|
+
expect(wrapper.emitted('click:appendInner')).toBeTruthy();
|
|
291
|
+
expect(wrapper.emitted('click:appendInner')?.[0]).toEqual([mockEvent]);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('emits click:clear event', async () => {
|
|
295
|
+
const wrapper = mount(TextArea);
|
|
296
|
+
const mockEvent = { target: {} };
|
|
297
|
+
|
|
298
|
+
await wrapper.vm.$emit('click:clear', mockEvent);
|
|
299
|
+
|
|
300
|
+
expect(wrapper.emitted('click:clear')).toBeTruthy();
|
|
301
|
+
expect(wrapper.emitted('click:clear')?.[0]).toEqual([mockEvent]);
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it('emits click:control event', async () => {
|
|
305
|
+
const wrapper = mount(TextArea);
|
|
306
|
+
const mockEvent = { target: {} };
|
|
307
|
+
|
|
308
|
+
await wrapper.vm.$emit('click:control', mockEvent);
|
|
309
|
+
|
|
310
|
+
expect(wrapper.emitted('click:control')).toBeTruthy();
|
|
311
|
+
expect(wrapper.emitted('click:control')?.[0]).toEqual([mockEvent]);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it('emits click:prepend event', async () => {
|
|
315
|
+
const wrapper = mount(TextArea);
|
|
316
|
+
const mockEvent = { target: {} };
|
|
317
|
+
|
|
318
|
+
await wrapper.vm.$emit('click:prepend', mockEvent);
|
|
319
|
+
|
|
320
|
+
expect(wrapper.emitted('click:prepend')).toBeTruthy();
|
|
321
|
+
expect(wrapper.emitted('click:prepend')?.[0]).toEqual([mockEvent]);
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it('emits click:prependInner event', async () => {
|
|
325
|
+
const wrapper = mount(TextArea);
|
|
326
|
+
const mockEvent = { target: {} };
|
|
327
|
+
|
|
328
|
+
await wrapper.vm.$emit('click:prependInner', mockEvent);
|
|
329
|
+
|
|
330
|
+
expect(wrapper.emitted('click:prependInner')).toBeTruthy();
|
|
331
|
+
expect(wrapper.emitted('click:prependInner')?.[0]).toEqual([mockEvent]);
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
it('handles multiple click events', async () => {
|
|
335
|
+
const wrapper = mount(TextArea);
|
|
336
|
+
const mockEvent1 = { target: { id: 'first' } };
|
|
337
|
+
const mockEvent2 = { target: { id: 'second' } };
|
|
338
|
+
|
|
339
|
+
await wrapper.vm.$emit('click:append', mockEvent1);
|
|
340
|
+
await wrapper.vm.$emit('click:append', mockEvent2);
|
|
341
|
+
|
|
342
|
+
expect(wrapper.emitted('click:append')).toHaveLength(2);
|
|
343
|
+
expect(wrapper.emitted('click:append')?.[0]).toEqual([mockEvent1]);
|
|
344
|
+
expect(wrapper.emitted('click:append')?.[1]).toEqual([mockEvent2]);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
// Test Vuetify integration and styling
|
|
349
|
+
describe('Vuetify Integration', () => {
|
|
350
|
+
it('applies Vuetify props correctly', () => {
|
|
351
|
+
const wrapper = mount(TextArea);
|
|
352
|
+
|
|
353
|
+
// Verify the component renders with Vuetify stub
|
|
354
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
355
|
+
|
|
356
|
+
// Since we're using stubs, we can't directly test Vuetify props
|
|
357
|
+
// but we can verify the component renders correctly
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
it('uses clearable by default', () => {
|
|
361
|
+
const wrapper = mount(TextArea);
|
|
362
|
+
|
|
363
|
+
// The component template includes clearable attribute
|
|
364
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it('applies custom styling properties', () => {
|
|
368
|
+
const wrapper = mount(TextArea);
|
|
369
|
+
|
|
370
|
+
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// Test CSS styling
|
|
375
|
+
describe('CSS Styling', () => {
|
|
376
|
+
it('applies text-area class', () => {
|
|
377
|
+
const wrapper = mount(TextArea);
|
|
378
|
+
expect(wrapper.find('.text-area').exists()).toBe(true);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('includes CSS variables for Vuetify customization', () => {
|
|
382
|
+
const wrapper = mount(TextArea);
|
|
383
|
+
|
|
384
|
+
// The component template includes various color and styling props
|
|
385
|
+
// These are handled by Vuetify, so we just verify the component renders
|
|
386
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
// Test accessibility
|
|
391
|
+
describe('Accessibility', () => {
|
|
392
|
+
it('has data-testid for testing', () => {
|
|
393
|
+
const wrapper = mount(TextArea);
|
|
394
|
+
expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it('provides label for accessibility', () => {
|
|
398
|
+
const wrapper = mount(TextArea, {
|
|
399
|
+
props: {
|
|
400
|
+
label: 'Description field'
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
expect(wrapper.vm.label).toBe('Description field');
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it('supports icon-based interactions', () => {
|
|
408
|
+
const wrapper = mount(TextArea, {
|
|
409
|
+
props: {
|
|
410
|
+
prependIcon: 'mdi-home',
|
|
411
|
+
appendIcon: 'mdi-send'
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
expect(wrapper.vm.prependIcon).toBe('mdi-home');
|
|
416
|
+
expect(wrapper.vm.appendIcon).toBe('mdi-send');
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
// Test edge cases
|
|
421
|
+
describe('Edge Cases', () => {
|
|
422
|
+
it('handles undefined modelValue gracefully', () => {
|
|
423
|
+
const wrapper = mount(TextArea, {
|
|
424
|
+
props: {
|
|
425
|
+
modelValue: undefined
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
// When undefined is passed, the component falls back to the default empty string
|
|
430
|
+
expect(wrapper.vm.internalValue).toBe('');
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('handles null modelValue gracefully', () => {
|
|
434
|
+
const wrapper = mount(TextArea, {
|
|
435
|
+
props: {
|
|
436
|
+
modelValue: null
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
expect(wrapper.vm.internalValue).toBeNull();
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it('handles very long text content', () => {
|
|
444
|
+
const longText = 'Lorem ipsum '.repeat(1000);
|
|
445
|
+
const wrapper = mount(TextArea, {
|
|
446
|
+
props: {
|
|
447
|
+
modelValue: longText
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
expect(wrapper.vm.internalValue).toBe(longText);
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
it('handles special characters in text', () => {
|
|
455
|
+
const specialText = '!@#$%^&*()_+{}|:"<>?`~[]\\;\',./ \n\t\r';
|
|
456
|
+
const wrapper = mount(TextArea, {
|
|
457
|
+
props: {
|
|
458
|
+
modelValue: specialText
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
expect(wrapper.vm.internalValue).toBe(specialText);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
it('handles newlines and multiline content', () => {
|
|
466
|
+
const multilineText = 'Line 1\nLine 2\nLine 3\n\nLine 5';
|
|
467
|
+
const wrapper = mount(TextArea, {
|
|
468
|
+
props: {
|
|
469
|
+
modelValue: multilineText
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
expect(wrapper.vm.internalValue).toBe(multilineText);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it('handles numeric values correctly', () => {
|
|
477
|
+
const wrapper = mount(TextArea, {
|
|
478
|
+
props: {
|
|
479
|
+
modelValue: 42.5
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
expect(wrapper.vm.internalValue).toBe(42.5);
|
|
484
|
+
|
|
485
|
+
wrapper.vm.internalValue = 100;
|
|
486
|
+
|
|
487
|
+
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([100]);
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
// Test complex scenarios
|
|
492
|
+
describe('Complex Scenarios', () => {
|
|
493
|
+
it('works with all props configured', () => {
|
|
494
|
+
const wrapper = mount(TextArea, {
|
|
495
|
+
props: {
|
|
496
|
+
modelValue: 'Full configuration test',
|
|
497
|
+
label: 'Complete TextArea',
|
|
498
|
+
clearIcon: 'mdi-close-circle',
|
|
499
|
+
prependIcon: 'mdi-format-text',
|
|
500
|
+
prependInnerIcon: 'mdi-pencil',
|
|
501
|
+
appendIcon: 'mdi-check',
|
|
502
|
+
appendInnerIcon: 'mdi-send'
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
expect(wrapper.vm.modelValue).toBe('Full configuration test');
|
|
507
|
+
expect(wrapper.vm.label).toBe('Complete TextArea');
|
|
508
|
+
expect(wrapper.vm.clearIcon).toBe('mdi-close-circle');
|
|
509
|
+
expect(wrapper.vm.prependIcon).toBe('mdi-format-text');
|
|
510
|
+
expect(wrapper.vm.prependInnerIcon).toBe('mdi-pencil');
|
|
511
|
+
expect(wrapper.vm.appendIcon).toBe('mdi-check');
|
|
512
|
+
expect(wrapper.vm.appendInnerIcon).toBe('mdi-send');
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
it('handles rapid value changes', async () => {
|
|
516
|
+
const wrapper = mount(TextArea);
|
|
517
|
+
|
|
518
|
+
const values = ['First', 'Second', 'Third', 'Fourth'];
|
|
519
|
+
|
|
520
|
+
for (const value of values) {
|
|
521
|
+
wrapper.vm.internalValue = value;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
expect(wrapper.emitted('update:modelValue')).toHaveLength(4);
|
|
525
|
+
expect(wrapper.emitted('update:modelValue')?.[3]).toEqual(['Fourth']);
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
it('handles switching between string and number values', async () => {
|
|
529
|
+
const wrapper = mount(TextArea, {
|
|
530
|
+
props: {
|
|
531
|
+
modelValue: 'Initial string'
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
expect(wrapper.vm.internalValue).toBe('Initial string');
|
|
536
|
+
|
|
537
|
+
await wrapper.setProps({ modelValue: 123 });
|
|
538
|
+
expect(wrapper.vm.internalValue).toBe(123);
|
|
539
|
+
|
|
540
|
+
await wrapper.setProps({ modelValue: 'Back to string' });
|
|
541
|
+
expect(wrapper.vm.internalValue).toBe('Back to string');
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
it('maintains reactivity with external prop changes', async () => {
|
|
545
|
+
const wrapper = mount(TextArea, {
|
|
546
|
+
props: {
|
|
547
|
+
modelValue: 'Original',
|
|
548
|
+
label: 'Original Label'
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
expect(wrapper.vm.internalValue).toBe('Original');
|
|
553
|
+
expect(wrapper.vm.label).toBe('Original Label');
|
|
554
|
+
|
|
555
|
+
await wrapper.setProps({
|
|
556
|
+
modelValue: 'Updated',
|
|
557
|
+
label: 'Updated Label',
|
|
558
|
+
clearIcon: 'new-icon'
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
expect(wrapper.vm.internalValue).toBe('Updated');
|
|
562
|
+
expect(wrapper.vm.label).toBe('Updated Label');
|
|
563
|
+
expect(wrapper.vm.clearIcon).toBe('new-icon');
|
|
564
|
+
});
|
|
565
|
+
});
|
|
566
566
|
});
|