@gitlab/ui 80.13.0 → 80.13.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 (277) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/base/filtered_search/filtered_search.js +3 -2
  3. package/dist/components/experimental/experiment_badge/experiment_badge.js +6 -6
  4. package/package.json +19 -13
  5. package/src/components/base/filtered_search/filtered_search.vue +3 -2
  6. package/src/components/experimental/experiment_badge/experiment_badge.vue +12 -11
  7. package/src/components/base/accordion/accordion.spec.js +0 -58
  8. package/src/components/base/accordion/accordion.stories.js +0 -59
  9. package/src/components/base/accordion/accordion_item.spec.js +0 -131
  10. package/src/components/base/accordion/accordion_item.stories.js +0 -57
  11. package/src/components/base/alert/alert.spec.js +0 -229
  12. package/src/components/base/alert/alert.stories.js +0 -166
  13. package/src/components/base/avatar/avatar.spec.js +0 -91
  14. package/src/components/base/avatar/avatar.stories.js +0 -160
  15. package/src/components/base/avatar_labeled/avatar_labeled.spec.js +0 -109
  16. package/src/components/base/avatar_labeled/avatar_labeled.stories.js +0 -187
  17. package/src/components/base/avatar_link/avatar_link.stories.js +0 -86
  18. package/src/components/base/avatars_inline/avatars_inline.spec.js +0 -124
  19. package/src/components/base/avatars_inline/avatars_inline.stories.js +0 -83
  20. package/src/components/base/badge/badge.spec.js +0 -83
  21. package/src/components/base/badge/badge.stories.js +0 -184
  22. package/src/components/base/banner/banner.spec.js +0 -112
  23. package/src/components/base/banner/banner.stories.js +0 -103
  24. package/src/components/base/breadcrumb/breadcrumb.spec.js +0 -240
  25. package/src/components/base/breadcrumb/breadcrumb.stories.js +0 -100
  26. package/src/components/base/breadcrumb/breadcrumb_item.spec.js +0 -45
  27. package/src/components/base/broadcast_message/broadcast_message.spec.js +0 -32
  28. package/src/components/base/broadcast_message/broadcast_message.stories.js +0 -112
  29. package/src/components/base/button/button.spec.js +0 -225
  30. package/src/components/base/button/button.stories.js +0 -529
  31. package/src/components/base/button_group/button_group.stories.js +0 -132
  32. package/src/components/base/card/card.spec.js +0 -139
  33. package/src/components/base/card/card.stories.js +0 -48
  34. package/src/components/base/carousel/carousel.spec.js +0 -24
  35. package/src/components/base/carousel/carousel.stories.js +0 -51
  36. package/src/components/base/collapse/collapse.spec.js +0 -24
  37. package/src/components/base/collapse/collapse.stories.js +0 -42
  38. package/src/components/base/datepicker/datepicker.spec.js +0 -431
  39. package/src/components/base/datepicker/datepicker.stories.js +0 -141
  40. package/src/components/base/daterange_picker/daterange_picker.spec.js +0 -307
  41. package/src/components/base/daterange_picker/daterange_picker.stories.js +0 -145
  42. package/src/components/base/drawer/drawer.spec.js +0 -136
  43. package/src/components/base/drawer/drawer.stories.js +0 -272
  44. package/src/components/base/dropdown/dropdown.spec.js +0 -457
  45. package/src/components/base/dropdown/dropdown.stories.js +0 -574
  46. package/src/components/base/dropdown/dropdown_form.spec.js +0 -9
  47. package/src/components/base/dropdown/dropdown_item.spec.js +0 -67
  48. package/src/components/base/dropdown/dropdown_item.stories.js +0 -113
  49. package/src/components/base/filtered_search/__snapshots__/filtered_search_term.spec.js.snap +0 -31
  50. package/src/components/base/filtered_search/filtered_search.spec.js +0 -891
  51. package/src/components/base/filtered_search/filtered_search.stories.js +0 -678
  52. package/src/components/base/filtered_search/filtered_search_suggestion.spec.js +0 -67
  53. package/src/components/base/filtered_search/filtered_search_suggestion.stories.js +0 -33
  54. package/src/components/base/filtered_search/filtered_search_suggestion_list.spec.js +0 -337
  55. package/src/components/base/filtered_search/filtered_search_suggestion_list.stories.js +0 -53
  56. package/src/components/base/filtered_search/filtered_search_term.spec.js +0 -212
  57. package/src/components/base/filtered_search/filtered_search_term.stories.js +0 -60
  58. package/src/components/base/filtered_search/filtered_search_token.spec.js +0 -461
  59. package/src/components/base/filtered_search/filtered_search_token.stories.js +0 -199
  60. package/src/components/base/filtered_search/filtered_search_token_segment.spec.js +0 -393
  61. package/src/components/base/filtered_search/filtered_search_token_segment.stories.js +0 -110
  62. package/src/components/base/filtered_search/filtered_search_utils.spec.js +0 -82
  63. package/src/components/base/form/form.stories.js +0 -101
  64. package/src/components/base/form/form_checkbox/form_checkbox.stories.js +0 -55
  65. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.spec.js +0 -265
  66. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.stories.js +0 -134
  67. package/src/components/base/form/form_combobox/form_combobox.spec.js +0 -301
  68. package/src/components/base/form/form_combobox/form_combobox.stories.js +0 -114
  69. package/src/components/base/form/form_date/form_date.spec.js +0 -85
  70. package/src/components/base/form/form_date/form_date.stories.js +0 -108
  71. package/src/components/base/form/form_fields/form_field_validator.spec.js +0 -51
  72. package/src/components/base/form/form_fields/form_fields.spec.js +0 -531
  73. package/src/components/base/form/form_fields/form_fields.stories.js +0 -150
  74. package/src/components/base/form/form_fields/mappers.spec.js +0 -17
  75. package/src/components/base/form/form_fields/validators.spec.js +0 -56
  76. package/src/components/base/form/form_group/form_group.spec.js +0 -110
  77. package/src/components/base/form/form_group/form_group.stories.js +0 -123
  78. package/src/components/base/form/form_input/form_input.spec.js +0 -130
  79. package/src/components/base/form/form_input/form_input.stories.js +0 -128
  80. package/src/components/base/form/form_input_group/form_input_group.spec.js +0 -121
  81. package/src/components/base/form/form_input_group/form_input_group.stories.js +0 -86
  82. package/src/components/base/form/form_radio/form_radio.spec.js +0 -116
  83. package/src/components/base/form/form_radio/form_radio.stories.js +0 -70
  84. package/src/components/base/form/form_radio_group/form_radio_group.spec.js +0 -86
  85. package/src/components/base/form/form_radio_group/form_radio_group.stories.js +0 -79
  86. package/src/components/base/form/form_select/form_select.spec.js +0 -69
  87. package/src/components/base/form/form_select/form_select.stories.js +0 -156
  88. package/src/components/base/form/form_text/form_text.stories.js +0 -27
  89. package/src/components/base/form/form_textarea/form_textarea.spec.js +0 -242
  90. package/src/components/base/form/form_textarea/form_textarea.stories.js +0 -68
  91. package/src/components/base/form/input_group_text/input_group_text.spec.js +0 -9
  92. package/src/components/base/form/input_group_text/input_group_text.stories.js +0 -30
  93. package/src/components/base/icon/__snapshots__/icon.spec.js.snap +0 -14
  94. package/src/components/base/icon/icon.spec.js +0 -92
  95. package/src/components/base/icon/icon.stories.js +0 -56
  96. package/src/components/base/infinite_scroll/infinite_scroll.spec.js +0 -182
  97. package/src/components/base/infinite_scroll/infinite_scroll.stories.js +0 -94
  98. package/src/components/base/keyset_pagination/keyset_pagination.spec.js +0 -313
  99. package/src/components/base/keyset_pagination/keyset_pagination.stories.js +0 -66
  100. package/src/components/base/label/label.spec.js +0 -257
  101. package/src/components/base/label/label.stories.js +0 -76
  102. package/src/components/base/link/link.spec.js +0 -88
  103. package/src/components/base/link/link.stories.js +0 -64
  104. package/src/components/base/loading_icon/loading_icon.spec.js +0 -109
  105. package/src/components/base/loading_icon/loading_icon.stories.js +0 -60
  106. package/src/components/base/markdown/markdown.spec.js +0 -24
  107. package/src/components/base/markdown/markdown.stories.js +0 -33
  108. package/src/components/base/modal/modal.spec.js +0 -265
  109. package/src/components/base/modal/modal.stories.js +0 -159
  110. package/src/components/base/nav/nav.spec.js +0 -19
  111. package/src/components/base/nav/nav.stories.js +0 -57
  112. package/src/components/base/nav/nav_item.spec.js +0 -16
  113. package/src/components/base/nav/nav_item_dropdown.spec.js +0 -58
  114. package/src/components/base/navbar/navbar.spec.js +0 -21
  115. package/src/components/base/navbar/navbar.stories.js +0 -28
  116. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +0 -566
  117. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.spec.js +0 -452
  118. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.stories.js +0 -345
  119. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.spec.js +0 -84
  120. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.spec.js +0 -200
  121. package/src/components/base/new_dropdowns/disclosure/utils.spec.js +0 -74
  122. package/src/components/base/new_dropdowns/listbox/listbox.spec.js +0 -950
  123. package/src/components/base/new_dropdowns/listbox/listbox.stories.js +0 -840
  124. package/src/components/base/new_dropdowns/listbox/listbox_group.spec.js +0 -61
  125. package/src/components/base/new_dropdowns/listbox/listbox_item.spec.js +0 -129
  126. package/src/components/base/new_dropdowns/listbox/listbox_search_input.spec.js +0 -62
  127. package/src/components/base/new_dropdowns/listbox/utils.spec.js +0 -58
  128. package/src/components/base/paginated_list/__snapshots__/paginated_list.spec.js.snap +0 -922
  129. package/src/components/base/paginated_list/paginated_list.spec.js +0 -212
  130. package/src/components/base/paginated_list/paginated_list.stories.js +0 -207
  131. package/src/components/base/pagination/pagination.spec.js +0 -401
  132. package/src/components/base/pagination/pagination.stories.js +0 -129
  133. package/src/components/base/path/__snapshots__/path.spec.js.snap +0 -586
  134. package/src/components/base/path/path.spec.js +0 -237
  135. package/src/components/base/path/path.stories.js +0 -84
  136. package/src/components/base/popover/popover.spec.js +0 -104
  137. package/src/components/base/popover/popover.stories.js +0 -109
  138. package/src/components/base/progress_bar/progress_bar.stories.js +0 -34
  139. package/src/components/base/search_box_by_click/search_box_by_click.spec.js +0 -209
  140. package/src/components/base/search_box_by_click/search_box_by_click.stories.js +0 -100
  141. package/src/components/base/search_box_by_type/search_box_by_type.spec.js +0 -164
  142. package/src/components/base/search_box_by_type/search_box_by_type.stories.js +0 -63
  143. package/src/components/base/segmented_control/segmented_control.spec.js +0 -135
  144. package/src/components/base/segmented_control/segmented_control.stories.js +0 -59
  145. package/src/components/base/skeleton_loader/skeleton_loader.spec.js +0 -151
  146. package/src/components/base/skeleton_loader/skeleton_loader.stories.js +0 -86
  147. package/src/components/base/sorting/sorting.spec.js +0 -170
  148. package/src/components/base/sorting/sorting.stories.js +0 -98
  149. package/src/components/base/table/table.spec.js +0 -192
  150. package/src/components/base/table/table.stories.js +0 -186
  151. package/src/components/base/table_lite/table_lite.spec.js +0 -40
  152. package/src/components/base/table_lite/table_lite.stories.js +0 -74
  153. package/src/components/base/tabs/tab/tab.spec.js +0 -34
  154. package/src/components/base/tabs/tabs/scrollable_tabs.spec.js +0 -260
  155. package/src/components/base/tabs/tabs/tabs.spec.js +0 -366
  156. package/src/components/base/tabs/tabs/tabs.stories.js +0 -209
  157. package/src/components/base/toast/toast.spec.js +0 -72
  158. package/src/components/base/toast/toast.stories.js +0 -87
  159. package/src/components/base/toggle/toggle.spec.js +0 -168
  160. package/src/components/base/toggle/toggle.stories.js +0 -106
  161. package/src/components/base/token/token.spec.js +0 -48
  162. package/src/components/base/token/token.stories.js +0 -58
  163. package/src/components/base/token_selector/helpers.spec.js +0 -40
  164. package/src/components/base/token_selector/token_container.spec.js +0 -306
  165. package/src/components/base/token_selector/token_selector.spec.js +0 -653
  166. package/src/components/base/token_selector/token_selector.stories.js +0 -114
  167. package/src/components/base/token_selector/token_selector_dropdown.spec.js +0 -347
  168. package/src/components/base/tooltip/tooltip.spec.js +0 -27
  169. package/src/components/base/tooltip/tooltip.stories.js +0 -69
  170. package/src/components/charts/area/area.spec.js +0 -286
  171. package/src/components/charts/area/area.stories.js +0 -208
  172. package/src/components/charts/bar/__snapshots__/bar.spec.js.snap +0 -82
  173. package/src/components/charts/bar/bar.spec.js +0 -92
  174. package/src/components/charts/bar/bar.stories.js +0 -72
  175. package/src/components/charts/chart/chart.spec.js +0 -167
  176. package/src/components/charts/chart/chart.stories.js +0 -111
  177. package/src/components/charts/column/__snapshots__/column_chart.spec.js.snap +0 -323
  178. package/src/components/charts/column/column.stories.js +0 -111
  179. package/src/components/charts/column/column_chart.spec.js +0 -223
  180. package/src/components/charts/discrete_scatter/discrete_scatter.spec.js +0 -173
  181. package/src/components/charts/discrete_scatter/discrete_scatter.stories.js +0 -64
  182. package/src/components/charts/gauge/gauge.spec.js +0 -280
  183. package/src/components/charts/gauge/gauge.stories.js +0 -97
  184. package/src/components/charts/heatmap/heatmap.spec.js +0 -103
  185. package/src/components/charts/heatmap/heatmap.stories.js +0 -78
  186. package/src/components/charts/legend/legend.spec.js +0 -274
  187. package/src/components/charts/legend/legend.stories.js +0 -174
  188. package/src/components/charts/line/line.spec.js +0 -278
  189. package/src/components/charts/line/line.stories.js +0 -238
  190. package/src/components/charts/series_label/series_label.stories.js +0 -78
  191. package/src/components/charts/single_stat/single_stat.spec.js +0 -217
  192. package/src/components/charts/single_stat/single_stat.stories.js +0 -103
  193. package/src/components/charts/sparkline/sparkline.spec.js +0 -220
  194. package/src/components/charts/sparkline/sparkline.stories.js +0 -85
  195. package/src/components/charts/stacked_column/__snapshots__/stacked_column.spec.js.snap +0 -905
  196. package/src/components/charts/stacked_column/stacked_column.spec.js +0 -194
  197. package/src/components/charts/stacked_column/stacked_column.stories.js +0 -130
  198. package/src/components/charts/tooltip/tooltip.spec.js +0 -282
  199. package/src/components/charts/tooltip/tooltip.stories.js +0 -90
  200. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.spec.js +0 -46
  201. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.stories.js +0 -62
  202. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.spec.js +0 -70
  203. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.stories.js +0 -31
  204. package/src/components/experimental/duo/chat/components/duo_chat_message/copy_code_element.spec.js +0 -64
  205. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.spec.js +0 -534
  206. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.stories.js +0 -55
  207. package/src/components/experimental/duo/chat/components/duo_chat_message/utils.spec.js +0 -24
  208. package/src/components/experimental/duo/chat/components/duo_chat_message_sources/duo_chat_message_sources.spec.js +0 -93
  209. package/src/components/experimental/duo/chat/components/duo_chat_message_sources/duo_chat_message_sources.stories.js +0 -32
  210. package/src/components/experimental/duo/chat/components/duo_chat_predefined_prompts/duo_chat_predefined_prompts.spec.js +0 -35
  211. package/src/components/experimental/duo/chat/components/duo_chat_predefined_prompts/duo_chat_predefined_prompts.stories.js +0 -36
  212. package/src/components/experimental/duo/chat/duo_chat.spec.js +0 -828
  213. package/src/components/experimental/duo/chat/duo_chat.stories.js +0 -240
  214. package/src/components/experimental/duo/chat/markdown_renderer.spec.js +0 -55
  215. package/src/components/experimental/duo/user_feedback/user_feedback.spec.js +0 -100
  216. package/src/components/experimental/duo/user_feedback/user_feedback.stories.js +0 -107
  217. package/src/components/experimental/duo/user_feedback/user_feedback_modal.spec.js +0 -134
  218. package/src/components/experimental/experiment_badge/experiment_badge.spec.js +0 -77
  219. package/src/components/experimental/experiment_badge/experiment_badge.stories.js +0 -58
  220. package/src/components/regions/dashboard_skeleton/dashboard_skeleton.stories.js +0 -29
  221. package/src/components/regions/empty_state/empty_state.spec.js +0 -293
  222. package/src/components/regions/empty_state/empty_state.stories.js +0 -160
  223. package/src/components/shared_components/charts/tooltip_default_format.spec.js +0 -69
  224. package/src/components/shared_components/clear_icon_button/__snapshots__/clear_icon_button.spec.js.snap +0 -15
  225. package/src/components/shared_components/clear_icon_button/clear_icon_button.spec.js +0 -23
  226. package/src/components/shared_components/close_button/__snapshots__/close_button.spec.js.snap +0 -12
  227. package/src/components/shared_components/close_button/close_button.spec.js +0 -22
  228. package/src/components/utilities/animated_number/animated_number.spec.js +0 -133
  229. package/src/components/utilities/animated_number/animated_number.stories.js +0 -63
  230. package/src/components/utilities/friendly_wrap/friendly_wrap.spec.js +0 -123
  231. package/src/components/utilities/friendly_wrap/friendly_wrap.stories.js +0 -56
  232. package/src/components/utilities/intersection_observer/intersection_observer.spec.js +0 -116
  233. package/src/components/utilities/intersection_observer/intersection_observer.stories.js +0 -162
  234. package/src/components/utilities/intersperse/intersperse.spec.js +0 -115
  235. package/src/components/utilities/intersperse/intersperse.stories.js +0 -53
  236. package/src/components/utilities/sprintf/sprintf.spec.js +0 -337
  237. package/src/components/utilities/sprintf/sprintf.stories.js +0 -104
  238. package/src/components/utilities/truncate/truncate.spec.js +0 -125
  239. package/src/components/utilities/truncate/truncate.stories.js +0 -50
  240. package/src/components/utilities/truncate_text/truncate_text.spec.js +0 -150
  241. package/src/components/utilities/truncate_text/truncate_text.stories.js +0 -45
  242. package/src/directives/hover_load/hover_load.spec.js +0 -64
  243. package/src/directives/hover_load/hover_load.stories.js +0 -51
  244. package/src/directives/outside/outside.spec.js +0 -338
  245. package/src/directives/outside/outside.stories.js +0 -35
  246. package/src/directives/resize_observer/resize_observer.spec.js +0 -125
  247. package/src/directives/resize_observer/resize_observer.stories.js +0 -76
  248. package/src/directives/safe_html/safe_html.spec.js +0 -149
  249. package/src/directives/safe_html/safe_html.stories.js +0 -60
  250. package/src/directives/safe_link/safe_link.spec.js +0 -135
  251. package/src/directives/safe_link/safe_link.stories.js +0 -39
  252. package/src/internal/color_contrast/color_contrast.spec.js +0 -34
  253. package/src/internal/color_contrast/color_contrast.stories.js +0 -41
  254. package/src/scss/functions.spec.scss +0 -54
  255. package/src/scss/mixins.spec.scss +0 -93
  256. package/src/scss/run_scss_tests.spec.js +0 -26
  257. package/src/scss/typescale/typescale.stories.js +0 -61
  258. package/src/tokens/color.constant.tokens.stories.js +0 -19
  259. package/src/tokens/color.dark.tokens.stories.js +0 -26
  260. package/src/tokens/color.data_viz.dark.tokens.stories.js +0 -19
  261. package/src/tokens/color.data_viz.tokens.stories.js +0 -19
  262. package/src/tokens/color.theme.dark.tokens.stories.js +0 -21
  263. package/src/tokens/color.theme.tokens.stories.js +0 -21
  264. package/src/tokens/color.tokens.stories.js +0 -26
  265. package/src/tokens/color.transparency.tokens.stories.js +0 -14
  266. package/src/tokens/text.dark.tokens.stories.js +0 -18
  267. package/src/tokens/text.tokens.stories.js +0 -17
  268. package/src/tokens/tokens.stories.js +0 -16
  269. package/src/utils/breakpoints.spec.js +0 -26
  270. package/src/utils/charts/config.spec.js +0 -478
  271. package/src/utils/charts/utils.spec.js +0 -106
  272. package/src/utils/datetime_utility.spec.js +0 -98
  273. package/src/utils/is_slot_empty.spec.js +0 -73
  274. package/src/utils/number_utils.spec.js +0 -110
  275. package/src/utils/stories_utils.spec.js +0 -18
  276. package/src/utils/string_utils.spec.js +0 -56
  277. package/src/utils/utils.spec.js +0 -156
