@gitlab/ui 114.1.0 → 114.1.2

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.
Files changed (141) hide show
  1. package/dist/components/base/breadcrumb/breadcrumb.js +4 -16
  2. package/dist/index.css +1 -1
  3. package/dist/index.css.map +1 -1
  4. package/package.json +7 -26
  5. package/src/components/base/breadcrumb/breadcrumb.scss +18 -2
  6. package/src/components/base/breadcrumb/breadcrumb.vue +4 -17
  7. package/CHANGELOG.md +0 -13139
  8. package/src/vendor/bootstrap/LICENSE +0 -11
  9. package/src/vendor/bootstrap-vue/LICENSE +0 -11
  10. package/src/vendor/bootstrap-vue/package.json +0 -144
  11. package/src/vendor/bootstrap-vue/src/components/button/MODIFICATIONS.md +0 -16
  12. package/src/vendor/bootstrap-vue/src/components/button/README.md +0 -240
  13. package/src/vendor/bootstrap-vue/src/components/button/button-close.spec.js +0 -210
  14. package/src/vendor/bootstrap-vue/src/components/button/button.spec.js +0 -349
  15. package/src/vendor/bootstrap-vue/src/components/button/package.json +0 -105
  16. package/src/vendor/bootstrap-vue/src/components/dropdown/README.md +0 -730
  17. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.spec.js +0 -58
  18. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.spec.js +0 -110
  19. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.spec.js +0 -94
  20. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.spec.js +0 -73
  21. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.spec.js +0 -117
  22. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.spec.js +0 -147
  23. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.spec.js +0 -59
  24. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.spec.js +0 -1121
  25. package/src/vendor/bootstrap-vue/src/components/dropdown/package.json +0 -368
  26. package/src/vendor/bootstrap-vue/src/components/form/README.md +0 -365
  27. package/src/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.spec.js +0 -170
  28. package/src/vendor/bootstrap-vue/src/components/form/form-text.spec.js +0 -93
  29. package/src/vendor/bootstrap-vue/src/components/form/form-valid-feedback.spec.js +0 -157
  30. package/src/vendor/bootstrap-vue/src/components/form/form.spec.js +0 -97
  31. package/src/vendor/bootstrap-vue/src/components/form/package.json +0 -112
  32. package/src/vendor/bootstrap-vue/src/components/form-checkbox/README.md +0 -691
  33. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.spec.js +0 -525
  34. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.spec.js +0 -922
  35. package/src/vendor/bootstrap-vue/src/components/form-checkbox/package.json +0 -172
  36. package/src/vendor/bootstrap-vue/src/components/form-group/README.md +0 -339
  37. package/src/vendor/bootstrap-vue/src/components/form-group/form-group.spec.js +0 -477
  38. package/src/vendor/bootstrap-vue/src/components/form-group/package.json +0 -183
  39. package/src/vendor/bootstrap-vue/src/components/form-radio/README.md +0 -437
  40. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio-group.spec.js +0 -357
  41. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio.spec.js +0 -587
  42. package/src/vendor/bootstrap-vue/src/components/form-radio/package.json +0 -162
  43. package/src/vendor/bootstrap-vue/src/components/form-select/README.md +0 -504
  44. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.spec.js +0 -138
  45. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option.spec.js +0 -75
  46. package/src/vendor/bootstrap-vue/src/components/form-select/form-select.spec.js +0 -723
  47. package/src/vendor/bootstrap-vue/src/components/form-select/package.json +0 -132
  48. package/src/vendor/bootstrap-vue/src/components/form-textarea/README.md +0 -453
  49. package/src/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.spec.js +0 -1000
  50. package/src/vendor/bootstrap-vue/src/components/form-textarea/package.json +0 -122
  51. package/src/vendor/bootstrap-vue/src/components/layout/README.md +0 -791
  52. package/src/vendor/bootstrap-vue/src/components/layout/col.spec.js +0 -192
  53. package/src/vendor/bootstrap-vue/src/components/layout/form-row.spec.js +0 -45
  54. package/src/vendor/bootstrap-vue/src/components/layout/package.json +0 -99
  55. package/src/vendor/bootstrap-vue/src/components/link/README.md +0 -76
  56. package/src/vendor/bootstrap-vue/src/components/link/link.spec.js +0 -434
  57. package/src/vendor/bootstrap-vue/src/components/link/package.json +0 -57
  58. package/src/vendor/bootstrap-vue/src/components/modal/MODIFICATIONS.md +0 -30
  59. package/src/vendor/bootstrap-vue/src/components/modal/README.md +0 -1067
  60. package/src/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.spec.js +0 -82
  61. package/src/vendor/bootstrap-vue/src/components/modal/modal.spec.js +0 -1418
  62. package/src/vendor/bootstrap-vue/src/components/modal/package.json +0 -544
  63. package/src/vendor/bootstrap-vue/src/components/nav/README.md +0 -362
  64. package/src/vendor/bootstrap-vue/src/components/nav/nav-item.spec.js +0 -127
  65. package/src/vendor/bootstrap-vue/src/components/nav/nav.spec.js +0 -177
  66. package/src/vendor/bootstrap-vue/src/components/nav/package.json +0 -73
  67. package/src/vendor/bootstrap-vue/src/components/popover/README.md +0 -919
  68. package/src/vendor/bootstrap-vue/src/components/popover/package.json +0 -261
  69. package/src/vendor/bootstrap-vue/src/components/popover/popover.spec.js +0 -198
  70. package/src/vendor/bootstrap-vue/src/components/table/README.md +0 -3157
  71. package/src/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.spec.js +0 -112
  72. package/src/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.spec.js +0 -93
  73. package/src/vendor/bootstrap-vue/src/components/table/package.json +0 -1763
  74. package/src/vendor/bootstrap-vue/src/components/table/table-busy.spec.js +0 -150
  75. package/src/vendor/bootstrap-vue/src/components/table/table-caption.spec.js +0 -176
  76. package/src/vendor/bootstrap-vue/src/components/table/table-colgroup.spec.js +0 -81
  77. package/src/vendor/bootstrap-vue/src/components/table/table-filtering.spec.js +0 -409
  78. package/src/vendor/bootstrap-vue/src/components/table/table-item-formatter.spec.js +0 -56
  79. package/src/vendor/bootstrap-vue/src/components/table/table-lite.spec.js +0 -682
  80. package/src/vendor/bootstrap-vue/src/components/table/table-pagination.spec.js +0 -133
  81. package/src/vendor/bootstrap-vue/src/components/table/table-primarykey.spec.js +0 -83
  82. package/src/vendor/bootstrap-vue/src/components/table/table-provider.spec.js +0 -411
  83. package/src/vendor/bootstrap-vue/src/components/table/table-row-details.spec.js +0 -459
  84. package/src/vendor/bootstrap-vue/src/components/table/table-selectable.spec.js +0 -1182
  85. package/src/vendor/bootstrap-vue/src/components/table/table-simple.spec.js +0 -206
  86. package/src/vendor/bootstrap-vue/src/components/table/table-sorting.spec.js +0 -858
  87. package/src/vendor/bootstrap-vue/src/components/table/table-sticky-column.spec.js +0 -377
  88. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-bottom-row.spec.js +0 -94
  89. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-row-events.spec.js +0 -529
  90. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-top-row.spec.js +0 -88
  91. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-transition.spec.js +0 -83
  92. package/src/vendor/bootstrap-vue/src/components/table/table-tfoot-custom.spec.js +0 -91
  93. package/src/vendor/bootstrap-vue/src/components/table/table-tfoot-events.spec.js +0 -137
  94. package/src/vendor/bootstrap-vue/src/components/table/table-thead-events.spec.js +0 -155
  95. package/src/vendor/bootstrap-vue/src/components/table/table-thead-top.spec.js +0 -96
  96. package/src/vendor/bootstrap-vue/src/components/table/table.spec.js +0 -692
  97. package/src/vendor/bootstrap-vue/src/components/tabs/README.md +0 -433
  98. package/src/vendor/bootstrap-vue/src/components/tabs/package.json +0 -205
  99. package/src/vendor/bootstrap-vue/src/components/tabs/tab.spec.js +0 -330
  100. package/src/vendor/bootstrap-vue/src/components/tabs/tabs.spec.js +0 -778
  101. package/src/vendor/bootstrap-vue/src/components/toast/README.md +0 -655
  102. package/src/vendor/bootstrap-vue/src/components/toast/helpers/bv-toast.spec.js +0 -117
  103. package/src/vendor/bootstrap-vue/src/components/toast/package.json +0 -184
  104. package/src/vendor/bootstrap-vue/src/components/toast/toast.spec.js +0 -294
  105. package/src/vendor/bootstrap-vue/src/components/toast/toaster.spec.js +0 -77
  106. package/src/vendor/bootstrap-vue/src/components/tooltip/README.md +0 -559
  107. package/src/vendor/bootstrap-vue/src/components/tooltip/package.json +0 -258
  108. package/src/vendor/bootstrap-vue/src/components/tooltip/tooltip.spec.js +0 -1240
  109. package/src/vendor/bootstrap-vue/src/components/transition/package.json +0 -5
  110. package/src/vendor/bootstrap-vue/src/components/transporter/package.json +0 -5
  111. package/src/vendor/bootstrap-vue/src/components/transporter/transporter.spec.js +0 -85
  112. package/src/vendor/bootstrap-vue/src/directives/modal/modal.spec.js +0 -191
  113. package/src/vendor/bootstrap-vue/src/directives/tooltip/README.md +0 -521
  114. package/src/vendor/bootstrap-vue/src/directives/tooltip/package.json +0 -131
  115. package/src/vendor/bootstrap-vue/src/directives/tooltip/tooltip.spec.js +0 -190
  116. package/src/vendor/bootstrap-vue/src/directives/visible/README.md +0 -244
  117. package/src/vendor/bootstrap-vue/src/directives/visible/package.json +0 -24
  118. package/src/vendor/bootstrap-vue/src/mixins/attrs.spec.js +0 -194
  119. package/src/vendor/bootstrap-vue/src/mixins/click-out.spec.js +0 -52
  120. package/src/vendor/bootstrap-vue/src/mixins/focus-in.spec.js +0 -53
  121. package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.spec.js +0 -117
  122. package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.spec.js +0 -77
  123. package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.spec.js +0 -115
  124. package/src/vendor/bootstrap-vue/src/mixins/listeners.spec.js +0 -245
  125. package/src/vendor/bootstrap-vue/src/utils/bv-event.class.spec.js +0 -66
  126. package/src/vendor/bootstrap-vue/src/utils/clone-deep.spec.js +0 -70
  127. package/src/vendor/bootstrap-vue/src/utils/config.spec.js +0 -169
  128. package/src/vendor/bootstrap-vue/src/utils/css-escape.spec.js +0 -82
  129. package/src/vendor/bootstrap-vue/src/utils/dom.spec.js +0 -291
  130. package/src/vendor/bootstrap-vue/src/utils/events.spec.js +0 -41
  131. package/src/vendor/bootstrap-vue/src/utils/get.spec.js +0 -109
  132. package/src/vendor/bootstrap-vue/src/utils/inspect.spec.js +0 -251
  133. package/src/vendor/bootstrap-vue/src/utils/loose-equal.spec.js +0 -203
  134. package/src/vendor/bootstrap-vue/src/utils/normalize-slot.spec.js +0 -63
  135. package/src/vendor/bootstrap-vue/src/utils/number.spec.js +0 -72
  136. package/src/vendor/bootstrap-vue/src/utils/object.spec.js +0 -61
  137. package/src/vendor/bootstrap-vue/src/utils/props.spec.js +0 -112
  138. package/src/vendor/bootstrap-vue/src/utils/router.spec.js +0 -248
  139. package/src/vendor/bootstrap-vue/src/utils/string.spec.js +0 -65
  140. package/src/vendor/bootstrap-vue/src/utils/stringify-object-values.spec.js +0 -47
  141. package/src/vendor/bootstrap-vue/src/utils/warn.spec.js +0 -54
