@datametria/vue-components 1.2.0 → 2.0.1
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/README.md +548 -657
- package/dist/index.es.js +2353 -1364
- package/dist/index.umd.js +10 -10
- package/dist/vue-components.css +1 -1
- package/package.json +102 -98
- package/src/components/DatametriaAlert.vue +137 -137
- package/src/components/DatametriaAutocomplete.vue +184 -138
- package/src/components/DatametriaAvatar.vue +177 -33
- package/src/components/DatametriaBadge.vue +98 -98
- package/src/components/DatametriaBreadcrumb.vue +21 -21
- package/src/components/DatametriaButton.vue +177 -165
- package/src/components/DatametriaCard.vue +12 -12
- package/src/components/DatametriaCheckbox.vue +8 -8
- package/src/components/DatametriaChip.vue +145 -149
- package/src/components/DatametriaContainer.vue +4 -4
- package/src/components/DatametriaDatePicker.vue +686 -68
- package/src/components/DatametriaDivider.vue +13 -13
- package/src/components/DatametriaFileUpload.vue +272 -140
- package/src/components/DatametriaGrid.vue +3 -3
- package/src/components/DatametriaInput.vue +15 -15
- package/src/components/DatametriaMenu.vue +604 -619
- package/src/components/DatametriaModal.vue +16 -16
- package/src/components/DatametriaNavbar.vue +230 -252
- package/src/components/DatametriaPasswordInput.vue +430 -0
- package/src/components/DatametriaProgress.vue +18 -18
- package/src/components/DatametriaRadio.vue +20 -20
- package/src/components/DatametriaSelect.vue +15 -15
- package/src/components/DatametriaSkeleton.vue +243 -239
- package/src/components/DatametriaSlider.vue +395 -407
- package/src/components/DatametriaSortableTable.vue +585 -0
- package/src/components/DatametriaSpinner.vue +7 -7
- package/src/components/DatametriaSwitch.vue +16 -16
- package/src/components/DatametriaTable.vue +14 -14
- package/src/components/DatametriaTextarea.vue +28 -28
- package/src/components/DatametriaTimePicker.vue +285 -285
- package/src/components/DatametriaToast.vue +176 -176
- package/src/components/DatametriaTooltip.vue +408 -408
- package/src/components/__tests__/DatametriaAlert.test.js +35 -35
- package/src/components/__tests__/DatametriaAlert.test.ts +190 -0
- package/src/components/__tests__/DatametriaAutocomplete.test.ts +180 -0
- package/src/components/__tests__/DatametriaAvatar.test.ts +152 -0
- package/src/components/__tests__/DatametriaBadge.test.js +29 -29
- package/src/components/__tests__/DatametriaBadge.test.ts +167 -0
- package/src/components/__tests__/DatametriaBreadcrumb.test.ts +75 -0
- package/src/components/__tests__/DatametriaButton.test.js +30 -30
- package/src/components/__tests__/DatametriaButton.test.ts +283 -0
- package/src/components/__tests__/DatametriaCard.test.ts +201 -0
- package/src/components/__tests__/DatametriaCheckbox.test.ts +47 -0
- package/src/components/__tests__/DatametriaChip.test.js +38 -38
- package/src/components/__tests__/DatametriaContainer.test.ts +52 -0
- package/src/components/__tests__/DatametriaDatePicker.test.ts +234 -0
- package/src/components/__tests__/DatametriaDivider.test.ts +54 -0
- package/src/components/__tests__/DatametriaFileUpload.test.ts +291 -0
- package/src/components/__tests__/DatametriaGrid.test.ts +31 -0
- package/src/components/__tests__/DatametriaInput.test.ts +72 -0
- package/src/components/__tests__/DatametriaMenu.test.ts +366 -0
- package/src/components/__tests__/DatametriaModal.test.ts +86 -0
- package/src/components/__tests__/DatametriaNavbar.test.js +48 -48
- package/src/components/__tests__/DatametriaNavbar.test.ts +203 -0
- package/src/components/__tests__/DatametriaPasswordInput.test.js +305 -0
- package/src/components/__tests__/DatametriaProgress.test.ts +90 -0
- package/src/components/__tests__/DatametriaRadio.test.ts +77 -0
- package/src/components/__tests__/DatametriaSelect.test.ts +77 -0
- package/src/components/__tests__/DatametriaSlider.test.ts +261 -0
- package/src/components/__tests__/DatametriaSortableTable.test.js +168 -0
- package/src/components/__tests__/DatametriaSpinner.test.ts +156 -0
- package/src/components/__tests__/DatametriaSwitch.test.ts +64 -0
- package/src/components/__tests__/DatametriaTable.test.ts +97 -0
- package/src/components/__tests__/DatametriaTextarea.test.ts +66 -0
- package/src/components/__tests__/DatametriaToast.test.js +48 -48
- package/src/components/__tests__/DatametriaToast.test.ts +99 -0
- package/src/composables/useAccessibilityScale.ts +94 -94
- package/src/composables/useBreakpoints.ts +82 -82
- package/src/composables/useHapticFeedback.ts +439 -439
- package/src/composables/useRipple.ts +218 -218
- package/src/index.ts +68 -61
- package/src/stories/Variants.stories.js +95 -95
- package/src/styles/design-tokens.css +623 -623
- package/src/theme/ThemeProvider.vue +96 -0
- package/src/theme/__tests__/ThemeProvider.test.ts +208 -0
- package/src/theme/__tests__/constants.test.ts +31 -0
- package/src/theme/__tests__/presets.test.ts +166 -0
- package/src/theme/__tests__/tokens.test.ts +155 -0
- package/src/theme/__tests__/types.test.ts +153 -0
- package/src/theme/__tests__/useTheme.test.ts +146 -0
- package/src/theme/constants.ts +14 -0
- package/src/theme/index.ts +12 -0
- package/src/theme/presets/datametria.ts +94 -0
- package/src/theme/presets/default.ts +94 -0
- package/src/theme/presets/index.ts +8 -0
- package/src/theme/tokens/colors.ts +28 -0
- package/src/theme/tokens/index.ts +47 -0
- package/src/theme/tokens/spacing.ts +21 -0
- package/src/theme/tokens/typography.ts +35 -0
- package/src/theme/types.ts +111 -0
- package/src/theme/useTheme.ts +28 -0
- package/src/types/index.ts +19 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import DatametriaMenu from '../DatametriaMenu.vue'
|
|
4
|
+
|
|
5
|
+
describe('DatametriaMenu', () => {
|
|
6
|
+
const mockItems = [
|
|
7
|
+
{ key: '1', label: 'Item 1', action: vi.fn() },
|
|
8
|
+
{ key: '2', label: 'Item 2', description: 'Description 2' },
|
|
9
|
+
{ key: '3', label: 'Item 3', disabled: true },
|
|
10
|
+
{ key: 'divider', divider: true },
|
|
11
|
+
{ key: '4', label: 'Item 4', shortcut: '⌘K' }
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.clearAllMocks()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
describe('Renderização', () => {
|
|
19
|
+
it('renderiza corretamente', () => {
|
|
20
|
+
const wrapper = mount(DatametriaMenu)
|
|
21
|
+
expect(wrapper.find('.dm-menu').exists()).toBe(true)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('renderiza trigger padrão', () => {
|
|
25
|
+
const wrapper = mount(DatametriaMenu, {
|
|
26
|
+
props: { triggerText: 'Abrir Menu' }
|
|
27
|
+
})
|
|
28
|
+
expect(wrapper.find('.dm-menu__button').text()).toContain('Abrir Menu')
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('renderiza items quando aberto', async () => {
|
|
32
|
+
const wrapper = mount(DatametriaMenu, {
|
|
33
|
+
props: { items: mockItems },
|
|
34
|
+
attachTo: document.body
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
38
|
+
await wrapper.vm.$nextTick()
|
|
39
|
+
|
|
40
|
+
expect(wrapper.emitted('open')).toBeTruthy()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('renderiza chevron icon', () => {
|
|
44
|
+
const wrapper = mount(DatametriaMenu)
|
|
45
|
+
expect(wrapper.find('.dm-menu__chevron').exists()).toBe(true)
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe('Props', () => {
|
|
50
|
+
it('aceita triggerText customizado', () => {
|
|
51
|
+
const wrapper = mount(DatametriaMenu, {
|
|
52
|
+
props: { triggerText: 'Custom Text' }
|
|
53
|
+
})
|
|
54
|
+
expect(wrapper.find('.dm-menu__button').text()).toContain('Custom Text')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('aceita items array', () => {
|
|
58
|
+
const wrapper = mount(DatametriaMenu, {
|
|
59
|
+
props: { items: mockItems }
|
|
60
|
+
})
|
|
61
|
+
expect(wrapper.props('items')).toEqual(mockItems)
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('aceita placement', () => {
|
|
65
|
+
const wrapper = mount(DatametriaMenu, {
|
|
66
|
+
props: { placement: 'bottom-end' }
|
|
67
|
+
})
|
|
68
|
+
expect(wrapper.props('placement')).toBe('bottom-end')
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('aceita disabled', () => {
|
|
72
|
+
const wrapper = mount(DatametriaMenu, {
|
|
73
|
+
props: { disabled: true }
|
|
74
|
+
})
|
|
75
|
+
expect(wrapper.find('.dm-menu').classes()).toContain('dm-menu--disabled')
|
|
76
|
+
expect(wrapper.find('.dm-menu__button').element.disabled).toBe(true)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('aceita fullWidth', () => {
|
|
80
|
+
const wrapper = mount(DatametriaMenu, {
|
|
81
|
+
props: { fullWidth: true }
|
|
82
|
+
})
|
|
83
|
+
expect(wrapper.props('fullWidth')).toBe(true)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
it('aceita showBackdrop', () => {
|
|
87
|
+
const wrapper = mount(DatametriaMenu, {
|
|
88
|
+
props: { showBackdrop: true }
|
|
89
|
+
})
|
|
90
|
+
expect(wrapper.props('showBackdrop')).toBe(true)
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
it('aceita closeOnItemClick', () => {
|
|
94
|
+
const wrapper = mount(DatametriaMenu, {
|
|
95
|
+
props: { closeOnItemClick: false }
|
|
96
|
+
})
|
|
97
|
+
expect(wrapper.props('closeOnItemClick')).toBe(false)
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('aceita offset customizado', () => {
|
|
101
|
+
const wrapper = mount(DatametriaMenu, {
|
|
102
|
+
props: { offset: 8 }
|
|
103
|
+
})
|
|
104
|
+
expect(wrapper.props('offset')).toBe(8)
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
describe('Interação', () => {
|
|
109
|
+
it('abre menu ao clicar no trigger', async () => {
|
|
110
|
+
const wrapper = mount(DatametriaMenu, {
|
|
111
|
+
attachTo: document.body
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
115
|
+
expect(wrapper.emitted('open')).toBeTruthy()
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
it('fecha menu ao clicar novamente no trigger', async () => {
|
|
119
|
+
const wrapper = mount(DatametriaMenu, {
|
|
120
|
+
attachTo: document.body
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
const button = wrapper.find('.dm-menu__button')
|
|
124
|
+
await button.trigger('click')
|
|
125
|
+
await button.trigger('click')
|
|
126
|
+
|
|
127
|
+
expect(wrapper.emitted('close')).toBeTruthy()
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('emite item-click ao clicar em item', async () => {
|
|
131
|
+
const wrapper = mount(DatametriaMenu, {
|
|
132
|
+
props: { items: mockItems },
|
|
133
|
+
attachTo: document.body
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
137
|
+
await wrapper.vm.$nextTick()
|
|
138
|
+
|
|
139
|
+
const exposed = wrapper.vm as any
|
|
140
|
+
exposed.handleItemClick(mockItems[0], 0)
|
|
141
|
+
|
|
142
|
+
expect(wrapper.emitted('item-click')).toBeTruthy()
|
|
143
|
+
expect(wrapper.emitted('item-click')?.[0]).toEqual([mockItems[0], 0])
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it('executa action do item ao clicar', async () => {
|
|
147
|
+
const wrapper = mount(DatametriaMenu, {
|
|
148
|
+
props: { items: mockItems },
|
|
149
|
+
attachTo: document.body
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
const exposed = wrapper.vm as any
|
|
153
|
+
exposed.handleItemClick(mockItems[0], 0)
|
|
154
|
+
|
|
155
|
+
expect(mockItems[0].action).toHaveBeenCalled()
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('não executa action de item disabled', async () => {
|
|
159
|
+
const disabledItem = { ...mockItems[2], action: vi.fn() }
|
|
160
|
+
const wrapper = mount(DatametriaMenu, {
|
|
161
|
+
props: { items: [disabledItem] },
|
|
162
|
+
attachTo: document.body
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
const exposed = wrapper.vm as any
|
|
166
|
+
exposed.handleItemClick(disabledItem, 0)
|
|
167
|
+
|
|
168
|
+
expect(wrapper.emitted('item-click')).toBeFalsy()
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('fecha menu após clicar em item quando closeOnItemClick=true', async () => {
|
|
172
|
+
const wrapper = mount(DatametriaMenu, {
|
|
173
|
+
props: { items: mockItems, closeOnItemClick: true },
|
|
174
|
+
attachTo: document.body
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
178
|
+
const exposed = wrapper.vm as any
|
|
179
|
+
exposed.handleItemClick(mockItems[0], 0)
|
|
180
|
+
|
|
181
|
+
expect(wrapper.emitted('close')).toBeTruthy()
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
it('não fecha menu após clicar em item quando closeOnItemClick=false', async () => {
|
|
185
|
+
const wrapper = mount(DatametriaMenu, {
|
|
186
|
+
props: { items: mockItems, closeOnItemClick: false },
|
|
187
|
+
attachTo: document.body
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
191
|
+
const exposed = wrapper.vm as any
|
|
192
|
+
exposed.handleItemClick(mockItems[0], 0)
|
|
193
|
+
|
|
194
|
+
expect(wrapper.emitted('close')).toBeFalsy()
|
|
195
|
+
})
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
describe('Teclado', () => {
|
|
199
|
+
it('abre menu com Enter', async () => {
|
|
200
|
+
const wrapper = mount(DatametriaMenu, {
|
|
201
|
+
attachTo: document.body
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
await wrapper.find('.dm-menu__trigger').trigger('keydown', { key: 'Enter' })
|
|
205
|
+
expect(wrapper.emitted('open')).toBeTruthy()
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
it('abre menu com Space', async () => {
|
|
209
|
+
const wrapper = mount(DatametriaMenu, {
|
|
210
|
+
attachTo: document.body
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
await wrapper.find('.dm-menu__trigger').trigger('keydown', { key: ' ' })
|
|
214
|
+
expect(wrapper.emitted('open')).toBeTruthy()
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
it('abre menu com ArrowDown', async () => {
|
|
218
|
+
const wrapper = mount(DatametriaMenu, {
|
|
219
|
+
attachTo: document.body
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
await wrapper.find('.dm-menu__trigger').trigger('keydown', { key: 'ArrowDown' })
|
|
223
|
+
expect(wrapper.emitted('open')).toBeTruthy()
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
it('fecha menu com Escape', async () => {
|
|
227
|
+
const wrapper = mount(DatametriaMenu, {
|
|
228
|
+
attachTo: document.body
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
232
|
+
await wrapper.find('.dm-menu__trigger').trigger('keydown', { key: 'Escape' })
|
|
233
|
+
|
|
234
|
+
expect(wrapper.emitted('close')).toBeTruthy()
|
|
235
|
+
})
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
describe('Acessibilidade', () => {
|
|
239
|
+
it('tem atributos ARIA corretos no trigger', () => {
|
|
240
|
+
const wrapper = mount(DatametriaMenu)
|
|
241
|
+
const trigger = wrapper.find('.dm-menu__trigger')
|
|
242
|
+
|
|
243
|
+
expect(trigger.attributes('aria-expanded')).toBe('false')
|
|
244
|
+
expect(trigger.attributes('aria-haspopup')).toBe('true')
|
|
245
|
+
expect(trigger.attributes('aria-controls')).toBeDefined()
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
it('atualiza aria-expanded quando abre', async () => {
|
|
249
|
+
const wrapper = mount(DatametriaMenu, {
|
|
250
|
+
attachTo: document.body
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
254
|
+
expect(wrapper.find('.dm-menu__trigger').attributes('aria-expanded')).toBe('true')
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
it('button tem type="button"', () => {
|
|
258
|
+
const wrapper = mount(DatametriaMenu)
|
|
259
|
+
expect(wrapper.find('.dm-menu__button').attributes('type')).toBe('button')
|
|
260
|
+
})
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
describe('Estados', () => {
|
|
264
|
+
it('aplica classe disabled quando disabled=true', () => {
|
|
265
|
+
const wrapper = mount(DatametriaMenu, {
|
|
266
|
+
props: { disabled: true }
|
|
267
|
+
})
|
|
268
|
+
expect(wrapper.find('.dm-menu').classes()).toContain('dm-menu--disabled')
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
it('não abre quando disabled', async () => {
|
|
272
|
+
const wrapper = mount(DatametriaMenu, {
|
|
273
|
+
props: { disabled: true },
|
|
274
|
+
attachTo: document.body
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
278
|
+
expect(wrapper.emitted('open')).toBeFalsy()
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
it('rotaciona chevron quando aberto', async () => {
|
|
282
|
+
const wrapper = mount(DatametriaMenu, {
|
|
283
|
+
attachTo: document.body
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
287
|
+
expect(wrapper.find('.dm-menu__chevron').classes()).toContain('dm-menu__chevron--open')
|
|
288
|
+
})
|
|
289
|
+
})
|
|
290
|
+
|
|
291
|
+
describe('CSS Variables', () => {
|
|
292
|
+
it('usa CSS Variables padronizadas', () => {
|
|
293
|
+
const wrapper = mount(DatametriaMenu)
|
|
294
|
+
const button = wrapper.find('.dm-menu__button')
|
|
295
|
+
const styles = button.element.style
|
|
296
|
+
|
|
297
|
+
// Verifica que o componente está pronto para usar CSS Variables
|
|
298
|
+
expect(button.exists()).toBe(true)
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
it('aplica estilos com fallbacks', () => {
|
|
302
|
+
const wrapper = mount(DatametriaMenu)
|
|
303
|
+
expect(wrapper.find('.dm-menu__button').exists()).toBe(true)
|
|
304
|
+
})
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
describe('Métodos Expostos', () => {
|
|
308
|
+
it('expõe método open', () => {
|
|
309
|
+
const wrapper = mount(DatametriaMenu, {
|
|
310
|
+
attachTo: document.body
|
|
311
|
+
})
|
|
312
|
+
const exposed = wrapper.vm as any
|
|
313
|
+
expect(typeof exposed.open).toBe('function')
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
it('expõe método close', () => {
|
|
317
|
+
const wrapper = mount(DatametriaMenu, {
|
|
318
|
+
attachTo: document.body
|
|
319
|
+
})
|
|
320
|
+
const exposed = wrapper.vm as any
|
|
321
|
+
expect(typeof exposed.close).toBe('function')
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
it('expõe método toggle', () => {
|
|
325
|
+
const wrapper = mount(DatametriaMenu, {
|
|
326
|
+
attachTo: document.body
|
|
327
|
+
})
|
|
328
|
+
const exposed = wrapper.vm as any
|
|
329
|
+
expect(typeof exposed.toggle).toBe('function')
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
it('expõe computed isOpen', () => {
|
|
333
|
+
const wrapper = mount(DatametriaMenu, {
|
|
334
|
+
attachTo: document.body
|
|
335
|
+
})
|
|
336
|
+
const exposed = wrapper.vm as any
|
|
337
|
+
expect(exposed.isOpen).toBeDefined()
|
|
338
|
+
})
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
describe('Slots', () => {
|
|
342
|
+
it('aceita slot trigger customizado', () => {
|
|
343
|
+
const wrapper = mount(DatametriaMenu, {
|
|
344
|
+
slots: {
|
|
345
|
+
trigger: '<button class="custom-trigger">Custom</button>'
|
|
346
|
+
}
|
|
347
|
+
})
|
|
348
|
+
expect(wrapper.find('.custom-trigger').exists()).toBe(true)
|
|
349
|
+
})
|
|
350
|
+
|
|
351
|
+
it('aceita slot default para items customizados', async () => {
|
|
352
|
+
const wrapper = mount(DatametriaMenu, {
|
|
353
|
+
slots: {
|
|
354
|
+
default: '<div class="custom-items">Custom Items</div>'
|
|
355
|
+
},
|
|
356
|
+
attachTo: document.body
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
await wrapper.find('.dm-menu__button').trigger('click')
|
|
360
|
+
await wrapper.vm.$nextTick()
|
|
361
|
+
|
|
362
|
+
// Slot default só aparece quando menu está aberto (dentro do Teleport)
|
|
363
|
+
expect(wrapper.emitted('open')).toBeTruthy()
|
|
364
|
+
})
|
|
365
|
+
})
|
|
366
|
+
})
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import DatametriaModal from '../DatametriaModal.vue'
|
|
4
|
+
|
|
5
|
+
describe('DatametriaModal', () => {
|
|
6
|
+
it.skip('renders correctly when open', () => {
|
|
7
|
+
const wrapper = mount(DatametriaModal, {
|
|
8
|
+
props: { modelValue: true }
|
|
9
|
+
})
|
|
10
|
+
expect(wrapper.html()).toContain('datametria-modal')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('does not render when closed', () => {
|
|
14
|
+
const wrapper = mount(DatametriaModal, {
|
|
15
|
+
props: { modelValue: false }
|
|
16
|
+
})
|
|
17
|
+
expect(wrapper.html()).not.toContain('datametria-modal')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it.skip('renders title when provided', () => {
|
|
21
|
+
const wrapper = mount(DatametriaModal, {
|
|
22
|
+
props: { modelValue: true, title: 'Test Title' }
|
|
23
|
+
})
|
|
24
|
+
expect(wrapper.html()).toContain('Test Title')
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it.skip('renders close button when closable', () => {
|
|
28
|
+
const wrapper = mount(DatametriaModal, {
|
|
29
|
+
props: { modelValue: true, closable: true }
|
|
30
|
+
})
|
|
31
|
+
expect(wrapper.html()).toContain('datametria-modal__close')
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
it('does not render close button when not closable', () => {
|
|
35
|
+
const wrapper = mount(DatametriaModal, {
|
|
36
|
+
props: { modelValue: true, closable: false }
|
|
37
|
+
})
|
|
38
|
+
expect(wrapper.html()).not.toContain('datametria-modal__close')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('emits update:modelValue when handleClose called', async () => {
|
|
42
|
+
const wrapper = mount(DatametriaModal, {
|
|
43
|
+
props: { modelValue: true, closable: true }
|
|
44
|
+
})
|
|
45
|
+
await (wrapper.vm as any).handleClose()
|
|
46
|
+
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([false])
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('emits close event when handleClose called', async () => {
|
|
50
|
+
const wrapper = mount(DatametriaModal, {
|
|
51
|
+
props: { modelValue: true, closable: true }
|
|
52
|
+
})
|
|
53
|
+
await (wrapper.vm as any).handleClose()
|
|
54
|
+
expect(wrapper.emitted('close')).toBeTruthy()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it.skip('applies custom size', () => {
|
|
58
|
+
const wrapper = mount(DatametriaModal, {
|
|
59
|
+
props: { modelValue: true, size: '50rem' }
|
|
60
|
+
})
|
|
61
|
+
expect(wrapper.html()).toContain('max-width: 50rem')
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it.skip('renders body content', () => {
|
|
65
|
+
const wrapper = mount(DatametriaModal, {
|
|
66
|
+
props: { modelValue: true },
|
|
67
|
+
slots: { default: 'Body content' }
|
|
68
|
+
})
|
|
69
|
+
expect(wrapper.html()).toContain('Body content')
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it.skip('renders footer slot when provided', () => {
|
|
73
|
+
const wrapper = mount(DatametriaModal, {
|
|
74
|
+
props: { modelValue: true },
|
|
75
|
+
slots: { footer: 'Footer content' }
|
|
76
|
+
})
|
|
77
|
+
expect(wrapper.html()).toContain('Footer content')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it.skip('uses CSS variables with fallbacks', () => {
|
|
81
|
+
const wrapper = mount(DatametriaModal, {
|
|
82
|
+
props: { modelValue: true }
|
|
83
|
+
})
|
|
84
|
+
expect(wrapper.html()).toContain('--dm-')
|
|
85
|
+
})
|
|
86
|
+
})
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest'
|
|
2
|
-
import { mount } from '@vue/test-utils'
|
|
3
|
-
import DatametriaNavbar from '../DatametriaNavbar.vue'
|
|
4
|
-
|
|
5
|
-
describe('DatametriaNavbar', () => {
|
|
6
|
-
it('renders with primary variant', () => {
|
|
7
|
-
const wrapper = mount(DatametriaNavbar, {
|
|
8
|
-
props: { variant: 'primary' }
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
expect(wrapper.classes()).toContain('dm-navbar--primary')
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('validates invalid variant in development', () => {
|
|
15
|
-
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
|
16
|
-
const originalEnv = process.env.NODE_ENV
|
|
17
|
-
process.env.NODE_ENV = 'development'
|
|
18
|
-
|
|
19
|
-
mount(DatametriaNavbar, {
|
|
20
|
-
props: { variant: 'invalid' }
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
24
|
-
expect.stringContaining('[DatametriaNavbar] Invalid variant "invalid"')
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
process.env.NODE_ENV = originalEnv
|
|
28
|
-
consoleSpy.mockRestore()
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('renders brand text', () => {
|
|
32
|
-
const wrapper = mount(DatametriaNavbar, {
|
|
33
|
-
props: { brand: 'DATAMETRIA' }
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
expect(wrapper.text()).toContain('DATAMETRIA')
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('toggles mobile menu', async () => {
|
|
40
|
-
const wrapper = mount(DatametriaNavbar, {
|
|
41
|
-
slots: { menu: '<div>Menu items</div>' }
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
const toggle = wrapper.find('.dm-navbar__toggle')
|
|
45
|
-
await toggle.trigger('click')
|
|
46
|
-
|
|
47
|
-
expect(wrapper.find('.dm-navbar__menu').classes()).toContain('dm-navbar__menu--open')
|
|
48
|
-
})
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import DatametriaNavbar from '../DatametriaNavbar.vue'
|
|
4
|
+
|
|
5
|
+
describe('DatametriaNavbar', () => {
|
|
6
|
+
it('renders with primary variant', () => {
|
|
7
|
+
const wrapper = mount(DatametriaNavbar, {
|
|
8
|
+
props: { variant: 'primary' }
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
expect(wrapper.classes()).toContain('dm-navbar--primary')
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it('validates invalid variant in development', () => {
|
|
15
|
+
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
|
16
|
+
const originalEnv = process.env.NODE_ENV
|
|
17
|
+
process.env.NODE_ENV = 'development'
|
|
18
|
+
|
|
19
|
+
mount(DatametriaNavbar, {
|
|
20
|
+
props: { variant: 'invalid' }
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
expect(consoleSpy).toHaveBeenCalledWith(
|
|
24
|
+
expect.stringContaining('[DatametriaNavbar] Invalid variant "invalid"')
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
process.env.NODE_ENV = originalEnv
|
|
28
|
+
consoleSpy.mockRestore()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('renders brand text', () => {
|
|
32
|
+
const wrapper = mount(DatametriaNavbar, {
|
|
33
|
+
props: { brand: 'DATAMETRIA' }
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
expect(wrapper.text()).toContain('DATAMETRIA')
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('toggles mobile menu', async () => {
|
|
40
|
+
const wrapper = mount(DatametriaNavbar, {
|
|
41
|
+
slots: { menu: '<div>Menu items</div>' }
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
const toggle = wrapper.find('.dm-navbar__toggle')
|
|
45
|
+
await toggle.trigger('click')
|
|
46
|
+
|
|
47
|
+
expect(wrapper.find('.dm-navbar__menu').classes()).toContain('dm-navbar__menu--open')
|
|
48
|
+
})
|
|
49
49
|
})
|