@@ -1,242 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import lodashDebounce from 'lodash/debounce';
3
- import GlFormTextarea from './form_textarea.vue';
4
-
5
- jest.mock('lodash/debounce', () => jest.fn((fn) => fn));
6
-
7
- const modelEvent = GlFormTextarea.model.event;
8
- const newValue = 'foo';
9
-
10
- describe('GlFormTextArea', () => {
11
- let wrapper;
12
-
13
- const createComponent = (propsData = {}) => {
14
- wrapper = mount(GlFormTextarea, {
15
- propsData,
16
- scopedSlots: {
17
- 'character-count-text': function characterCountText({ count }) {
18
- return count === 1 ? `${count} character remaining` : `${count} characters remaining`;
19
- },
20
- 'character-count-over-limit-text': function characterCountOverLimitText({ count }) {
21
- return count === 1 ? `${count} character over limit` : `${count} characters over limit`;
22
- },
23
- },
24
- });
25
- };
26
-
27
- const findTextarea = () => wrapper.find('textarea');
28
-
29
- const itUpdatesDebouncedScreenReaderText = (expectedText) => {
30
- it('updates debounced screen reader text', () => {
31
- expect(lodashDebounce).toHaveBeenCalledWith(expect.any(Function), 1000);
32
- expect(wrapper.find('[data-testid="character-count-text-sr-only"]').text()).toBe(
33
- expectedText
34
- );
35
- });
36
- };
37
-
38
- describe('v-model', () => {
39
- describe('value binding', () => {
40
- beforeEach(() => {
41
- createComponent({ value: 'initial' });
42
- });
43
-
44
- it(`sets the textarea's value`, () => {
45
- expect(findTextarea().element.value).toBe('initial');
46
- });
47
-
48
- describe('when the value prop changes', () => {
49
- beforeEach(() => {
50
- wrapper.setProps({ value: newValue });
51
- return wrapper.vm.$nextTick();
52
- });
53
-
54
- it(`updates the textarea's value`, () => {
55
- expect(findTextarea().element.value).toBe(newValue);
56
- });
57
- });
58
- });
59
-
60
- describe('event emission', () => {
61
- beforeEach(() => {
62
- createComponent();
63
-
64
- findTextarea().setValue(newValue);
65
- });
66
-
67
- it('synchronously emits update event', () => {
68
- expect(wrapper.emitted('update')).toEqual([[newValue]]);
69
- });
70
-
71
- it(`synchronously emits ${modelEvent} event`, () => {
72
- expect(wrapper.emitted(modelEvent)).toEqual([[newValue]]);
73
- });
74
- });
75
- });
76
-
77
- describe('debounce', () => {
78
- describe.each([10, 100, 1000])('given a debounce of %dms', (debounce) => {
79
- beforeEach(() => {
80
- jest.useFakeTimers();
81
-
82
- createComponent({ debounce });
83
-
84
- findTextarea().setValue(newValue);
85
- });
86
-
87
- it('synchronously emits an update event', () => {
88
- expect(wrapper.emitted('update')).toEqual([[newValue]]);
89
- });
90
-
91
- it(`emits a ${modelEvent} event after the debounce delay`, () => {
92
- // Just before debounce completes
93
- jest.advanceTimersByTime(debounce - 1);
94
- expect(wrapper.emitted(modelEvent)).toBe(undefined);
95
-
96
- // Exactly when debounce completes
97
- jest.advanceTimersByTime(1);
98
- expect(wrapper.emitted(modelEvent)).toEqual([[newValue]]);
99
- });
100
- });
101
- });
102
-
103
- describe('lazy', () => {
104
- beforeEach(() => {
105
- createComponent({ lazy: true });
106
-
107
- findTextarea().setValue(newValue);
108
- });
109
-
110
- it('synchronously emits an update event', () => {
111
- expect(wrapper.emitted('update')).toEqual([[newValue]]);
112
- });
113
-
114
- it.each(['change', 'blur'])('updates model after %s event', (event) => {
115
- expect(wrapper.emitted(modelEvent)).toBe(undefined);
116
-
117
- wrapper.trigger(event);
118
-
119
- expect(wrapper.emitted(modelEvent)).toEqual([[newValue]]);
120
- });
121
- });
122
-
123
- describe('submit on enter prop', () => {
124
- it('should be false by default', () => {
125
- createComponent({});
126
-
127
- wrapper.trigger('keyup.enter', {
128
- metaKey: true,
129
- });
130
-
131
- expect(wrapper.emitted('submit')).toBe(undefined);
132
- });
133
-
134
- it('should emit submit when cmd+enter is pressed', async () => {
135
- createComponent({ submitOnEnter: true });
136
-
137
- wrapper.trigger('keyup.enter', {
138
- metaKey: true,
139
- });
140
-
141
- expect(wrapper.emitted('submit')).toEqual([[]]);
142
- });
143
- });
144
-
145
- describe('when `characterCount` prop is set', () => {
146
- const characterCount = 10;
147
-
148
- describe('when textarea character count is under the max character count', () => {
149
- const textareaCharacterCount = 5;
150
- const expectedText = `${characterCount - textareaCharacterCount} characters remaining`;
151
-
152
- beforeEach(() => {
153
- createComponent({
154
- value: 'a'.repeat(textareaCharacterCount),
155
- characterCount,
156
- });
157
- });
158
-
159
- it('displays remaining characters', () => {
160
- expect(wrapper.text()).toContain(expectedText);
161
- });
162
-
163
- itUpdatesDebouncedScreenReaderText(expectedText);
164
- });
165
-
166
- describe('when textarea character count is over the max character count', () => {
167
- const textareaCharacterCount = 15;
168
- const expectedText = `${textareaCharacterCount - characterCount} characters over limit`;
169
-
170
- beforeEach(() => {
171
- createComponent({
172
- value: 'a'.repeat(textareaCharacterCount),
173
- characterCount,
174
- });
175
- });
176
-
177
- it('displays number of characters over', () => {
178
- expect(wrapper.text()).toContain(expectedText);
179
- });
180
-
181
- itUpdatesDebouncedScreenReaderText(expectedText);
182
- });
183
-
184
- describe('when textarea value is updated', () => {
185
- const textareaCharacterCount = 5;
186
- const newTextareaCharacterCount = textareaCharacterCount + 3;
187
- const expectedText = `${characterCount - newTextareaCharacterCount} characters remaining`;
188
-
189
- beforeEach(() => {
190
- createComponent({
191
- value: 'a'.repeat(textareaCharacterCount),
192
- characterCount,
193
- });
194
-
195
- wrapper.setProps({ value: 'a'.repeat(newTextareaCharacterCount) });
196
- });
197
-
198
- it('updates character count text', () => {
199
- expect(wrapper.text()).toContain(expectedText);
200
- });
201
-
202
- itUpdatesDebouncedScreenReaderText(expectedText);
203
- });
204
-
205
- describe('when `value` prop is `null`', () => {
206
- const expectedText = `${characterCount} characters remaining`;
207
-
208
- beforeEach(() => {
209
- createComponent({
210
- value: null,
211
- characterCount,
212
- });
213
- });
214
-
215
- it('displays remaining characters', () => {
216
- expect(wrapper.text()).toContain(expectedText);
217
- });
218
-
219
- itUpdatesDebouncedScreenReaderText(expectedText);
220
- });
221
-
222
- describe('when `value` prop is updated to `null`', () => {
223
- const textareaCharacterCount = 5;
224
- const expectedText = `${characterCount} characters remaining`;
225
-
226
- beforeEach(() => {
227
- createComponent({
228
- value: 'a'.repeat(textareaCharacterCount),
229
- characterCount,
230
- });
231
-
232
- wrapper.setProps({ value: null });
233
- });
234
-
235
- it('updates character count text', () => {
236
- expect(wrapper.text()).toContain(expectedText);
237
- });
238
-
239
- itUpdatesDebouncedScreenReaderText(expectedText);
240
- });
241
- });
242
- });
@@ -1,68 +0,0 @@
1
- import GlFormTextarea from './form_textarea.vue';
2
- import readme from './form_textarea.md';
3
-
4
- const template = `
5
- <gl-form-textarea
6
- :value="value"
7
- :placeholder="placeholder"
8
- :rows="5"
9
- :no-resize="noResize"
10
- :character-count="characterCount"
11
- @input="onInput"
12
- >
13
- <template #character-count-text="{ count }">{{ characterCountText(count) }}</template>
14
- <template #character-count-over-limit-text="{ count }">{{ characterCountOverLimitText(count) }}</template>
15
- </gl-form-textarea>
16
- `;
17
-
18
- const generateProps = ({
19
- value = 'We take inspiration from other companies, and we always go for the boring solutions. Just like the rest of our work, we continually adjust our values and strive always to make them better. We used to have more values, but it was difficult to remember them all, so we condensed them and gave sub-values and created an acronym. Everyone is welcome to suggest improvements.',
20
- placeholder = 'hello',
21
- noResize = GlFormTextarea.props.noResize.default,
22
- characterCount = null,
23
- } = {}) => ({
24
- value,
25
- placeholder,
26
- noResize,
27
- characterCount,
28
- });
29
-
30
- const Template = (args, { updateArgs }) => ({
31
- components: { GlFormTextarea },
32
- props: Object.keys(args),
33
- methods: {
34
- onInput(value) {
35
- updateArgs({ ...args, value });
36
- },
37
- characterCountText(count) {
38
- return count === 1 ? `${count} character remaining` : `${count} characters remaining`;
39
- },
40
- characterCountOverLimitText(count) {
41
- return count === 1 ? `${count} character over limit` : `${count} characters over limit`;
42
- },
43
- },
44
- template,
45
- });
46
-
47
- export const Default = Template.bind({});
48
- Default.args = generateProps();
49
-
50
- export const WithCharacterCount = Template.bind({});
51
- WithCharacterCount.args = generateProps({
52
- value: '',
53
- placeholder: 'hello',
54
- characterCount: 100,
55
- });
56
-
57
- export default {
58
- title: 'base/form/form-textarea',
59
- component: GlFormTextarea,
60
- parameters: {
61
- bootstrapComponent: 'b-form-textarea',
62
- docs: {
63
- description: {
64
- component: readme,
65
- },
66
- },
67
- },
68
- };
@@ -1,9 +0,0 @@
1
- import { shallowMount } from '@vue/test-utils';
2
- import GlInputGroupText from './input_group_text.vue';
3
-
4
- describe('GlInputGroupText', () => {
5
- it('renders main components', () => {
6
- const wrapper = shallowMount(GlInputGroupText);
7
- expect(wrapper).toBeInstanceOf(Object);
8
- });
9
- });
@@ -1,30 +0,0 @@
1
- import readme from './input_group_text.md';
2
- import GlInputGroupText from './input_group_text.vue';
3
-
4
- const generateProps = (props = {}) => ({
5
- ...props,
6
- });
7
-
8
- const Template = (args) => ({
9
- components: { GlInputGroupText },
10
- props: Object.keys(args),
11
- template: `
12
- <gl-input-group-text>Some text</gl-input-group-text>
13
- `,
14
- });
15
-
16
- export const Default = Template.bind({});
17
- Default.args = generateProps();
18
-
19
- export default {
20
- title: 'base/form/input-group-text',
21
- component: GlInputGroupText,
22
- parameters: {
23
- controls: { disable: true },
24
- docs: {
25
- description: {
26
- component: readme,
27
- },
28
- },
29
- },
30
- };
@@ -1,14 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`Icon component when created shows svg class "s8" and path "/path/to/icons.svg#check-circle" 1`] = `
4
- <svg
5
- aria-hidden="true"
6
- class="gl-icon s8"
7
- data-testid="check-circle-icon"
8
- role="img"
9
- >
10
- <use
11
- href="/path/to/icons.svg#check-circle"
12
- />
13
- </svg>
14
- `;
@@ -1,92 +0,0 @@
1
- import { shallowMount } from '@vue/test-utils';
2
- import { iconSizeOptions } from '~/utils/constants';
3
- import Icon from './icon.vue';
4
-
5
- const ICONS_PATH = '/path/to/icons.svg';
6
- const TEST_SIZE = 8;
7
- const TEST_NAME = 'check-circle';
8
-
9
- jest.mock('@gitlab/svgs/dist/icons.svg', () => '/path/to/icons.svg');
10
-
11
- describe('Icon component', () => {
12
- let wrapper;
13
- let consoleSpy;
14
-
15
- const createComponent = (props) => {
16
- wrapper = shallowMount(Icon, {
17
- propsData: {
18
- size: TEST_SIZE,
19
- name: TEST_NAME,
20
- ...props,
21
- },
22
- });
23
- };
24
-
25
- const validateSize = (size) => Icon.props.size.validator(size);
26
- const validateName = (name) => Icon.props.name.validator(name);
27
-
28
- afterEach(() => {
29
- if (consoleSpy) {
30
- consoleSpy.mockRestore();
31
- }
32
- });
33
-
34
- it('has role=img', () => {
35
- createComponent();
36
-
37
- expect(wrapper.attributes('role')).toBe('img');
38
- });
39
-
40
- describe('when created', () => {
41
- beforeEach(() => {
42
- createComponent();
43
- });
44
-
45
- it(`shows svg class "s${TEST_SIZE}" and path "${ICONS_PATH}#${TEST_NAME}"`, () => {
46
- expect(wrapper.html()).toMatchSnapshot();
47
- });
48
- });
49
-
50
- describe('size validator', () => {
51
- const maxSize = Math.max(...iconSizeOptions);
52
-
53
- it('fails with size outside options', () => {
54
- expect(validateSize(maxSize + 10)).toBe(false);
55
- });
56
-
57
- it('passes with size in options', () => {
58
- expect(validateSize(maxSize)).toBe(true);
59
- });
60
- });
61
-
62
- describe('name validator', () => {
63
- it('fails with name that does not exist', () => {
64
- const badName = `${TEST_NAME}-bogus-zebra`;
65
- consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
66
-
67
- expect(validateName(badName)).toBe(false);
68
-
69
- expect(consoleSpy).toHaveBeenCalledWith(
70
- `Icon '${badName}' is not a known icon of @gitlab/svgs`
71
- );
72
- });
73
-
74
- it('passes with name that exists', () => {
75
- expect(validateName(TEST_NAME)).toBe(true);
76
- });
77
- });
78
-
79
- describe('aria-hidden', () => {
80
- it('is true when there is no aria-label', () => {
81
- createComponent();
82
-
83
- expect(wrapper.attributes('aria-hidden')).toBe('true');
84
- });
85
-
86
- it('does not exist there is an aria-label', () => {
87
- createComponent({ 'aria-label': 'Icon label' });
88
-
89
- expect(wrapper.attributes('aria-hidden')).toBeUndefined();
90
- });
91
- });
92
- });
@@ -1,56 +0,0 @@
1
- import iconSpriteInfo from '@gitlab/svgs/dist/icons.json';
2
- import { iconSizeOptions } from '../../../utils/constants';
3
- import { disableControls } from '../../../utils/stories_utils';
4
- import GlIcon from './icon.vue';
5
- import readme from './icon.md';
6
-
7
- const components = {
8
- GlIcon,
9
- };
10
-
11
- const defaultValue = (prop) => GlIcon.props[prop].default;
12
-
13
- const generateProps = ({
14
- name = 'check-circle',
15
- size = defaultValue('size'),
16
- ariaLabel = 'This is an icon',
17
- } = {}) => ({
18
- name,
19
- size,
20
- ariaLabel,
21
- });
22
-
23
- const template = `<gl-icon :name="name" :size="size" :aria-label="ariaLabel"/>`;
24
-
25
- const Template = (args) => ({
26
- components,
27
- props: Object.keys(args),
28
- template,
29
- });
30
-
31
- export const Default = Template.bind({});
32
- Default.args = generateProps();
33
-
34
- export default {
35
- title: 'base/icon',
36
- component: GlIcon,
37
- tags: ['skip-visual-test'],
38
- parameters: {
39
- docs: {
40
- description: {
41
- component: readme,
42
- },
43
- },
44
- },
45
- argTypes: {
46
- ...disableControls(['useDeprecatedSizes']),
47
- name: {
48
- options: iconSpriteInfo.icons,
49
- control: 'select',
50
- },
51
- size: {
52
- options: iconSizeOptions,
53
- control: 'select',
54
- },
55
- },
56
- };
@@ -1,182 +0,0 @@
1
- import { shallowMount } from '@vue/test-utils';
2
- import throttle from 'lodash/throttle';
3
- import InfiniteScroll, { adjustScrollGap } from './infinite_scroll.vue';
4
-
5
- jest.mock('lodash/throttle', () => jest.fn((fn) => fn));
6
-
7
- const INITIAL_HEIGHT = 500;
8
- const INITIAL_SCROLL_TOP = 0;
9
- const ADJUST_SCROLL_GAP = adjustScrollGap;
10
-
11
- describe('Infinite Scroll component', () => {
12
- let wrapper;
13
- let mockScrollHeight;
14
- let mockScrollTop;
15
- let mockScrollTo;
16
-
17
- const findInfiniteContainer = () => wrapper.findComponent({ ref: 'infiniteContainer' });
18
-
19
- const props = {
20
- fetchedItems: 2,
21
- totalItems: 10,
22
- };
23
-
24
- const createComponent = ({ propsData = props, listeners = {} } = {}) => {
25
- wrapper = shallowMount(InfiniteScroll, {
26
- propsData,
27
- listeners,
28
- attachTo: document.body,
29
- });
30
-
31
- // Mock properties on the container that are not in JSDOM
32
- mockScrollTo = jest.fn(({ top }) => {
33
- mockScrollTop = top;
34
- findInfiniteContainer().trigger('scroll');
35
- });
36
-
37
- Object.defineProperties(findInfiniteContainer().element, {
38
- scrollTo: {
39
- get: () => mockScrollTo,
40
- },
41
- scrollTop: {
42
- get: () => mockScrollTop,
43
- },
44
- scrollHeight: {
45
- get: () => mockScrollHeight,
46
- set: (val) => {
47
- mockScrollHeight = val;
48
- },
49
- },
50
- });
51
- };
52
-
53
- beforeEach(() => {
54
- mockScrollHeight = INITIAL_HEIGHT;
55
- mockScrollTop = INITIAL_SCROLL_TOP;
56
- });
57
-
58
- afterEach(() => {
59
- throttle.mockClear();
60
- });
61
-
62
- it('emits nothing on creation', () => {
63
- createComponent();
64
-
65
- return wrapper.vm.$nextTick(() => {
66
- expect(wrapper.emitted('bottomReached')).toBe(undefined);
67
- expect(wrapper.emitted('topReached')).toBe(undefined);
68
- });
69
- });
70
-
71
- it('emits bottomReached when scrolled to the bottom', () => {
72
- createComponent();
73
-
74
- expect(wrapper.emitted('bottomReached')).toBe(undefined);
75
-
76
- mockScrollTo({ top: INITIAL_HEIGHT - 0.5 });
77
- expect(wrapper.emitted('bottomReached')).toHaveLength(1);
78
- });
79
-
80
- it('emits topReached when scrolled to the top', () => {
81
- mockScrollTop = mockScrollHeight;
82
-
83
- createComponent();
84
-
85
- expect(wrapper.emitted('topReached')).toBe(undefined);
86
-
87
- mockScrollTo({ top: 0 });
88
- expect(wrapper.emitted('topReached')).toHaveLength(1);
89
- });
90
-
91
- it('scrolls to the bottom when `topReached` is defined', () => {
92
- createComponent({
93
- listeners: {
94
- topReached: () => {},
95
- },
96
- });
97
-
98
- return wrapper.vm.$nextTick(() => {
99
- expect(mockScrollTo).toHaveBeenCalledWith({ top: INITIAL_HEIGHT - ADJUST_SCROLL_GAP });
100
- });
101
- });
102
-
103
- it('does not scroll to the bottom when `topReached` and `bottomReached` are defined', () => {
104
- createComponent({
105
- listeners: {
106
- bottomReached: () => {},
107
- topReached: () => {},
108
- },
109
- });
110
-
111
- return wrapper.vm.$nextTick(() => {
112
- expect(mockScrollTo).not.toHaveBeenCalled();
113
- });
114
- });
115
-
116
- it('scroll past loaded items', () => {
117
- createComponent();
118
-
119
- const BATCH_HEIGHT = 100;
120
-
121
- // Mock more items are loaded
122
- wrapper.setProps({ fetchedItems: 4 });
123
-
124
- return wrapper.vm.$nextTick(() => {
125
- // Mock list was expanded in height by BATCH_HEIGHT px
126
- mockScrollHeight = INITIAL_HEIGHT + BATCH_HEIGHT;
127
-
128
- return wrapper.vm.$nextTick(() => {
129
- expect(mockScrollTo).toHaveBeenCalledWith({
130
- top: BATCH_HEIGHT - ADJUST_SCROLL_GAP,
131
- });
132
- });
133
- });
134
- });
135
-
136
- describe('the legend', () => {
137
- describe.each`
138
- totalItems | expectedLegend
139
- ${99} | ${'Showing 2 of 99 items'}
140
- ${2} | ${'Showing 2 of 2 items'}
141
- ${0} | ${'Showing 2 items'}
142
- ${-1} | ${'Showing 2 items'}
143
- ${undefined} | ${'Showing 2 items'}
144
- `('given $totalItems total items', ({ totalItems, expectedLegend }) => {
145
- beforeEach(() => {
146
- createComponent({
147
- propsData: {
148
- fetchedItems: 2,
149
- totalItems,
150
- },
151
- });
152
- });
153
-
154
- it('displays the expected text', () => {
155
- expect(wrapper.text()).toContain(expectedLegend);
156
- });
157
- });
158
- });
159
-
160
- describe('public methods via $ref', () => {
161
- it('scrollUp', () => {
162
- createComponent();
163
- wrapper.vm.scrollUp();
164
-
165
- expect(mockScrollTo).toHaveBeenCalledWith({ top: ADJUST_SCROLL_GAP });
166
- });
167
-
168
- it('scrollDown', () => {
169
- createComponent();
170
- wrapper.vm.scrollDown();
171
-
172
- expect(mockScrollTo).toHaveBeenCalledWith({ top: INITIAL_HEIGHT - ADJUST_SCROLL_GAP });
173
- });
174
-
175
- it('scrollTo', () => {
176
- createComponent();
177
- wrapper.vm.scrollTo({ top: 250, behavior: 'instant' });
178
-
179
- expect(mockScrollTo).toHaveBeenCalledWith({ top: 250, behavior: 'instant' });
180
- });
181
- });
182
- });