@@ -1,1121 +0,0 @@
1
- import { mount } from '@vue/test-utils'
2
- import { waitNT, waitRAF } from '../../../tests/utils'
3
- import { BDropdown } from './dropdown'
4
- import { BDropdownItem } from './dropdown-item'
5
-
6
- describe('dropdown', () => {
7
- const originalCreateRange = document.createRange
8
- const origGetBCR = Element.prototype.getBoundingClientRect
9
-
10
- beforeEach(() => {
11
- // https://github.com/FezVrasta/popper.js/issues/478#issuecomment-407422016
12
- // Hack to make Popper not bork out during tests
13
- // Note popper still does not do any positioning calculation in JSDOM though
14
- // So we cannot test actual positioning of the menu, just detect when it is open
15
- document.createRange = () => ({
16
- setStart: () => {},
17
- setEnd: () => {},
18
- commonAncestorContainer: {
19
- nodeName: 'BODY',
20
- ownerDocument: document
21
- }
22
- })
23
- // Mock `getBoundingClientRect()` so that the `isVisible(el)` test returns `true`
24
- // Needed for keyboard navigation testing
25
- Element.prototype.getBoundingClientRect = jest.fn(() => ({
26
- width: 24,
27
- height: 24,
28
- top: 0,
29
- left: 0,
30
- bottom: 0,
31
- right: 0
32
- }))
33
- })
34
-
35
- afterEach(() => {
36
- // Reset overrides
37
- document.createRange = originalCreateRange
38
- Element.prototype.getBoundingClientRect = origGetBCR
39
- })
40
-
41
- it('has expected default structure', async () => {
42
- const wrapper = mount(BDropdown, {
43
- attachTo: document.body
44
- })
45
-
46
- expect(wrapper.element.tagName).toBe('DIV')
47
- expect(wrapper.vm).toBeDefined()
48
-
49
- // Wait for auto ID to be generated
50
- await waitNT(wrapper.vm)
51
-
52
- expect(wrapper.classes()).toContain('dropdown')
53
- expect(wrapper.classes()).toContain('btn-group')
54
- expect(wrapper.classes()).toContain('b-dropdown')
55
- expect(wrapper.classes().length).toBe(3)
56
- expect(wrapper.attributes('id')).toBeDefined()
57
- const wrapperId = wrapper.attributes('id')
58
-
59
- expect(wrapper.findAll('button').length).toBe(1)
60
- const $button = wrapper.find('button')
61
- expect($button.classes()).toContain('btn')
62
- expect($button.classes()).toContain('btn-secondary')
63
- expect($button.classes()).toContain('dropdown-toggle')
64
- expect($button.classes().length).toBe(3)
65
- expect($button.attributes('aria-haspopup')).toBeDefined()
66
- expect($button.attributes('aria-haspopup')).toEqual('menu')
67
- expect($button.attributes('aria-expanded')).toBeDefined()
68
- expect($button.attributes('aria-expanded')).toEqual('false')
69
- expect($button.attributes('id')).toBeDefined()
70
- expect($button.attributes('id')).toEqual(`${wrapperId}__BV_toggle_`)
71
- expect($button.text()).toEqual('')
72
-
73
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
74
- const $menu = wrapper.find('.dropdown-menu')
75
- expect($menu.element.tagName).toBe('UL')
76
- expect($menu.classes().length).toBe(1)
77
- expect($menu.attributes('role')).toBeDefined()
78
- expect($menu.attributes('role')).toEqual('menu')
79
- expect($menu.attributes('tabindex')).toBeDefined()
80
- expect($menu.attributes('tabindex')).toEqual('-1')
81
- expect($menu.attributes('aria-labelledby')).toBeDefined()
82
- expect($menu.attributes('aria-labelledby')).toEqual(`${wrapperId}__BV_toggle_`)
83
- expect($menu.text()).toEqual('')
84
-
85
- wrapper.destroy()
86
- })
87
-
88
- it('split mode has expected default structure', async () => {
89
- const wrapper = mount(BDropdown, {
90
- attachTo: document.body,
91
- propsData: {
92
- split: true
93
- }
94
- })
95
-
96
- expect(wrapper.element.tagName).toBe('DIV')
97
- expect(wrapper.vm).toBeDefined()
98
-
99
- // Wait for auto ID to be generated
100
- await waitNT(wrapper.vm)
101
-
102
- expect(wrapper.classes()).toContain('dropdown')
103
- expect(wrapper.classes()).toContain('btn-group')
104
- expect(wrapper.classes()).toContain('b-dropdown')
105
- expect(wrapper.classes().length).toBe(3)
106
- expect(wrapper.attributes('id')).toBeDefined()
107
- const wrapperId = wrapper.attributes('id')
108
-
109
- expect(wrapper.findAll('button').length).toBe(2)
110
- const $buttons = wrapper.findAll('button')
111
- const $split = $buttons.at(0)
112
- const $toggle = $buttons.at(1)
113
-
114
- expect($split.classes()).toContain('btn')
115
- expect($split.classes()).toContain('btn-secondary')
116
- expect($split.attributes('id')).toBeDefined()
117
- expect($split.attributes('id')).toEqual(`${wrapperId}__BV_button_`)
118
- expect($split.attributes('type')).toBeDefined()
119
- expect($split.attributes('type')).toEqual('button')
120
- expect($split.text()).toEqual('')
121
-
122
- expect($toggle.classes()).toContain('btn')
123
- expect($toggle.classes()).toContain('btn-secondary')
124
- expect($toggle.classes()).toContain('dropdown-toggle')
125
- expect($toggle.classes()).toContain('dropdown-toggle-split')
126
- expect($toggle.classes().length).toBe(4)
127
- expect($toggle.attributes('aria-haspopup')).toBeDefined()
128
- expect($toggle.attributes('aria-haspopup')).toEqual('menu')
129
- expect($toggle.attributes('aria-expanded')).toBeDefined()
130
- expect($toggle.attributes('aria-expanded')).toEqual('false')
131
- expect($toggle.attributes('id')).toBeDefined()
132
- expect($toggle.attributes('id')).toEqual(`${wrapperId}__BV_toggle_`)
133
- expect($toggle.attributes('type')).toBeDefined()
134
- expect($toggle.attributes('type')).toEqual('button')
135
- expect($toggle.findAll('span.gl-sr-only').length).toBe(1)
136
- expect($toggle.find('span.gl-sr-only').text()).toEqual('Toggle dropdown')
137
- expect($toggle.text()).toEqual('Toggle dropdown')
138
-
139
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
140
- const $menu = wrapper.find('.dropdown-menu')
141
- expect($menu.element.tagName).toBe('UL')
142
- expect($menu.classes().length).toBe(1)
143
- expect($menu.attributes('role')).toBeDefined()
144
- expect($menu.attributes('role')).toEqual('menu')
145
- expect($menu.attributes('tabindex')).toBeDefined()
146
- expect($menu.attributes('tabindex')).toEqual('-1')
147
- expect($menu.attributes('aria-labelledby')).toBeDefined()
148
- expect($menu.attributes('aria-labelledby')).toEqual(`${wrapperId}__BV_button_`)
149
- expect($menu.text()).toEqual('')
150
-
151
- wrapper.destroy()
152
- })
153
-
154
- it('split mode accepts split-button-type value', async () => {
155
- const wrapper = mount(BDropdown, {
156
- attachTo: document.body,
157
- propsData: {
158
- split: true,
159
- splitButtonType: 'submit'
160
- }
161
- })
162
-
163
- expect(wrapper.element.tagName).toBe('DIV')
164
- expect(wrapper.vm).toBeDefined()
165
-
166
- await waitNT(wrapper.vm)
167
-
168
- expect(wrapper.classes()).toContain('dropdown')
169
-
170
- expect(wrapper.findAll('button').length).toBe(2)
171
- const $buttons = wrapper.findAll('button')
172
- const $split = $buttons.at(0)
173
- const $toggle = $buttons.at(1)
174
-
175
- expect($split.attributes('type')).toBeDefined()
176
- expect($split.attributes('type')).toEqual('submit')
177
-
178
- expect($toggle.attributes('type')).toBeDefined()
179
- expect($toggle.attributes('type')).toEqual('button')
180
-
181
- wrapper.destroy()
182
- })
183
-
184
- it('renders default slot inside menu', async () => {
185
- const wrapper = mount(BDropdown, {
186
- attachTo: document.body,
187
- slots: {
188
- default: 'foobar'
189
- }
190
- })
191
-
192
- expect(wrapper.element.tagName).toBe('DIV')
193
- expect(wrapper.vm).toBeDefined()
194
-
195
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
196
- const $menu = wrapper.find('.dropdown-menu')
197
- expect($menu.text()).toEqual('foobar')
198
-
199
- wrapper.destroy()
200
- })
201
-
202
- it('renders button-content slot inside toggle button', async () => {
203
- const wrapper = mount(BDropdown, {
204
- attachTo: document.body,
205
- slots: {
206
- 'button-content': 'foobar'
207
- }
208
- })
209
-
210
- expect(wrapper.element.tagName).toBe('DIV')
211
- expect(wrapper.vm).toBeDefined()
212
-
213
- expect(wrapper.findAll('button').length).toBe(1)
214
- expect(wrapper.findAll('.dropdown-toggle').length).toBe(1)
215
- const $toggle = wrapper.find('.dropdown-toggle')
216
- expect($toggle.text()).toEqual('foobar')
217
-
218
- wrapper.destroy()
219
- })
220
-
221
- it('renders button-content slot inside split button', async () => {
222
- const wrapper = mount(BDropdown, {
223
- attachTo: document.body,
224
- propsData: {
225
- split: true
226
- },
227
- slots: {
228
- 'button-content': 'foobar'
229
- }
230
- })
231
-
232
- expect(wrapper.element.tagName).toBe('DIV')
233
- expect(wrapper.vm).toBeDefined()
234
-
235
- expect(wrapper.findAll('button').length).toBe(2)
236
- const $buttons = wrapper.findAll('button')
237
- const $split = $buttons.at(0)
238
- const $toggle = $buttons.at(1)
239
-
240
- expect($split.text()).toEqual('foobar')
241
- expect($toggle.classes()).toContain('dropdown-toggle')
242
- // Toggle has `gl-sr-only` hidden text
243
- expect($toggle.text()).toEqual('Toggle dropdown')
244
-
245
- wrapper.destroy()
246
- })
247
-
248
- it('does not render default slot inside menu when prop lazy set', async () => {
249
- const wrapper = mount(BDropdown, {
250
- attachTo: document.body,
251
- propsData: {
252
- lazy: true
253
- },
254
- slots: {
255
- default: 'foobar'
256
- }
257
- })
258
-
259
- expect(wrapper.element.tagName).toBe('DIV')
260
- expect(wrapper.vm).toBeDefined()
261
-
262
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
263
- const $menu = wrapper.find('.dropdown-menu')
264
- expect($menu.text()).not.toEqual('foobar')
265
-
266
- wrapper.destroy()
267
- })
268
-
269
- it('has user supplied ID', async () => {
270
- const wrapper = mount(BDropdown, {
271
- attachTo: document.body,
272
- propsData: {
273
- id: 'test'
274
- }
275
- })
276
-
277
- expect(wrapper.element.tagName).toBe('DIV')
278
- expect(wrapper.vm).toBeDefined()
279
-
280
- expect(wrapper.attributes('id')).toBeDefined()
281
- expect(wrapper.attributes('id')).toEqual('test')
282
- const wrapperId = wrapper.attributes('id')
283
-
284
- expect(wrapper.findAll('button').length).toBe(1)
285
- const $button = wrapper.find('button')
286
- expect($button.attributes('id')).toEqual(`${wrapperId}__BV_toggle_`)
287
-
288
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
289
- const $menu = wrapper.find('.dropdown-menu')
290
- expect($menu.attributes('aria-labelledby')).toBeDefined()
291
- expect($menu.attributes('aria-labelledby')).toEqual(`${wrapperId}__BV_toggle_`)
292
-
293
- wrapper.destroy()
294
- })
295
-
296
- it('should not have "btn-group" class when block is true', async () => {
297
- const wrapper = mount(BDropdown, {
298
- attachTo: document.body,
299
- propsData: {
300
- block: true
301
- }
302
- })
303
-
304
- expect(wrapper.classes()).not.toContain('btn-group')
305
-
306
- wrapper.destroy()
307
- })
308
-
309
- it('should have "btn-group" and "gl-flex" classes when block and split are true', async () => {
310
- const wrapper = mount(BDropdown, {
311
- attachTo: document.body,
312
- propsData: {
313
- block: true,
314
- split: true
315
- }
316
- })
317
-
318
- expect(wrapper.classes()).toContain('btn-group')
319
- expect(wrapper.classes()).toContain('gl-flex')
320
-
321
- wrapper.destroy()
322
- })
323
-
324
- it('should have "dropdown-toggle-no-caret" class when no-caret is true', async () => {
325
- const wrapper = mount(BDropdown, {
326
- attachTo: document.body,
327
- propsData: {
328
- noCaret: true
329
- }
330
- })
331
-
332
- expect(wrapper.find('.dropdown-toggle').classes()).toContain('dropdown-toggle-no-caret')
333
-
334
- wrapper.destroy()
335
- })
336
-
337
- it('should not have "dropdown-toggle-no-caret" class when no-caret and split are true', async () => {
338
- const wrapper = mount(BDropdown, {
339
- attachTo: document.body,
340
- propsData: {
341
- noCaret: true,
342
- split: true
343
- }
344
- })
345
-
346
- expect(wrapper.find('.dropdown-toggle').classes()).not.toContain('dropdown-toggle-no-caret')
347
-
348
- wrapper.destroy()
349
- })
350
-
351
- it('should have a toggle with the given toggle tag', async () => {
352
- const wrapper = mount(BDropdown, {
353
- attachTo: document.body,
354
- propsData: {
355
- toggleTag: 'div'
356
- }
357
- })
358
-
359
- expect(wrapper.find('.dropdown-toggle').element.tagName).toBe('DIV')
360
-
361
- wrapper.destroy()
362
- })
363
-
364
- it('should have attributes on toggle when "toggle-attrs" prop is set', async () => {
365
- const wrapper = mount(BDropdown, {
366
- attachTo: document.body,
367
- propsData: {
368
- toggleAttrs: { 'data-foo-bar': 'foo-bar' }
369
- }
370
- })
371
-
372
- expect(wrapper.find('.dropdown-toggle').attributes('data-foo-bar')).toBe('foo-bar')
373
-
374
- wrapper.destroy()
375
- })
376
-
377
- it('should have class dropup when prop dropup set', async () => {
378
- const wrapper = mount(BDropdown, {
379
- attachTo: document.body,
380
- propsData: {
381
- dropup: true
382
- }
383
- })
384
-
385
- expect(wrapper.classes()).toContain('dropdown')
386
- expect(wrapper.classes()).toContain('dropup')
387
- expect(wrapper.classes()).not.toContain('show')
388
- expect(wrapper.find('.dropdown-menu').classes()).not.toContain('show')
389
-
390
- wrapper.vm.show()
391
- await waitNT(wrapper.vm)
392
- await waitRAF()
393
-
394
- expect(wrapper.classes()).toContain('dropdown')
395
- expect(wrapper.classes()).toContain('dropup')
396
- expect(wrapper.classes()).toContain('show')
397
- expect(wrapper.find('.dropdown-menu').classes()).toContain('show')
398
-
399
- wrapper.destroy()
400
- })
401
-
402
- it('should have class dropright when prop dropright set', async () => {
403
- const wrapper = mount(BDropdown, {
404
- attachTo: document.body,
405
- propsData: {
406
- dropright: true
407
- }
408
- })
409
-
410
- expect(wrapper.classes()).toContain('dropdown')
411
- expect(wrapper.classes()).toContain('dropright')
412
- expect(wrapper.classes()).not.toContain('show')
413
- expect(wrapper.find('.dropdown-menu').classes()).not.toContain('show')
414
-
415
- wrapper.vm.show()
416
- await waitNT(wrapper.vm)
417
- await waitRAF()
418
-
419
- expect(wrapper.classes()).toContain('dropdown')
420
- expect(wrapper.classes()).toContain('dropright')
421
- expect(wrapper.classes()).toContain('show')
422
- expect(wrapper.find('.dropdown-menu').classes()).toContain('show')
423
-
424
- wrapper.destroy()
425
- })
426
-
427
- it('should have class dropleft when prop dropleft set', async () => {
428
- const wrapper = mount(BDropdown, {
429
- attachTo: document.body,
430
- propsData: {
431
- dropleft: true
432
- }
433
- })
434
-
435
- expect(wrapper.classes()).toContain('dropdown')
436
- expect(wrapper.classes()).toContain('dropleft')
437
- expect(wrapper.classes()).not.toContain('show')
438
- expect(wrapper.find('.dropdown-menu').classes()).not.toContain('show')
439
-
440
- wrapper.vm.show()
441
- await waitNT(wrapper.vm)
442
- await waitRAF()
443
-
444
- expect(wrapper.classes()).toContain('dropdown')
445
- expect(wrapper.classes()).toContain('dropleft')
446
- expect(wrapper.classes()).toContain('show')
447
- expect(wrapper.find('.dropdown-menu').classes()).toContain('show')
448
-
449
- wrapper.destroy()
450
- })
451
-
452
- it('split should have class specified in split class property', () => {
453
- const splitClass = 'custom-button-class'
454
- const wrapper = mount(BDropdown, {
455
- attachTo: document.body,
456
- propsData: {
457
- splitClass,
458
- split: true
459
- }
460
- })
461
-
462
- const $buttons = wrapper.findAll('button')
463
- const $split = $buttons.at(0)
464
- expect($split.classes()).toContain(splitClass)
465
-
466
- wrapper.destroy()
467
- })
468
-
469
- it('menu should have class dropdown-menu-right when prop right set', async () => {
470
- const wrapper = mount(BDropdown, {
471
- attachTo: document.body,
472
- propsData: {
473
- right: true
474
- }
475
- })
476
-
477
- expect(wrapper.classes()).toContain('dropdown')
478
- expect(wrapper.classes()).not.toContain('show')
479
- expect(wrapper.find('.dropdown-menu').classes()).toContain('dropdown-menu-right')
480
- expect(wrapper.find('.dropdown-menu').classes()).not.toContain('show')
481
-
482
- wrapper.vm.show()
483
- await waitNT(wrapper.vm)
484
- await waitRAF()
485
-
486
- expect(wrapper.classes()).toContain('dropdown')
487
- expect(wrapper.classes()).toContain('show')
488
- expect(wrapper.find('.dropdown-menu').classes()).toContain('dropdown-menu-right')
489
- expect(wrapper.find('.dropdown-menu').classes()).toContain('show')
490
-
491
- wrapper.destroy()
492
- })
493
-
494
- it('split mode emits click event when split button clicked', async () => {
495
- const wrapper = mount(BDropdown, {
496
- attachTo: document.body,
497
- propsData: {
498
- split: true
499
- }
500
- })
501
-
502
- expect(wrapper.element.tagName).toBe('DIV')
503
- expect(wrapper.vm).toBeDefined()
504
- expect(wrapper.emitted('click')).toBeUndefined()
505
-
506
- expect(wrapper.findAll('button').length).toBe(2)
507
- const $buttons = wrapper.findAll('button')
508
- const $split = $buttons.at(0)
509
-
510
- await $split.trigger('click')
511
-
512
- expect(wrapper.emitted('click')).toBeDefined()
513
- expect(wrapper.emitted('click').length).toBe(1)
514
-
515
- wrapper.destroy()
516
- })
517
-
518
- it('dropdown opens and closes', async () => {
519
- const App = {
520
- props: {
521
- disabled: { type: Boolean, default: false }
522
- },
523
- render(h) {
524
- const { disabled } = this
525
-
526
- return h('div', { attrs: { id: 'container' } }, [
527
- h(BDropdown, { props: { id: 'test', disabled } }, [h(BDropdownItem, 'item')]),
528
- h('input', { attrs: { id: 'input' } })
529
- ])
530
- }
531
- }
532
-
533
- const wrapper = mount(App, {
534
- attachTo: document.body
535
- })
536
-
537
- expect(wrapper.vm).toBeDefined()
538
-
539
- expect(wrapper.findAll('.dropdown').length).toBe(1)
540
- expect(wrapper.findAll('.dropdown-toggle').length).toBe(1)
541
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
542
- expect(wrapper.findAll('.dropdown-menu .dropdown-item').length).toBe(1)
543
-
544
- const $container = wrapper.find('#container')
545
- const $dropdown = wrapper.findComponent('.dropdown')
546
- const $toggle = wrapper.find('.dropdown-toggle')
547
- const $menu = wrapper.find('.dropdown-menu')
548
- const $item = wrapper.find('.dropdown-item')
549
- const $input = wrapper.find('#input')
550
-
551
- expect($dropdown.vm).toBeDefined()
552
-
553
- expect($toggle.attributes('aria-haspopup')).toBeDefined()
554
- expect($toggle.attributes('aria-haspopup')).toEqual('menu')
555
- expect($toggle.attributes('aria-expanded')).toBeDefined()
556
- expect($toggle.attributes('aria-expanded')).toEqual('false')
557
- expect($dropdown.classes()).not.toContain('show')
558
-
559
- // Open menu by clicking toggle
560
- await $toggle.trigger('click')
561
- await waitRAF()
562
- await waitNT(wrapper.vm)
563
- await waitRAF()
564
- await waitNT(wrapper.vm)
565
-
566
- expect($toggle.attributes('aria-haspopup')).toBeDefined()
567
- expect($toggle.attributes('aria-haspopup')).toEqual('menu')
568
- expect($toggle.attributes('aria-expanded')).toBeDefined()
569
- expect($toggle.attributes('aria-expanded')).toEqual('true')
570
- expect($dropdown.classes()).toContain('show')
571
- expect(document.activeElement).toBe($menu.element)
572
-
573
- // Close menu by clicking toggle again
574
- await $toggle.trigger('click')
575
- await waitRAF()
576
- await waitNT(wrapper.vm)
577
- await waitRAF()
578
- await waitNT(wrapper.vm)
579
- expect($toggle.attributes('aria-expanded')).toEqual('false')
580
- expect($dropdown.classes()).not.toContain('show')
581
-
582
- // Open menu again
583
- await $toggle.trigger('click')
584
- await waitRAF()
585
- await waitNT(wrapper.vm)
586
- await waitRAF()
587
- await waitNT(wrapper.vm)
588
- expect($toggle.attributes('aria-expanded')).toEqual('true')
589
- expect(document.activeElement).toBe($menu.element)
590
- expect($dropdown.classes()).toContain('show')
591
-
592
- // Close by clicking dropdown-item
593
- await $item.trigger('click')
594
- await waitRAF()
595
- await waitNT(wrapper.vm)
596
- await waitRAF()
597
- await waitNT(wrapper.vm)
598
- expect($toggle.attributes('aria-expanded')).toEqual('false')
599
- expect($dropdown.classes()).not.toContain('show')
600
-
601
- // Open menu via ´.show()´ method
602
- $dropdown.vm.show()
603
- await waitRAF()
604
- await waitNT(wrapper.vm)
605
- await waitRAF()
606
- await waitNT(wrapper.vm)
607
- expect($toggle.attributes('aria-expanded')).toEqual('true')
608
- expect($dropdown.classes()).toContain('show')
609
-
610
- // Close menu via ´.hide()´ method
611
- $dropdown.vm.hide()
612
- await waitNT(wrapper.vm)
613
- await waitRAF()
614
- await waitNT(wrapper.vm)
615
- await waitRAF()
616
- await waitNT(wrapper.vm)
617
- expect($toggle.attributes('aria-expanded')).toEqual('false')
618
- expect($dropdown.classes()).not.toContain('show')
619
-
620
- // Open menu via ´.show()´ method again
621
- $dropdown.vm.show()
622
- await waitNT(wrapper.vm)
623
- await waitRAF()
624
- await waitNT(wrapper.vm)
625
- await waitRAF()
626
- await waitNT(wrapper.vm)
627
- expect($toggle.attributes('aria-expanded')).toEqual('true')
628
- expect($dropdown.classes()).toContain('show')
629
- expect(document.activeElement).toBe($menu.element)
630
-
631
- // Close menu by moving focus away from menu
632
- await $input.trigger('focusin')
633
- await waitRAF()
634
- await waitNT(wrapper.vm)
635
- await waitRAF()
636
- await waitNT(wrapper.vm)
637
- expect($dropdown.classes()).not.toContain('show')
638
- expect($toggle.attributes('aria-expanded')).toEqual('false')
639
-
640
- // Open menu via keydown.down event on toggle button
641
- await $toggle.trigger('keydown.down')
642
- await waitRAF()
643
- await waitNT(wrapper.vm)
644
- await waitRAF()
645
- await waitNT(wrapper.vm)
646
- expect($dropdown.classes()).toContain('show')
647
- expect($toggle.attributes('aria-expanded')).toEqual('true')
648
- expect(document.activeElement).toBe($menu.element)
649
-
650
- // Close menu by clicking outside
651
- await $container.trigger('click')
652
- await waitRAF()
653
- await waitNT(wrapper.vm)
654
- await waitRAF()
655
- await waitNT(wrapper.vm)
656
- expect($dropdown.classes()).not.toContain('show')
657
- expect($toggle.attributes('aria-expanded')).toEqual('false')
658
-
659
- // Open menu via ´.show()´ method again
660
- $dropdown.vm.show()
661
- await waitNT(wrapper.vm)
662
- await waitRAF()
663
- await waitNT(wrapper.vm)
664
- await waitRAF()
665
- await waitNT(wrapper.vm)
666
- expect($dropdown.classes()).toContain('show')
667
- expect($toggle.attributes('aria-expanded')).toEqual('true')
668
-
669
- // Close menu by keydown.esc event on dropdown item
670
- await $item.trigger('keydown.esc')
671
- await waitRAF()
672
- await waitNT(wrapper.vm)
673
- await waitRAF()
674
- await waitNT(wrapper.vm)
675
- expect($dropdown.classes()).not.toContain('show')
676
- expect($toggle.attributes('aria-expanded')).toEqual('false')
677
-
678
- // Open menu via ´.show()´ method again
679
- $dropdown.vm.show()
680
- await waitNT(wrapper.vm)
681
- await waitRAF()
682
- await waitNT(wrapper.vm)
683
- await waitRAF()
684
- await waitNT(wrapper.vm)
685
- expect($dropdown.classes()).toContain('show')
686
- expect($toggle.attributes('aria-expanded')).toEqual('true')
687
-
688
- // When disabled changes to true, menu should close
689
- await wrapper.setProps({ disabled: true })
690
- await waitRAF()
691
- await waitNT(wrapper.vm)
692
- await waitRAF()
693
- await waitNT(wrapper.vm)
694
- expect($dropdown.classes()).not.toContain('show')
695
- expect($toggle.attributes('aria-expanded')).toEqual('false')
696
-
697
- // When disabled, show() wont open menu
698
- $dropdown.vm.show()
699
- await waitNT(wrapper.vm)
700
- await waitRAF()
701
- await waitNT(wrapper.vm)
702
- await waitRAF()
703
- await waitNT(wrapper.vm)
704
- expect($dropdown.classes()).not.toContain('show')
705
- expect($toggle.attributes('aria-expanded')).toEqual('false')
706
-
707
- // Re-enable dropdown and open it
708
- await wrapper.setProps({ disabled: false })
709
- await waitRAF()
710
- $dropdown.vm.show()
711
- await waitNT(wrapper.vm)
712
- await waitRAF()
713
- await waitNT(wrapper.vm)
714
- await waitRAF()
715
- await waitNT(wrapper.vm)
716
- expect($dropdown.classes()).toContain('show')
717
- expect($toggle.attributes('aria-expanded')).toEqual('true')
718
-
719
- // Should close on root emit when argument is not self
720
- wrapper.vm.$root.$emit('bv::dropdown::shown')
721
- await waitRAF()
722
- await waitNT(wrapper.vm)
723
- await waitRAF()
724
- await waitNT(wrapper.vm)
725
- expect($dropdown.classes()).not.toContain('show')
726
- expect($toggle.attributes('aria-expanded')).toEqual('false')
727
-
728
- wrapper.destroy()
729
- })
730
-
731
- it('preventDefault() works on show event', async () => {
732
- let prevent = true
733
- const wrapper = mount(BDropdown, {
734
- attachTo: document.body,
735
- listeners: {
736
- show: bvEvent => {
737
- if (prevent) {
738
- bvEvent.preventDefault()
739
- }
740
- }
741
- }
742
- })
743
-
744
- expect(wrapper.element.tagName).toBe('DIV')
745
- expect(wrapper.vm).toBeDefined()
746
- await waitNT(wrapper.vm)
747
- await waitRAF()
748
-
749
- expect(wrapper.emitted('show')).toBeUndefined()
750
-
751
- expect(wrapper.findAll('button').length).toBe(1)
752
- expect(wrapper.findAll('.dropdown').length).toBe(1)
753
- const $toggle = wrapper.find('button')
754
- const $dropdown = wrapper.find('.dropdown')
755
-
756
- expect($toggle.attributes('aria-haspopup')).toBeDefined()
757
- expect($toggle.attributes('aria-haspopup')).toEqual('menu')
758
- expect($toggle.attributes('aria-expanded')).toBeDefined()
759
- expect($toggle.attributes('aria-expanded')).toEqual('false')
760
- expect($dropdown.classes()).not.toContain('show')
761
-
762
- // Should prevent menu from opening
763
- await $toggle.trigger('click')
764
- await waitRAF()
765
- expect(wrapper.emitted('show')).toBeDefined()
766
- expect(wrapper.emitted('show').length).toBe(1)
767
- expect($toggle.attributes('aria-haspopup')).toBeDefined()
768
- expect($toggle.attributes('aria-haspopup')).toEqual('menu')
769
- expect($toggle.attributes('aria-expanded')).toBeDefined()
770
- expect($toggle.attributes('aria-expanded')).toEqual('false')
771
- expect($dropdown.classes()).not.toContain('show')
772
-
773
- // Allow menu to open
774
- prevent = false
775
- await $toggle.trigger('click')
776
- await waitRAF()
777
- expect(wrapper.emitted('show')).toBeDefined()
778
- expect(wrapper.emitted('show').length).toBe(2)
779
- expect($toggle.attributes('aria-haspopup')).toBeDefined()
780
- expect($toggle.attributes('aria-haspopup')).toEqual('menu')
781
- expect($toggle.attributes('aria-expanded')).toBeDefined()
782
- expect($toggle.attributes('aria-expanded')).toEqual('true')
783
- expect($dropdown.classes()).toContain('show')
784
-
785
- wrapper.destroy()
786
- })
787
-
788
- it('Keyboard navigation works when open', async () => {
789
- const App = {
790
- render(h) {
791
- return h('div', [
792
- h(BDropdown, { props: { id: 'test' } }, [
793
- h(BDropdownItem, { attrs: { id: 'item-1' } }, 'item'),
794
- h(BDropdownItem, { attrs: { id: 'item-2' } }, 'item'),
795
- h(BDropdownItem, { attrs: { id: 'item-3' }, props: { disabled: true } }, 'item'),
796
- h(BDropdownItem, { attrs: { id: 'item-4' } }, 'item')
797
- ])
798
- ])
799
- }
800
- }
801
-
802
- const wrapper = mount(App, {
803
- attachTo: document.body
804
- })
805
-
806
- expect(wrapper.vm).toBeDefined()
807
- await waitNT(wrapper.vm)
808
- await waitRAF()
809
- await waitNT(wrapper.vm)
810
- await waitRAF()
811
-
812
- expect(wrapper.findAll('.dropdown').length).toBe(1)
813
- expect(wrapper.findAll('.dropdown-toggle').length).toBe(1)
814
- expect(wrapper.findAll('.dropdown-menu').length).toBe(1)
815
- expect(wrapper.findAll('.dropdown-menu .dropdown-item').length).toBe(4)
816
-
817
- const $toggle = wrapper.find('.dropdown-toggle')
818
- const $menu = wrapper.find('.dropdown-menu')
819
- const $items = wrapper.findAll('.dropdown-item')
820
-
821
- // Expect menu to be closed
822
- expect($toggle.attributes('aria-expanded')).toBeDefined()
823
- expect($toggle.attributes('aria-expanded')).toEqual('false')
824
-
825
- // Trigger keydown.down on toggle to open menu
826
- await $toggle.trigger('keydown.down')
827
- await waitRAF()
828
- await waitNT(wrapper.vm)
829
- await waitRAF()
830
- await waitNT(wrapper.vm)
831
- await waitRAF()
832
- expect($toggle.attributes('aria-expanded')).toEqual('true')
833
- expect(document.activeElement).toBe($menu.element)
834
-
835
- // Move to first menu item
836
- await $menu.trigger('keydown.down')
837
- await waitRAF()
838
- await waitNT(wrapper.vm)
839
- await waitRAF()
840
- await waitNT(wrapper.vm)
841
- await waitRAF()
842
- expect(document.activeElement).toBe($items.at(0).element)
843
-
844
- // Move to second menu item
845
- await $items.at(0).trigger('keydown.down')
846
- await waitRAF()
847
- await waitNT(wrapper.vm)
848
- await waitRAF()
849
- await waitNT(wrapper.vm)
850
- await waitRAF()
851
- expect(document.activeElement).toBe($items.at(1).element)
852
-
853
- // Move down to next menu item (should skip disabled item)
854
- await $items.at(1).trigger('keydown.down')
855
- await waitRAF()
856
- await waitNT(wrapper.vm)
857
- await waitRAF()
858
- await waitNT(wrapper.vm)
859
- await waitRAF()
860
- expect(document.activeElement).toBe($items.at(3).element)
861
-
862
- // Move down to next menu item (should remain on same item)
863
- await $items.at(3).trigger('keydown.down')
864
- await waitRAF()
865
- await waitNT(wrapper.vm)
866
- await waitRAF()
867
- await waitNT(wrapper.vm)
868
- await waitRAF()
869
- expect(document.activeElement).toBe($items.at(3).element)
870
-
871
- // Move up to previous menu item (should skip disabled item)
872
- await $items.at(3).trigger('keydown.up')
873
- await waitRAF()
874
- await waitNT(wrapper.vm)
875
- await waitRAF()
876
- await waitNT(wrapper.vm)
877
- await waitRAF()
878
- expect(document.activeElement).toBe($items.at(1).element)
879
-
880
- // Move up to previous menu item
881
- await $items.at(1).trigger('keydown.up')
882
- await waitRAF()
883
- await waitNT(wrapper.vm)
884
- await waitRAF()
885
- await waitNT(wrapper.vm)
886
- await waitRAF()
887
- expect(document.activeElement).toBe($items.at(0).element)
888
-
889
- // Move up to previous menu item (should remain on first item)
890
- await $items.at(0).trigger('keydown.up')
891
- await waitRAF()
892
- await waitNT(wrapper.vm)
893
- await waitRAF()
894
- await waitNT(wrapper.vm)
895
- await waitRAF()
896
- expect(document.activeElement).toBe($items.at(0).element)
897
-
898
- wrapper.destroy()
899
- })
900
-
901
- it('when boundary not set should not have class position-static', async () => {
902
- const wrapper = mount(BDropdown, {
903
- attachTo: document.body
904
- })
905
- expect(wrapper.element.tagName).toBe('DIV')
906
- expect(wrapper.vm).toBeDefined()
907
- await waitNT(wrapper.vm)
908
- expect(wrapper.classes()).not.toContain('gl-static')
909
- wrapper.destroy()
910
- })
911
-
912
- it('when boundary set to viewport should have class position-static', async () => {
913
- const wrapper = mount(BDropdown, {
914
- attachTo: document.body,
915
- propsData: {
916
- boundary: 'viewport'
917
- }
918
- })
919
- expect(wrapper.element.tagName).toBe('DIV')
920
- expect(wrapper.vm).toBeDefined()
921
- await waitNT(wrapper.vm)
922
- expect(wrapper.classes()).toContain('gl-static')
923
- wrapper.destroy()
924
- })
925
-
926
- it('toggle button size works', async () => {
927
- const wrapper = mount(BDropdown, {
928
- attachTo: document.body,
929
- propsData: {
930
- size: 'lg'
931
- }
932
- })
933
-
934
- expect(wrapper.element.tagName).toBe('DIV')
935
- expect(wrapper.vm).toBeDefined()
936
-
937
- expect(wrapper.findAll('.btn').length).toBe(1)
938
- const $toggle = wrapper.find('.btn')
939
-
940
- expect($toggle.element.tagName).toBe('BUTTON')
941
- expect($toggle.classes()).toContain('btn-lg')
942
-
943
- wrapper.destroy()
944
- })
945
-
946
- it('split button size works', async () => {
947
- const wrapper = mount(BDropdown, {
948
- attachTo: document.body,
949
- propsData: {
950
- split: true,
951
- size: 'lg'
952
- }
953
- })
954
-
955
- expect(wrapper.element.tagName).toBe('DIV')
956
- expect(wrapper.vm).toBeDefined()
957
-
958
- expect(wrapper.findAll('.btn').length).toBe(2)
959
- const $split = wrapper.findAll('.btn').at(0)
960
- const $toggle = wrapper.findAll('.btn').at(1)
961
-
962
- expect($split.element.tagName).toBe('BUTTON')
963
- expect($split.classes()).toContain('btn-lg')
964
- expect($toggle.element.tagName).toBe('BUTTON')
965
- expect($toggle.classes()).toContain('btn-lg')
966
-
967
- wrapper.destroy()
968
- })
969
-
970
- it('toggle button content works', async () => {
971
- const wrapper = mount(BDropdown, {
972
- attachTo: document.body,
973
- propsData: {
974
- text: 'foobar'
975
- }
976
- })
977
-
978
- expect(wrapper.element.tagName).toBe('DIV')
979
- expect(wrapper.vm).toBeDefined()
980
-
981
- expect(wrapper.findAll('.btn').length).toBe(1)
982
- const $toggle = wrapper.find('.btn')
983
-
984
- expect($toggle.element.tagName).toBe('BUTTON')
985
- expect($toggle.text()).toEqual('foobar')
986
-
987
- wrapper.destroy()
988
- })
989
-
990
- it('split button content works', async () => {
991
- const wrapper = mount(BDropdown, {
992
- attachTo: document.body,
993
- propsData: {
994
- split: true,
995
- text: 'foobar'
996
- }
997
- })
998
-
999
- expect(wrapper.element.tagName).toBe('DIV')
1000
- expect(wrapper.vm).toBeDefined()
1001
-
1002
- expect(wrapper.findAll('.btn').length).toBe(2)
1003
- const $split = wrapper.findAll('.btn').at(0)
1004
-
1005
- expect($split.element.tagName).toBe('BUTTON')
1006
- expect($split.text()).toEqual('foobar')
1007
-
1008
- wrapper.destroy()
1009
- })
1010
-
1011
- it('variant works on non-split button', async () => {
1012
- const wrapper = mount(BDropdown, {
1013
- attachTo: document.body,
1014
- propsData: {
1015
- variant: 'primary'
1016
- }
1017
- })
1018
-
1019
- expect(wrapper.element.tagName).toBe('DIV')
1020
- expect(wrapper.vm).toBeDefined()
1021
-
1022
- expect(wrapper.findAll('.btn').length).toBe(1)
1023
- const $toggle = wrapper.find('.btn')
1024
-
1025
- expect($toggle.element.tagName).toBe('BUTTON')
1026
- expect($toggle.classes()).toContain('btn-primary')
1027
- expect($toggle.classes()).not.toContain('btn-secondary')
1028
-
1029
- wrapper.destroy()
1030
- })
1031
-
1032
- it('variant works on split button', async () => {
1033
- const wrapper = mount(BDropdown, {
1034
- attachTo: document.body,
1035
- propsData: {
1036
- split: true,
1037
- variant: 'primary'
1038
- }
1039
- })
1040
-
1041
- expect(wrapper.element.tagName).toBe('DIV')
1042
- expect(wrapper.vm).toBeDefined()
1043
-
1044
- expect(wrapper.findAll('.btn').length).toBe(2)
1045
- const $split = wrapper.findAll('.btn').at(0)
1046
- const $toggle = wrapper.findAll('.btn').at(1)
1047
-
1048
- expect($split.element.tagName).toBe('BUTTON')
1049
- expect($split.classes()).toContain('btn-primary')
1050
- expect($split.classes()).not.toContain('btn-secondary')
1051
-
1052
- expect($toggle.element.tagName).toBe('BUTTON')
1053
- expect($toggle.classes()).toContain('btn-primary')
1054
- expect($toggle.classes()).not.toContain('btn-secondary')
1055
-
1056
- // Change split button variant
1057
- await wrapper.setProps({
1058
- splitVariant: 'danger'
1059
- })
1060
- expect($split.classes()).toContain('btn-danger')
1061
- expect($toggle.classes()).toContain('btn-primary')
1062
-
1063
- wrapper.destroy()
1064
- })
1065
-
1066
- it('split mode has href when prop split-href set', async () => {
1067
- const wrapper = mount(BDropdown, {
1068
- attachTo: document.body,
1069
- propsData: {
1070
- split: true,
1071
- splitHref: '/foo'
1072
- }
1073
- })
1074
-
1075
- expect(wrapper.element.tagName).toBe('DIV')
1076
- expect(wrapper.vm).toBeDefined()
1077
-
1078
- expect(wrapper.findAll('.btn').length).toBe(2)
1079
- const $buttons = wrapper.findAll('.btn')
1080
- const $split = $buttons.at(0)
1081
- const $toggle = $buttons.at(1)
1082
-
1083
- expect($toggle.element.tagName).toBe('BUTTON')
1084
-
1085
- expect($split.element.tagName).toBe('A')
1086
- expect($split.classes()).toContain('btn')
1087
- expect($split.classes()).toContain('btn-secondary')
1088
- expect($split.attributes('href')).toBeDefined()
1089
- expect($split.attributes('href')).toEqual('/foo')
1090
-
1091
- wrapper.destroy()
1092
- })
1093
-
1094
- it('split mode has href when prop split-to set', async () => {
1095
- const wrapper = mount(BDropdown, {
1096
- attachTo: document.body,
1097
- propsData: {
1098
- split: true,
1099
- splitTo: '/foo'
1100
- }
1101
- })
1102
-
1103
- expect(wrapper.element.tagName).toBe('DIV')
1104
- expect(wrapper.vm).toBeDefined()
1105
-
1106
- expect(wrapper.findAll('.btn').length).toBe(2)
1107
- const $buttons = wrapper.findAll('.btn')
1108
- const $split = $buttons.at(0)
1109
- const $toggle = $buttons.at(1)
1110
-
1111
- expect($toggle.element.tagName).toBe('BUTTON')
1112
-
1113
- expect($split.element.tagName).toBe('A')
1114
- expect($split.classes()).toContain('btn')
1115
- expect($split.classes()).toContain('btn-secondary')
1116
- expect($split.attributes('href')).toBeDefined()
1117
- expect($split.attributes('href')).toEqual('/foo')
1118
-
1119
- wrapper.destroy()
1120
- })
1121
- })