@datametria/vue-components 2.3.1 → 2.4.0
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 +625 -594
- package/dist/index.es.js +1962 -1887
- package/dist/index.umd.js +6 -6
- package/dist/src/components/DatametriaForm.vue.d.ts +1 -1
- package/dist/src/components/DatametriaInput.vue.d.ts +9 -1
- package/dist/src/components/DatametriaSelect.vue.d.ts +10 -1
- package/dist/vue-components.css +1 -1
- package/package.json +103 -102
- package/src/components/DatametriaAlert.vue +151 -133
- package/src/components/DatametriaAutocomplete.vue +250 -229
- package/src/components/DatametriaAvatar.vue +256 -238
- package/src/components/DatametriaBadge.vue +101 -96
- package/src/components/DatametriaBreadcrumb.vue +132 -128
- package/src/components/DatametriaButton.vue +191 -173
- package/src/components/DatametriaCard.vue +84 -66
- package/src/components/DatametriaCheckbox.vue +197 -193
- package/src/components/DatametriaCheckboxGroup.vue +56 -38
- package/src/components/DatametriaChip.vue +159 -141
- package/src/components/DatametriaContainer.vue +70 -52
- package/src/components/DatametriaDataTable.vue +318 -300
- package/src/components/DatametriaDatePicker.vue +396 -378
- package/src/components/DatametriaDialog.vue +297 -293
- package/src/components/DatametriaDivider.vue +105 -98
- package/src/components/DatametriaDropdown.vue +356 -350
- package/src/components/DatametriaEmpty.vue +155 -151
- package/src/components/DatametriaFileUpload.vue +413 -395
- package/src/components/DatametriaFloatingBar.vue +144 -126
- package/src/components/DatametriaForm.vue +174 -156
- package/src/components/DatametriaFormItem.vue +183 -179
- package/src/components/DatametriaGrid.vue +55 -37
- package/src/components/DatametriaInput.vue +314 -263
- package/src/components/DatametriaMenu.vue +618 -600
- package/src/components/DatametriaModal.vue +147 -129
- package/src/components/DatametriaNavbar.vue +277 -223
- package/src/components/DatametriaPagination.vue +375 -371
- package/src/components/DatametriaPasswordInput.vue +444 -426
- package/src/components/DatametriaPopconfirm.vue +240 -234
- package/src/components/DatametriaProgress.vue +228 -224
- package/src/components/DatametriaRadio.vue +151 -147
- package/src/components/DatametriaRadioGroup.vue +55 -37
- package/src/components/DatametriaResult.vue +135 -131
- package/src/components/DatametriaSelect.vue +311 -211
- package/src/components/DatametriaSidebar.vue +294 -222
- package/src/components/DatametriaSkeleton.vue +257 -234
- package/src/components/DatametriaSlider.vue +409 -391
- package/src/components/DatametriaSortableTable.vue +820 -802
- package/src/components/DatametriaSpinner.vue +114 -110
- package/src/components/DatametriaSteps.vue +318 -312
- package/src/components/DatametriaSwitch.vue +146 -142
- package/src/components/DatametriaTabPane.vue +94 -76
- package/src/components/DatametriaTable.vue +118 -100
- package/src/components/DatametriaTabs.vue +315 -297
- package/src/components/DatametriaTextarea.vue +213 -195
- package/src/components/DatametriaTimePicker.vue +317 -299
- package/src/components/DatametriaToast.vue +176 -176
- package/src/components/DatametriaTooltip.vue +421 -400
- package/src/components/DatametriaTree.vue +126 -122
- package/src/components/DatametriaTreeNode.vue +176 -172
- package/src/components/DatametriaUpload.vue +379 -361
- package/src/components/__tests__/DatametriaAlert.test.js +35 -35
- package/src/components/__tests__/DatametriaAlert.test.ts +190 -190
- package/src/components/__tests__/DatametriaAvatar.test.ts +151 -151
- package/src/components/__tests__/DatametriaBadge.test.js +29 -29
- package/src/components/__tests__/DatametriaBadge.test.ts +167 -167
- package/src/components/__tests__/DatametriaBreadcrumb.test.ts +187 -0
- package/src/components/__tests__/DatametriaButton.test.js +30 -30
- package/src/components/__tests__/DatametriaButton.test.ts +283 -283
- package/src/components/__tests__/DatametriaCard.test.ts +201 -201
- package/src/components/__tests__/DatametriaCheckbox.test.ts +204 -0
- package/src/components/__tests__/DatametriaChip.test.js +38 -38
- package/src/components/__tests__/DatametriaContainer.test.ts +52 -52
- package/src/components/__tests__/DatametriaDialog.test.ts +338 -0
- package/src/components/__tests__/DatametriaDivider.test.ts +54 -54
- package/src/components/__tests__/DatametriaDropdown.test.ts +357 -0
- package/src/components/__tests__/DatametriaEmpty.test.ts +261 -0
- package/src/components/__tests__/DatametriaFileUpload.test.ts +290 -290
- package/src/components/__tests__/DatametriaFloatingBar.test.ts +137 -137
- package/src/components/__tests__/DatametriaForm.test.ts +96 -0
- package/src/components/__tests__/DatametriaFormItem.test.ts +58 -0
- package/src/components/__tests__/DatametriaGrid.test.ts +31 -31
- package/src/components/__tests__/DatametriaInput.test.ts +72 -72
- package/src/components/__tests__/DatametriaMenu.test.ts +366 -366
- package/src/components/__tests__/DatametriaModal.test.ts +86 -86
- package/src/components/__tests__/DatametriaNavbar.test.js +48 -48
- package/src/components/__tests__/DatametriaNavbar.test.ts +203 -203
- package/src/components/__tests__/DatametriaPasswordInput.test.js +305 -305
- package/src/components/__tests__/DatametriaRadio.test.ts +195 -0
- package/src/components/__tests__/DatametriaSelect.test.ts +77 -77
- package/src/components/__tests__/DatametriaSidebar.test.ts +169 -169
- package/src/components/__tests__/DatametriaSlider.test.ts +261 -261
- package/src/components/__tests__/DatametriaSortableTable.test.js +168 -168
- package/src/components/__tests__/DatametriaSpinner.test.ts +156 -156
- package/src/components/__tests__/DatametriaSteps.test.ts +211 -0
- package/src/components/__tests__/DatametriaSwitch.test.ts +129 -0
- package/src/components/__tests__/DatametriaTabPane.test.ts +205 -0
- package/src/components/__tests__/DatametriaTable.test.ts +97 -97
- package/src/components/__tests__/DatametriaTabs.test.ts +232 -232
- package/src/components/__tests__/DatametriaToast.test.js +48 -48
- package/src/components/__tests__/DatametriaToast.test.ts +99 -99
- package/src/components/__tests__/DatametriaTree.test.ts +376 -0
- package/src/components/__tests__/index.test.ts +48 -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/composables/useTheme.ts +5 -1
- package/src/index.ts +84 -84
- package/src/stories/Variants.stories.js +95 -95
- package/src/styles/design-tokens.css +623 -623
- package/src/theme/ThemeProvider.vue +96 -96
- package/src/theme/__tests__/ThemeProvider.test.ts +208 -208
- package/src/theme/__tests__/constants.test.ts +31 -31
- package/src/theme/__tests__/presets.test.ts +166 -166
- package/src/theme/__tests__/tokens.test.ts +155 -155
- package/src/theme/__tests__/types.test.ts +153 -153
- package/src/theme/__tests__/useTheme.test.ts +146 -146
- package/src/theme/constants.ts +14 -14
- package/src/theme/index.ts +12 -12
- package/src/theme/presets/datametria.ts +94 -94
- package/src/theme/presets/default.ts +94 -94
- package/src/theme/presets/index.ts +8 -8
- package/src/theme/tokens/colors.ts +28 -28
- package/src/theme/tokens/index.ts +47 -47
- package/src/theme/tokens/spacing.ts +21 -21
- package/src/theme/tokens/typography.ts +35 -35
- package/src/theme/types.ts +111 -111
- package/src/theme/useTheme.ts +28 -28
- package/src/types/index.ts +55 -55
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { mount } from '@vue/test-utils'
|
|
3
|
-
import DatametriaSortableTable from '../DatametriaSortableTable.vue'
|
|
4
|
-
|
|
5
|
-
describe('DatametriaSortableTable', () => {
|
|
6
|
-
const columns = [
|
|
7
|
-
{ key: 'id', label: 'ID', width: '80px' },
|
|
8
|
-
{ key: 'name', label: 'Nome' },
|
|
9
|
-
{ key: 'email', label: 'Email' },
|
|
10
|
-
{ key: 'status', label: 'Status' }
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
const data = [
|
|
14
|
-
{ id: 1, name: 'João Silva', email: 'joao@example.com', status: 'Ativo' },
|
|
15
|
-
{ id: 2, name: 'Maria Santos', email: 'maria@example.com', status: 'Inativo' },
|
|
16
|
-
{ id: 3, name: 'Pedro Costa', email: 'pedro@example.com', status: 'Ativo' },
|
|
17
|
-
{ id: 4, name: 'Ana Oliveira', email: 'ana@example.com', status: 'Ativo' }
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
it('renders table with data', () => {
|
|
21
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
22
|
-
props: { columns, data }
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
expect(wrapper.find('.datametria-sortable-table').exists()).toBe(true)
|
|
26
|
-
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(4)
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('renders search input when searchable', () => {
|
|
30
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
31
|
-
props: { columns, data, searchable: true }
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
expect(wrapper.find('.datametria-sortable-table__search-input').exists()).toBe(true)
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('filters data by search query', async () => {
|
|
38
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
39
|
-
props: { columns, data, searchable: true }
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
const searchInput = wrapper.find('.datametria-sortable-table__search-input')
|
|
43
|
-
await searchInput.setValue('João')
|
|
44
|
-
|
|
45
|
-
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(1)
|
|
46
|
-
expect(wrapper.text()).toContain('João Silva')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('sorts data when clicking column header', async () => {
|
|
50
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
51
|
-
props: { columns, data, paginated: false }
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
const nameHeader = wrapper.findAll('.datametria-sortable-table__th')[1]
|
|
55
|
-
await nameHeader.trigger('click')
|
|
56
|
-
|
|
57
|
-
const rows = wrapper.findAll('.datametria-sortable-table__tr')
|
|
58
|
-
expect(rows[0].text()).toContain('Ana Oliveira')
|
|
59
|
-
expect(rows[3].text()).toContain('Pedro Costa')
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('toggles sort order on second click', async () => {
|
|
63
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
64
|
-
props: { columns, data, paginated: false }
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
const nameHeader = wrapper.findAll('.datametria-sortable-table__th')[1]
|
|
68
|
-
await nameHeader.trigger('click') // Ascending
|
|
69
|
-
await nameHeader.trigger('click') // Descending
|
|
70
|
-
|
|
71
|
-
const rows = wrapper.findAll('.datametria-sortable-table__tr')
|
|
72
|
-
expect(rows[0].text()).toContain('Pedro Costa')
|
|
73
|
-
expect(rows[3].text()).toContain('Ana Oliveira')
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('renders checkboxes when selectable', () => {
|
|
77
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
78
|
-
props: { columns, data, selectable: true }
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
expect(wrapper.findAll('input[type="checkbox"]').length).toBeGreaterThan(0)
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('selects row when checkbox clicked', async () => {
|
|
85
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
86
|
-
props: { columns, data, selectable: true }
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
const firstCheckbox = wrapper.findAll('input[type="checkbox"]')[1]
|
|
90
|
-
await firstCheckbox.setValue(true)
|
|
91
|
-
|
|
92
|
-
expect(wrapper.emitted('selection-change')).toBeTruthy()
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('renders pagination controls when paginated', () => {
|
|
96
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
97
|
-
props: { columns, data, paginated: true, pageSize: 2 }
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
expect(wrapper.find('.datametria-sortable-table__pagination').exists()).toBe(true)
|
|
101
|
-
expect(wrapper.text()).toContain('Página 1 de 2')
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('changes page when pagination button clicked', async () => {
|
|
105
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
106
|
-
props: { columns, data, paginated: true, pageSize: 2 }
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
const nextButton = wrapper.findAll('.datametria-sortable-table__pagination-btn')[2]
|
|
110
|
-
await nextButton.trigger('click')
|
|
111
|
-
|
|
112
|
-
expect(wrapper.text()).toContain('Página 2 de 2')
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('renders column filters when filterable', () => {
|
|
116
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
117
|
-
props: { columns, data, filterable: true }
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
expect(wrapper.findAll('.datametria-sortable-table__filter-input').length).toBeGreaterThan(0)
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
it('filters by column filter', async () => {
|
|
124
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
125
|
-
props: { columns, data, filterable: true }
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
const statusFilter = wrapper.findAll('.datametria-sortable-table__filter-input')[3]
|
|
129
|
-
await statusFilter.setValue('Inativo')
|
|
130
|
-
|
|
131
|
-
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(1)
|
|
132
|
-
expect(wrapper.text()).toContain('Maria Santos')
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
it('shows empty state when no data', () => {
|
|
136
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
137
|
-
props: { columns, data: [] }
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
expect(wrapper.find('.datametria-sortable-table__empty').exists()).toBe(true)
|
|
141
|
-
expect(wrapper.text()).toContain('Nenhum dado encontrado')
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
it('disables sorting for specific columns', async () => {
|
|
145
|
-
const columnsWithNonSortable = [
|
|
146
|
-
{ key: 'id', label: 'ID', sortable: false },
|
|
147
|
-
{ key: 'name', label: 'Nome' }
|
|
148
|
-
]
|
|
149
|
-
|
|
150
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
151
|
-
props: { columns: columnsWithNonSortable, data }
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
const idHeader = wrapper.findAll('.datametria-sortable-table__th')[0]
|
|
155
|
-
expect(idHeader.classes()).not.toContain('datametria-sortable-table__th--sortable')
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
it('changes page size', async () => {
|
|
159
|
-
const wrapper = mount(DatametriaSortableTable, {
|
|
160
|
-
props: { columns, data, paginated: true, pageSize: 2, pageSizeOptions: [2, 5, 10] }
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
const pageSizeSelect = wrapper.find('.datametria-sortable-table__page-size')
|
|
164
|
-
await pageSizeSelect.setValue(5)
|
|
165
|
-
|
|
166
|
-
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(4)
|
|
167
|
-
})
|
|
168
|
-
})
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import DatametriaSortableTable from '../DatametriaSortableTable.vue'
|
|
4
|
+
|
|
5
|
+
describe('DatametriaSortableTable', () => {
|
|
6
|
+
const columns = [
|
|
7
|
+
{ key: 'id', label: 'ID', width: '80px' },
|
|
8
|
+
{ key: 'name', label: 'Nome' },
|
|
9
|
+
{ key: 'email', label: 'Email' },
|
|
10
|
+
{ key: 'status', label: 'Status' }
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
const data = [
|
|
14
|
+
{ id: 1, name: 'João Silva', email: 'joao@example.com', status: 'Ativo' },
|
|
15
|
+
{ id: 2, name: 'Maria Santos', email: 'maria@example.com', status: 'Inativo' },
|
|
16
|
+
{ id: 3, name: 'Pedro Costa', email: 'pedro@example.com', status: 'Ativo' },
|
|
17
|
+
{ id: 4, name: 'Ana Oliveira', email: 'ana@example.com', status: 'Ativo' }
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
it('renders table with data', () => {
|
|
21
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
22
|
+
props: { columns, data }
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
expect(wrapper.find('.datametria-sortable-table').exists()).toBe(true)
|
|
26
|
+
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(4)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it('renders search input when searchable', () => {
|
|
30
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
31
|
+
props: { columns, data, searchable: true }
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
expect(wrapper.find('.datametria-sortable-table__search-input').exists()).toBe(true)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('filters data by search query', async () => {
|
|
38
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
39
|
+
props: { columns, data, searchable: true }
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const searchInput = wrapper.find('.datametria-sortable-table__search-input')
|
|
43
|
+
await searchInput.setValue('João')
|
|
44
|
+
|
|
45
|
+
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(1)
|
|
46
|
+
expect(wrapper.text()).toContain('João Silva')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('sorts data when clicking column header', async () => {
|
|
50
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
51
|
+
props: { columns, data, paginated: false }
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
const nameHeader = wrapper.findAll('.datametria-sortable-table__th')[1]
|
|
55
|
+
await nameHeader.trigger('click')
|
|
56
|
+
|
|
57
|
+
const rows = wrapper.findAll('.datametria-sortable-table__tr')
|
|
58
|
+
expect(rows[0].text()).toContain('Ana Oliveira')
|
|
59
|
+
expect(rows[3].text()).toContain('Pedro Costa')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('toggles sort order on second click', async () => {
|
|
63
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
64
|
+
props: { columns, data, paginated: false }
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
const nameHeader = wrapper.findAll('.datametria-sortable-table__th')[1]
|
|
68
|
+
await nameHeader.trigger('click') // Ascending
|
|
69
|
+
await nameHeader.trigger('click') // Descending
|
|
70
|
+
|
|
71
|
+
const rows = wrapper.findAll('.datametria-sortable-table__tr')
|
|
72
|
+
expect(rows[0].text()).toContain('Pedro Costa')
|
|
73
|
+
expect(rows[3].text()).toContain('Ana Oliveira')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('renders checkboxes when selectable', () => {
|
|
77
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
78
|
+
props: { columns, data, selectable: true }
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
expect(wrapper.findAll('input[type="checkbox"]').length).toBeGreaterThan(0)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('selects row when checkbox clicked', async () => {
|
|
85
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
86
|
+
props: { columns, data, selectable: true }
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
const firstCheckbox = wrapper.findAll('input[type="checkbox"]')[1]
|
|
90
|
+
await firstCheckbox.setValue(true)
|
|
91
|
+
|
|
92
|
+
expect(wrapper.emitted('selection-change')).toBeTruthy()
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('renders pagination controls when paginated', () => {
|
|
96
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
97
|
+
props: { columns, data, paginated: true, pageSize: 2 }
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
expect(wrapper.find('.datametria-sortable-table__pagination').exists()).toBe(true)
|
|
101
|
+
expect(wrapper.text()).toContain('Página 1 de 2')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('changes page when pagination button clicked', async () => {
|
|
105
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
106
|
+
props: { columns, data, paginated: true, pageSize: 2 }
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
const nextButton = wrapper.findAll('.datametria-sortable-table__pagination-btn')[2]
|
|
110
|
+
await nextButton.trigger('click')
|
|
111
|
+
|
|
112
|
+
expect(wrapper.text()).toContain('Página 2 de 2')
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it('renders column filters when filterable', () => {
|
|
116
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
117
|
+
props: { columns, data, filterable: true }
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
expect(wrapper.findAll('.datametria-sortable-table__filter-input').length).toBeGreaterThan(0)
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('filters by column filter', async () => {
|
|
124
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
125
|
+
props: { columns, data, filterable: true }
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
const statusFilter = wrapper.findAll('.datametria-sortable-table__filter-input')[3]
|
|
129
|
+
await statusFilter.setValue('Inativo')
|
|
130
|
+
|
|
131
|
+
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(1)
|
|
132
|
+
expect(wrapper.text()).toContain('Maria Santos')
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('shows empty state when no data', () => {
|
|
136
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
137
|
+
props: { columns, data: [] }
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
expect(wrapper.find('.datametria-sortable-table__empty').exists()).toBe(true)
|
|
141
|
+
expect(wrapper.text()).toContain('Nenhum dado encontrado')
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('disables sorting for specific columns', async () => {
|
|
145
|
+
const columnsWithNonSortable = [
|
|
146
|
+
{ key: 'id', label: 'ID', sortable: false },
|
|
147
|
+
{ key: 'name', label: 'Nome' }
|
|
148
|
+
]
|
|
149
|
+
|
|
150
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
151
|
+
props: { columns: columnsWithNonSortable, data }
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
const idHeader = wrapper.findAll('.datametria-sortable-table__th')[0]
|
|
155
|
+
expect(idHeader.classes()).not.toContain('datametria-sortable-table__th--sortable')
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('changes page size', async () => {
|
|
159
|
+
const wrapper = mount(DatametriaSortableTable, {
|
|
160
|
+
props: { columns, data, paginated: true, pageSize: 2, pageSizeOptions: [2, 5, 10] }
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
const pageSizeSelect = wrapper.find('.datametria-sortable-table__page-size')
|
|
164
|
+
await pageSizeSelect.setValue(5)
|
|
165
|
+
|
|
166
|
+
expect(wrapper.findAll('.datametria-sortable-table__tr')).toHaveLength(4)
|
|
167
|
+
})
|
|
168
|
+
})
|
|
@@ -1,156 +1,156 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { mount } from '@vue/test-utils'
|
|
3
|
-
import DatametriaSpinner from '../DatametriaSpinner.vue'
|
|
4
|
-
|
|
5
|
-
describe('DatametriaSpinner', () => {
|
|
6
|
-
// Rendering tests
|
|
7
|
-
it('renders with default props', () => {
|
|
8
|
-
const wrapper = mount(DatametriaSpinner)
|
|
9
|
-
expect(wrapper.find('.dm-spinner').exists()).toBe(true)
|
|
10
|
-
expect(wrapper.find('.dm-spinner--md').exists()).toBe(true)
|
|
11
|
-
expect(wrapper.find('.dm-spinner--primary').exists()).toBe(true)
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('renders with label', () => {
|
|
15
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
16
|
-
props: { label: 'Loading...' }
|
|
17
|
-
})
|
|
18
|
-
expect(wrapper.find('.dm-spinner__label').text()).toBe('Loading...')
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('renders without label', () => {
|
|
22
|
-
const wrapper = mount(DatametriaSpinner)
|
|
23
|
-
expect(wrapper.find('.dm-spinner__label').exists()).toBe(false)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('renders with custom aria-label', () => {
|
|
27
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
28
|
-
props: { ariaLabel: 'Custom loading' }
|
|
29
|
-
})
|
|
30
|
-
expect(wrapper.attributes('aria-label')).toBe('Custom loading')
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('has role status', () => {
|
|
34
|
-
const wrapper = mount(DatametriaSpinner)
|
|
35
|
-
expect(wrapper.attributes('role')).toBe('status')
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
// Size tests
|
|
39
|
-
it('renders small size', () => {
|
|
40
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
41
|
-
props: { size: 'sm' }
|
|
42
|
-
})
|
|
43
|
-
expect(wrapper.find('.dm-spinner--sm').exists()).toBe(true)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('renders medium size', () => {
|
|
47
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
48
|
-
props: { size: 'md' }
|
|
49
|
-
})
|
|
50
|
-
expect(wrapper.find('.dm-spinner--md').exists()).toBe(true)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('renders large size', () => {
|
|
54
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
55
|
-
props: { size: 'lg' }
|
|
56
|
-
})
|
|
57
|
-
expect(wrapper.find('.dm-spinner--lg').exists()).toBe(true)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
// Variant tests
|
|
61
|
-
it('renders primary variant', () => {
|
|
62
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
63
|
-
props: { variant: 'primary' }
|
|
64
|
-
})
|
|
65
|
-
expect(wrapper.find('.dm-spinner--primary').exists()).toBe(true)
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('renders secondary variant', () => {
|
|
69
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
70
|
-
props: { variant: 'secondary' }
|
|
71
|
-
})
|
|
72
|
-
expect(wrapper.find('.dm-spinner--secondary').exists()).toBe(true)
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('renders white variant', () => {
|
|
76
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
77
|
-
props: { variant: 'white' }
|
|
78
|
-
})
|
|
79
|
-
expect(wrapper.find('.dm-spinner--white').exists()).toBe(true)
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
// SVG structure tests
|
|
83
|
-
it('renders SVG element', () => {
|
|
84
|
-
const wrapper = mount(DatametriaSpinner)
|
|
85
|
-
expect(wrapper.find('.dm-spinner__svg').exists()).toBe(true)
|
|
86
|
-
expect(wrapper.find('svg').exists()).toBe(true)
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
it('renders circle element', () => {
|
|
90
|
-
const wrapper = mount(DatametriaSpinner)
|
|
91
|
-
expect(wrapper.find('.dm-spinner__circle').exists()).toBe(true)
|
|
92
|
-
expect(wrapper.find('circle').exists()).toBe(true)
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('circle has correct attributes', () => {
|
|
96
|
-
const wrapper = mount(DatametriaSpinner)
|
|
97
|
-
const circle = wrapper.find('circle')
|
|
98
|
-
expect(circle.attributes('cx')).toBe('25')
|
|
99
|
-
expect(circle.attributes('cy')).toBe('25')
|
|
100
|
-
expect(circle.attributes('r')).toBe('20')
|
|
101
|
-
expect(circle.attributes('fill')).toBe('none')
|
|
102
|
-
expect(circle.attributes('stroke-width')).toBe('4')
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
// CSS Variables tests
|
|
106
|
-
it('uses CSS variables for colors', () => {
|
|
107
|
-
const variants: Array<'primary' | 'secondary' | 'white'> = ['primary', 'secondary', 'white']
|
|
108
|
-
|
|
109
|
-
variants.forEach(variant => {
|
|
110
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
111
|
-
props: { variant }
|
|
112
|
-
})
|
|
113
|
-
expect(wrapper.find(`.dm-spinner--${variant}`).exists()).toBe(true)
|
|
114
|
-
})
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
it('uses CSS variables for spacing', () => {
|
|
118
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
119
|
-
props: { label: 'Test' }
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
// Verifica estrutura
|
|
123
|
-
expect(wrapper.find('.dm-spinner').exists()).toBe(true)
|
|
124
|
-
expect(wrapper.find('.dm-spinner__label').exists()).toBe(true)
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
// Backward compatibility tests
|
|
128
|
-
it('works without ThemeProvider (fallback values)', () => {
|
|
129
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
130
|
-
props: {
|
|
131
|
-
variant: 'primary',
|
|
132
|
-
size: 'md',
|
|
133
|
-
label: 'Loading'
|
|
134
|
-
}
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
expect(wrapper.find('.dm-spinner--primary').exists()).toBe(true)
|
|
138
|
-
expect(wrapper.find('.dm-spinner--md').exists()).toBe(true)
|
|
139
|
-
expect(wrapper.text()).toContain('Loading')
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
it('maintains visual consistency across variants and sizes', () => {
|
|
143
|
-
const variants: Array<'primary' | 'secondary' | 'white'> = ['primary', 'secondary', 'white']
|
|
144
|
-
const sizes: Array<'sm' | 'md' | 'lg'> = ['sm', 'md', 'lg']
|
|
145
|
-
|
|
146
|
-
variants.forEach(variant => {
|
|
147
|
-
sizes.forEach(size => {
|
|
148
|
-
const wrapper = mount(DatametriaSpinner, {
|
|
149
|
-
props: { variant, size }
|
|
150
|
-
})
|
|
151
|
-
expect(wrapper.find(`.dm-spinner--${variant}`).exists()).toBe(true)
|
|
152
|
-
expect(wrapper.find(`.dm-spinner--${size}`).exists()).toBe(true)
|
|
153
|
-
})
|
|
154
|
-
})
|
|
155
|
-
})
|
|
156
|
-
})
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import DatametriaSpinner from '../DatametriaSpinner.vue'
|
|
4
|
+
|
|
5
|
+
describe('DatametriaSpinner', () => {
|
|
6
|
+
// Rendering tests
|
|
7
|
+
it('renders with default props', () => {
|
|
8
|
+
const wrapper = mount(DatametriaSpinner)
|
|
9
|
+
expect(wrapper.find('.dm-spinner').exists()).toBe(true)
|
|
10
|
+
expect(wrapper.find('.dm-spinner--md').exists()).toBe(true)
|
|
11
|
+
expect(wrapper.find('.dm-spinner--primary').exists()).toBe(true)
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it('renders with label', () => {
|
|
15
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
16
|
+
props: { label: 'Loading...' }
|
|
17
|
+
})
|
|
18
|
+
expect(wrapper.find('.dm-spinner__label').text()).toBe('Loading...')
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it('renders without label', () => {
|
|
22
|
+
const wrapper = mount(DatametriaSpinner)
|
|
23
|
+
expect(wrapper.find('.dm-spinner__label').exists()).toBe(false)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('renders with custom aria-label', () => {
|
|
27
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
28
|
+
props: { ariaLabel: 'Custom loading' }
|
|
29
|
+
})
|
|
30
|
+
expect(wrapper.attributes('aria-label')).toBe('Custom loading')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('has role status', () => {
|
|
34
|
+
const wrapper = mount(DatametriaSpinner)
|
|
35
|
+
expect(wrapper.attributes('role')).toBe('status')
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// Size tests
|
|
39
|
+
it('renders small size', () => {
|
|
40
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
41
|
+
props: { size: 'sm' }
|
|
42
|
+
})
|
|
43
|
+
expect(wrapper.find('.dm-spinner--sm').exists()).toBe(true)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('renders medium size', () => {
|
|
47
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
48
|
+
props: { size: 'md' }
|
|
49
|
+
})
|
|
50
|
+
expect(wrapper.find('.dm-spinner--md').exists()).toBe(true)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('renders large size', () => {
|
|
54
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
55
|
+
props: { size: 'lg' }
|
|
56
|
+
})
|
|
57
|
+
expect(wrapper.find('.dm-spinner--lg').exists()).toBe(true)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// Variant tests
|
|
61
|
+
it('renders primary variant', () => {
|
|
62
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
63
|
+
props: { variant: 'primary' }
|
|
64
|
+
})
|
|
65
|
+
expect(wrapper.find('.dm-spinner--primary').exists()).toBe(true)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('renders secondary variant', () => {
|
|
69
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
70
|
+
props: { variant: 'secondary' }
|
|
71
|
+
})
|
|
72
|
+
expect(wrapper.find('.dm-spinner--secondary').exists()).toBe(true)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('renders white variant', () => {
|
|
76
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
77
|
+
props: { variant: 'white' }
|
|
78
|
+
})
|
|
79
|
+
expect(wrapper.find('.dm-spinner--white').exists()).toBe(true)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// SVG structure tests
|
|
83
|
+
it('renders SVG element', () => {
|
|
84
|
+
const wrapper = mount(DatametriaSpinner)
|
|
85
|
+
expect(wrapper.find('.dm-spinner__svg').exists()).toBe(true)
|
|
86
|
+
expect(wrapper.find('svg').exists()).toBe(true)
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('renders circle element', () => {
|
|
90
|
+
const wrapper = mount(DatametriaSpinner)
|
|
91
|
+
expect(wrapper.find('.dm-spinner__circle').exists()).toBe(true)
|
|
92
|
+
expect(wrapper.find('circle').exists()).toBe(true)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('circle has correct attributes', () => {
|
|
96
|
+
const wrapper = mount(DatametriaSpinner)
|
|
97
|
+
const circle = wrapper.find('circle')
|
|
98
|
+
expect(circle.attributes('cx')).toBe('25')
|
|
99
|
+
expect(circle.attributes('cy')).toBe('25')
|
|
100
|
+
expect(circle.attributes('r')).toBe('20')
|
|
101
|
+
expect(circle.attributes('fill')).toBe('none')
|
|
102
|
+
expect(circle.attributes('stroke-width')).toBe('4')
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
// CSS Variables tests
|
|
106
|
+
it('uses CSS variables for colors', () => {
|
|
107
|
+
const variants: Array<'primary' | 'secondary' | 'white'> = ['primary', 'secondary', 'white']
|
|
108
|
+
|
|
109
|
+
variants.forEach(variant => {
|
|
110
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
111
|
+
props: { variant }
|
|
112
|
+
})
|
|
113
|
+
expect(wrapper.find(`.dm-spinner--${variant}`).exists()).toBe(true)
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
it('uses CSS variables for spacing', () => {
|
|
118
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
119
|
+
props: { label: 'Test' }
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
// Verifica estrutura
|
|
123
|
+
expect(wrapper.find('.dm-spinner').exists()).toBe(true)
|
|
124
|
+
expect(wrapper.find('.dm-spinner__label').exists()).toBe(true)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
// Backward compatibility tests
|
|
128
|
+
it('works without ThemeProvider (fallback values)', () => {
|
|
129
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
130
|
+
props: {
|
|
131
|
+
variant: 'primary',
|
|
132
|
+
size: 'md',
|
|
133
|
+
label: 'Loading'
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
expect(wrapper.find('.dm-spinner--primary').exists()).toBe(true)
|
|
138
|
+
expect(wrapper.find('.dm-spinner--md').exists()).toBe(true)
|
|
139
|
+
expect(wrapper.text()).toContain('Loading')
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
it('maintains visual consistency across variants and sizes', () => {
|
|
143
|
+
const variants: Array<'primary' | 'secondary' | 'white'> = ['primary', 'secondary', 'white']
|
|
144
|
+
const sizes: Array<'sm' | 'md' | 'lg'> = ['sm', 'md', 'lg']
|
|
145
|
+
|
|
146
|
+
variants.forEach(variant => {
|
|
147
|
+
sizes.forEach(size => {
|
|
148
|
+
const wrapper = mount(DatametriaSpinner, {
|
|
149
|
+
props: { variant, size }
|
|
150
|
+
})
|
|
151
|
+
expect(wrapper.find(`.dm-spinner--${variant}`).exists()).toBe(true)
|
|
152
|
+
expect(wrapper.find(`.dm-spinner--${size}`).exists()).toBe(true)
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
})
|
|
156
|
+
})
|