dimsum-e2e-tests 3.70.0-next.7 → 3.70.0-next.71

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 (297) hide show
  1. package/CHANGELOG.md +1079 -721
  2. package/ds-accordion/DSAccordion.visual.spec.js +6 -0
  3. package/ds-accordion/DSAccordionCO.js +15 -3
  4. package/ds-accordion/QA_NOTES.md +105 -0
  5. package/ds-accordion/controlled/DSAccordion.controlled.func.spec.js +23 -0
  6. package/ds-accordion/header-structure/DSAccordion.header-structure.func.spec.js +65 -0
  7. package/ds-accordion/input-inside/DSAccordion.input-inside.func.spec.js +19 -0
  8. package/ds-apppicker/DSAppPickerCO.js +101 -3
  9. package/ds-apppicker/aria-pattern/DSAppPicker.aria-pattern.func.spec.js +100 -0
  10. package/ds-apppicker/basic/DSAppPicker.basic.keyboard-nav.func.spec.js +18 -7
  11. package/ds-apppicker/closeAfterSelection/DSAppPicker.closeAfterSelection.func.spec.js +1 -1
  12. package/ds-apppicker/custom-trigger-focus/DSAppPicker.custom-trigger-focus.func.spec.js +82 -0
  13. package/ds-apppicker/label-expansion-dismissal/DSAppPicker.label-expansion-dismissal.visual.spec.js +108 -0
  14. package/ds-apppicker/reflow/DSAppPicker.reflow.func.spec.js +32 -0
  15. package/ds-apppicker/reflow/DSAppPicker.reflow.visual.spec.js +5 -6
  16. package/ds-apppicker/truncation/DSAppPicker.truncation.visual.spec.js +5 -9
  17. package/ds-autocomplete/DSAutocomplete.visual.spec.js +34 -0
  18. package/ds-autocomplete/DSAutocompleteCO.js +36 -1
  19. package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.axe-core.func.spec.js +50 -0
  20. package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.func.spec.js +122 -0
  21. package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.visual.spec.js +48 -0
  22. package/ds-autocomplete/slots/DSAutocomplete.slots.func.spec.js +6 -1
  23. package/ds-banner/DSBanner.text-resize.visual.spec.js +5 -2
  24. package/ds-banner/DSBannerCO.js +4 -0
  25. package/ds-button-v3/DSButtonV3.aria-disabled-attribute.func.spec.js +33 -0
  26. package/ds-button-v3/DSButtonV3CO.js +10 -0
  27. package/ds-button-v3/theme-font/DSButtonV3.theme-font.func.spec.js +30 -0
  28. package/ds-card/DSCard.cardv2_v1.func.spec.js +54 -0
  29. package/ds-card/DSCard.cardv2_v1.visual.spec.js +29 -0
  30. package/ds-card/DSCardCO.js +50 -0
  31. package/ds-card/detail-slots/DSCard.detail-slots.axe-core.func.spec.js +29 -0
  32. package/ds-card/detail-slots/DSCard.detail-slots.func.spec.js +72 -0
  33. package/ds-card/detail-slots/DSCard.detail-slots.visual.spec.js +19 -0
  34. package/ds-card-v3/DSCardV3CO.js +93 -1
  35. package/ds-card-v3/accordion/DSCardV3.accordion-aria-structure.func.spec.js +41 -0
  36. package/ds-card-v3/accordion/DSCardV3.accordion-aria.keyboard.func.spec.js +49 -0
  37. package/ds-card-v3/accordion/DSCardV3.accordion.axe-core.func.spec.js +28 -0
  38. package/ds-card-v3/accordion/DSCardV3.accordion.visual.spec.js +4 -6
  39. package/ds-card-v3/action/DSCardV3.action.axe-core.func.spec.js +24 -0
  40. package/ds-card-v3/action/DSCardV3.action.func.spec.js +53 -0
  41. package/ds-card-v3/action/DSCardV3.action.visual.spec.js +28 -0
  42. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.axe-core.func.spec.js +42 -0
  43. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.func.spec.js +129 -0
  44. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.reorder.func.spec.js +73 -0
  45. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.visual.spec.js +5 -12
  46. package/ds-card-v3/global-attributes/DSCardV3.global-attributes.axe-core.func.spec.js +33 -0
  47. package/ds-card-v3/global-attributes/DSCardV3.global-attributes.visual.spec.js +20 -0
  48. package/ds-card-v3/multi-select/DSCardV3.multi-select.aria-grouping.func.spec.js +24 -0
  49. package/ds-card-v3/multi-select/DSCardV3.multiselect.axe-core.func.spec.js +47 -0
  50. package/ds-card-v3/multi-select/DSCardV3.multiselect.keyboard.func.spec.js +65 -0
  51. package/ds-card-v3/multi-select/DSCardV3.multiselect.visual.spec.js +17 -0
  52. package/ds-card-v3/multiple-action/DSCardV3.multiple-action.axe-core.func.spec.js +35 -0
  53. package/ds-card-v3/multiple-action/DSCardV3.multiple-action.func.spec.js +53 -0
  54. package/ds-card-v3/multiple-action/DSCardV3.multiple-action.visual.spec.js +18 -0
  55. package/ds-card-v3/multiple-control/DSCardV3.multi-control.axe-core.func.spec.js +34 -0
  56. package/ds-card-v3/multiple-control/DSCardV3.multi-control.func.spec.js +26 -0
  57. package/ds-card-v3/multiple-control/DSCardV3.multi-control.visual.spec.js +29 -0
  58. package/ds-card-v3/no-action/DSCardV3.no-action.axe-core.func.spec.js +22 -0
  59. package/ds-card-v3/no-action/DSCardV3.no-action.func.spec.js +23 -0
  60. package/ds-card-v3/no-action/DSCardV3.no-action.visual.spec.js +15 -0
  61. package/ds-card-v3/notification-badges/DSCardV3.notification-badges.axe-core.func.spec.js +33 -0
  62. package/ds-card-v3/notification-badges/DSCardV3.notification-badges.func.spec.js +19 -0
  63. package/ds-card-v3/notification-badges/DSCardV3.notification-badges.visual.spec.js +28 -0
  64. package/ds-card-v3/reflow/DSCardV3.reflow.axe-core.func.spec.js +28 -0
  65. package/ds-card-v3/reflow/DSCardV3.reflow.func.spec.js +36 -0
  66. package/ds-card-v3/reflow/DSCardV3.reflow.visual.spec.js +3 -2
  67. package/ds-card-v3/single-select/DSCardV3.single-select.aria-grouping.func.spec.js +24 -0
  68. package/ds-card-v3/single-select/DSCardV3.single-select.axe-core.func.spec.js +37 -0
  69. package/ds-card-v3/single-select/DSCardV3.single-select.visual.spec.js +1 -2
  70. package/ds-card-v3/slots/DSCardV3.slots.visual.spec.js +1 -2
  71. package/ds-card-v3/variant-accented/DSCardV3.variant-accented.axe-core.func.spec.js +45 -0
  72. package/ds-card-v3/variant-accented/DSCardV3.variant-accented.func.spec.js +28 -0
  73. package/ds-card-v3/variant-accented/DSCardV3.variant-accented.visual.spec.js +35 -0
  74. package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.axe-core.func.spec.js +35 -0
  75. package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.func.spec.js +53 -0
  76. package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.visual.spec.js +28 -0
  77. package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.axe-core.func.spec.js +22 -0
  78. package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.func.spec.js +61 -0
  79. package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.visual.spec.js +20 -0
  80. package/ds-card-v3/variant-disabled/DSCardV3.variantDisabled-non-interactive.func.spec.js +25 -0
  81. package/ds-chat/DSChat.axe-core.func.spec.js +2 -2
  82. package/ds-chat/DSChat.visual.spec.js +4 -4
  83. package/ds-chat/DSChatCO.js +18 -24
  84. package/ds-chat/bubbles/slots/DSChatBubble.slots.axe-core.func.spec.js +24 -0
  85. package/ds-chat/bubbles/slots/DSChatBubble.slots.func.spec.js +49 -0
  86. package/ds-chat/bubbles/slots/DSChatBubble.slots.visual.spec.js +25 -0
  87. package/ds-chat/card/slots/DSChatCard.slots.axe-core.func.spec.js +24 -0
  88. package/ds-chat/card/slots/DSChatCard.slots.func.spec.js +47 -0
  89. package/ds-chat/card/slots/DSChatCard.slots.visual.spec.js +18 -0
  90. package/ds-chat/card/truncated-text/DSChatCard.truncated-text.func.spec.js +32 -0
  91. package/ds-chat/card/truncated-text/DSChatCard.truncated-text.visual.spec.js +26 -0
  92. package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.axe-core.func.spec.js +23 -0
  93. package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.visual.spec.js +17 -0
  94. package/ds-chat/components/BubbleCO.js +46 -3
  95. package/ds-chat/components/CardCO.js +75 -0
  96. package/ds-chat/components/ComposerCO.js +6 -6
  97. package/ds-chat/components/FloatingButtonCO.js +5 -3
  98. package/ds-chat/components/HeaderCO.js +2 -2
  99. package/ds-chat/components/TileCO.js +82 -0
  100. package/ds-chat/components/index.js +3 -2
  101. package/ds-chat/floatingbutton/DSChat-floating-button.visual.spec.js +1 -1
  102. package/ds-chat/loadmore/DSChat-loadmore.func.spec.js +1 -1
  103. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.axe-core.func.spec.js +2 -2
  104. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.func.spec.js +1 -1
  105. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.visual.spec.js +2 -2
  106. package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.axe-core.func.spec.js +2 -2
  107. package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.visual.spec.js +1 -1
  108. package/ds-chat/tile/slots/DSChatTile.slots.func.spec.js +53 -0
  109. package/ds-chat/tile/slots/DSChatTile.slots.visual.spec.js +18 -0
  110. package/ds-chip/label-expansion-dismissal/DSChip.label-expansion-dismissal.visual.spec.js +84 -0
  111. package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable-tooltip.func.spec.js +47 -0
  112. package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable.visual.spec.js +12 -21
  113. package/ds-controlled-form/ds-combobox/disabled/DSCombobox.disabled.visual.spec.js +6 -1
  114. package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.axe-core.basic.func.spec.js +4 -4
  115. package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.basic.visual.spec.js +56 -0
  116. package/ds-controlled-form/ds-controlled-checkbox/DSControlledCheckboxCO.js +54 -1
  117. package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.axe-core.disabled.func.spec.js +1 -1
  118. package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.disabled.visual.spec.js +1 -1
  119. package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.axe-core.hasError.func.spec.js +4 -4
  120. package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.has-error.visual.spec.js +71 -1
  121. package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.axe-core.mixed.func.spec.js +4 -4
  122. package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.visual.spec.js +1 -1
  123. package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.axe-core.read-only.func.spec.js +3 -3
  124. package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.read-only.visual.spec.js +1 -1
  125. package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.axe-core.with-tooltip.func.spec.js +1 -1
  126. package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.with-tooltip.visual.spec.js +1 -3
  127. package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.axe-core.wrap-label.func.spec.js +1 -1
  128. package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.wrap-label.visual.spec.js +1 -1
  129. package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.aria-disabled.visual.spec.js +2 -6
  130. package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.axe-core.aria-disabled.func.spec.js +1 -1
  131. package/ds-controlled-form/ds-controlled-checkbox/slots/DSControlledCheckbox.slots.func.spec.js +78 -0
  132. package/ds-controlled-form/ds-controlled-checkbox/theme-font/DSControlledCheckbox.theme-font.func.spec.js +30 -0
  133. package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.axe-core.func.spec.js +4 -4
  134. package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.visual.spec.js +1 -1
  135. package/ds-controlled-form/ds-controlled-radio/DSControlledRadioCO.js +50 -1
  136. package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.axe-core.func.spec.js +16 -2
  137. package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.func.spec.js +37 -0
  138. package/ds-controlled-form/ds-controlled-radio/slots/DSControlledRadio.slots.func.spec.js +78 -0
  139. package/ds-controlled-form/ds-controlled-radio/theme-font/DSControlledRadio.theme-font.func.spec.js +30 -0
  140. package/ds-controlled-form/react-hook-form/ReactHook.func.spec.js +1 -3
  141. package/ds-data-table-async/DSDataTableCO.js +187 -10
  142. package/ds-data-table-async/basic/DSDataTable.basic.visual.spec.js +1 -1
  143. package/ds-data-table-async/components/FilterBarCO.js +7 -0
  144. package/ds-data-table-async/components/FiltersCO.js +1 -1
  145. package/ds-data-table-async/components/HeaderCO.js +37 -1
  146. package/ds-data-table-async/dnd/DSDataTable.dnd-keyboard-scroll.func.spec.js +51 -0
  147. package/ds-data-table-async/filter-menu-close/DSDataTable.filter-menu-close.func.spec.js +77 -0
  148. package/ds-data-table-async/filter-popover-boundary/DSDataTable.filter-popover-boundary.func.spec.js +98 -0
  149. package/ds-data-table-async/filters/DSDataTable.filters-creatable-active-descendant.func.spec.js +51 -0
  150. package/ds-data-table-async/filters/DSDataTable.filters-creatable.func.spec.js +55 -0
  151. package/ds-data-table-async/filters/DSDataTable.filters.axe-core.func.spec.js +11 -9
  152. package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatablemultiselect.keyboard.func.spec.js +2 -2
  153. package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatableselect.keyboard.func.spec.js +2 -2
  154. package/ds-data-table-async/filtersV2/DSDataTable.filtersV2.axe-core.func.spec.js +45 -29
  155. package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.axe-core.func.spec.js +23 -0
  156. package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.func.spec.js +50 -0
  157. package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.visual.spec.js +21 -0
  158. package/ds-data-table-async/header-affordances/DSDataTable.header-affordances.func.spec.js +92 -0
  159. package/ds-data-table-async/helpers/getInputSelection.js +6 -0
  160. package/ds-data-table-async/helpers/index.js +1 -0
  161. package/ds-data-table-async/keyboard-scroll/DSDataTable.keyboard-scroll.func.spec.js +39 -0
  162. package/ds-data-table-async/menubutton/DSDataTable.MenuButton.keyboard.func.spec.js +8 -7
  163. package/ds-data-table-async/menubutton/DSDataTable.MenuButton.mouse.func.spec.js +6 -7
  164. package/ds-data-table-async/pagination/DSDataTable.pagination.func.spec.js +3 -2
  165. package/ds-data-table-async/resizable/DSDataTable.resize-min-clamp.func.spec.js +72 -0
  166. package/ds-data-table-async/resizable/DSDataTable.resizerA11y.axe-core.func.spec.js +42 -0
  167. package/ds-data-table-async/resizable/DSDataTable.resizerA11y.func.spec.js +98 -0
  168. package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.axe-core.func.spec.js +23 -0
  169. package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.visual.spec.js +106 -0
  170. package/ds-data-table-async/textwrapping/DSDataTable.text-wrap-toolbar.visual.spec.js +27 -0
  171. package/ds-data-table-async/toggle-cell-focus/DSDataTable.toggle-cell-enter-focus.func.spec.js +31 -0
  172. package/ds-data-table-async/vissibility/DSDataTable.vissibility.visual.spec.js +2 -0
  173. package/ds-dataviz/DSDataViz.axis.visual.spec.js +1 -2
  174. package/ds-dataviz/DSDataViz.ticks.visual.spec.js +1 -2
  175. package/ds-dataviz/DSDataVizCO.js +2 -0
  176. package/ds-dataviz/axecore/DSDataViz.axis.axe-core.func.spec.js +1 -1
  177. package/ds-floating-context/DSFloatingContextCO.js +10 -0
  178. package/ds-floating-context/placement/DSFloatingContext.placement.visual.spec.js +48 -0
  179. package/ds-form-combobox-multi/DSComboboxMultiCO.js +36 -9
  180. package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.axe-core.func.spec.js +55 -0
  181. package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.func.spec.js +57 -0
  182. package/ds-form-combobox-multi/aria-disabled/DSComboboxMulti.aria-disabled.visual.spec.js +19 -2
  183. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.axe-core.func.spec.js +24 -0
  184. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.mouse.func.spec.js +0 -2
  185. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.visual.spec.js +22 -0
  186. package/ds-form-combobox-multi/grouped/DSComboboxMulti.grouped.visual.spec.js +42 -0
  187. package/ds-form-combobox-multi/inline/DSComboboxMulti.inline.visual.spec.js +21 -0
  188. package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.func.spec.js +59 -0
  189. package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.visual.spec.js +39 -0
  190. package/ds-form-combobox-multi/skeleton/DSComboboxMulti.skeleton.visual.spec.js +25 -0
  191. package/ds-form-combobox-multi/theme-font/DSComboboxMulti.theme-font.func.spec.js +38 -0
  192. package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.axe-core.func.spec.js +39 -0
  193. package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.func.spec.js +39 -0
  194. package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.visual.spec.js +29 -0
  195. package/ds-form-combobox-single/DSComboboxSingleCO.js +25 -9
  196. package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.axe-core.func.spec.js +49 -0
  197. package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.func.spec.js +54 -0
  198. package/ds-form-combobox-single/aria-disabled/DSComboboxSingle.aria-disabled.visual.spec.js +18 -0
  199. package/ds-form-combobox-single/creatable/DSComboboxSingle.creatable.visual.spec.js +30 -0
  200. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.axe-core.func.spec.js +24 -0
  201. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.mouse.func.spec.js +0 -2
  202. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.visual.spec.js +22 -0
  203. package/ds-form-combobox-single/grouped/DSComboboxSingle.grouped.visual.spec.js +45 -0
  204. package/ds-form-combobox-single/inline/DSComboboxSingle.inline.visual.spec.js +23 -0
  205. package/ds-form-combobox-single/skeleton/DSComboboxSingle.skeleton.visual.spec.js +25 -0
  206. package/ds-form-combobox-single/theme-font/DSComboboxSingle.theme-font.func.spec.js +34 -0
  207. package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.axe-core.func.spec.js +39 -0
  208. package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.func.spec.js +39 -0
  209. package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.visual.spec.js +29 -0
  210. package/ds-form-date-range-picker/DateRangePicker.axe-core.spec.js +5 -0
  211. package/ds-form-date-range-picker/DateRangePicker.functional.spec.js +80 -18
  212. package/ds-form-date-range-picker/DateRangePickerCO.js +19 -0
  213. package/ds-form-date-range-picker/date-segment-aria-labels/DateRangePicker.date-segment-aria-labels.func.spec.js +66 -0
  214. package/ds-form-date-range-picker/grouped-field-error-announcement/DateRangePicker.grouped-field-error-announcement.func.spec.js +59 -0
  215. package/ds-form-date-range-picker/picker-callbacks/DateRangePicker.picker-callbacks.func.spec.js +36 -0
  216. package/ds-form-date-time-picker/DSControlledDateTimePickerCO.js +7 -0
  217. package/ds-form-date-time-picker/date-time-full/DateTimeFull.axe-core.func.spec.js +8 -1
  218. package/ds-form-date-time-picker/date-time-full/DateTimePicker.DateTimeFull.visual.spec.js +9 -0
  219. package/ds-form-date-time-picker/partial-date-open-focus/DateTimePicker.partial-date-open-focus.func.spec.js +45 -0
  220. package/ds-form-native-select/NativeSelect.axe-core.func.spec.js +39 -0
  221. package/ds-form-native-select/NativeSelect.visual.spec.js +33 -0
  222. package/ds-form-native-select/NativeSelectCO.js +6 -0
  223. package/ds-form-native-select/option-selection/NativeSelect.option-selection.func.spec.js +25 -0
  224. package/ds-form-toggle/DSToggle.func.spec.js +20 -23
  225. package/ds-form-toggle/DSToggleCO.js +11 -2
  226. package/ds-global-header/GlobalHeader.announcements.func.spec.js +27 -0
  227. package/ds-global-header/GlobalHeader.axe-core.func.spec.js +15 -15
  228. package/ds-global-header/GlobalHeader.func.spec.js +70 -1
  229. package/ds-global-header/GlobalHeaderCO.js +120 -2
  230. package/ds-global-header/app-picker-passthrough/GlobalHeader.app-picker-passthrough.func.spec.js +113 -0
  231. package/ds-global-header/popup-menu-focus/GlobalHeader.popup-menu-focus.func.spec.js +63 -0
  232. package/ds-global-header/popup-menu-slots/GlobalHeader.popup-menu-slots.func.spec.js +70 -0
  233. package/ds-global-header/search-toggle-slots/GlobalHeader.search-toggle-slots.func.spec.js +118 -0
  234. package/ds-global-header/toolbar-item-attributes/GlobalHeader.toolbar-item-attributes.func.spec.js +53 -0
  235. package/ds-grid/DSGridCO.js +20 -0
  236. package/ds-grid/layout-mode/DSGrid.layout-mode.func.spec.js +51 -0
  237. package/ds-grid/layout-mode/DSGrid.layout-mode.visual.spec.js +22 -0
  238. package/ds-hooks/DSHook.UseFontSizeMedia.visual.spec.js +5 -2
  239. package/ds-hooks/DSHook.usetree.func.spec.js +3 -2
  240. package/ds-hooks/DSHookCO.js +56 -23
  241. package/ds-hooks/useFocusStack/DSHook.useFocusStack.func.spec.js +83 -0
  242. package/ds-hooks/useFocusTrap/UseFocusTrapCO.js +2 -0
  243. package/ds-hooks/useFocusTrap/UseFocusTrapToggle.func.spec.js +48 -0
  244. package/ds-hooks/useMask/Number/UseNumberMask.axe-core.func.spec.js +48 -0
  245. package/ds-menu-button/DSMenuButtonCO.js +23 -0
  246. package/ds-menu-button/slots/DSMenuButton.slots.axe-core.func.spec.js +28 -0
  247. package/ds-menu-button/slots/DSMenuButton.slots.func.spec.js +59 -0
  248. package/ds-menu-button/slots/DSMenuButton.slots.visual.spec.js +26 -0
  249. package/ds-modal-slide/ModalSlideCO.js +7 -0
  250. package/ds-modal-slide/custom-header/ModalSlide.customHeader.focusRing.visual.spec.js +2 -1
  251. package/ds-modal-slide/heading-level/ModalSlide.headingLevel.axe-core.func.spec.js +25 -0
  252. package/ds-modal-slide/heading-level/ModalSlide.headingLevel.func.spec.js +25 -0
  253. package/ds-modal-slide/slots/ModalSlide.slots.func.spec.js +18 -0
  254. package/ds-notification-badge/DSNotificationBadge.visual.spec.js +17 -20
  255. package/ds-page-layout/PageLayoutCO.js +4 -4
  256. package/ds-pills-v2/DSPillsV2CO.js +12 -0
  257. package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.func.spec.js +53 -0
  258. package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.visual.spec.js +26 -0
  259. package/ds-pills-v2/disabled/DSPills.disabled.func.spec.js +53 -0
  260. package/ds-pills-v2/disabled/DSPills.disabled.visual.spec.js +33 -0
  261. package/ds-progress-indicator/DSProgressIndicator.axe-core.func.spec.js +2 -0
  262. package/ds-progress-indicator/DSProgressIndicatorCO.js +1 -1
  263. package/ds-query-builder/DSQueryBuilder.visual.spec.js +6 -6
  264. package/ds-shuttle-v2/DSShuttleV2CO.js +15 -1
  265. package/ds-shuttle-v2/breadcrumb-a11y/DSShuttleV2.breadcrumb-a11y.func.spec.js +43 -0
  266. package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.func.spec.js +37 -0
  267. package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.visual.spec.js +30 -0
  268. package/ds-shuttle-v2/extra/DSShuttleV2.extra.visual.spec.js +8 -3
  269. package/ds-shuttle-v2/items/DSShuttleV2.items.func.spec.js +4 -2
  270. package/ds-shuttle-v2/skipped/DSShuttleV2.extra.axe-core.skipped.js +1 -1
  271. package/ds-shuttle-v2/skipped/DSShuttleV2.filter.axe-core.skipped.js +1 -1
  272. package/ds-shuttle-v2/skipped/DSShuttleV2.globalcheckbox.axe-core.skipped.js +1 -1
  273. package/ds-shuttle-v2/skipped/DSShuttleV2.items.axe-core.skipped.js +3 -3
  274. package/ds-shuttle-v2/skipped/DSShuttleV2.skipped.js +5 -5
  275. package/ds-slider-v2/DSSliderV2.func.spec.js +36 -25
  276. package/ds-slider-v2/DSSliderV2CO.js +10 -0
  277. package/ds-slider-v2/min-range/DSSliderV2.min-range.func.spec.js +69 -0
  278. package/ds-tab-button/DSTabButton.func.spec.js +1 -1
  279. package/ds-tabs/DSTabsCO.js +4 -0
  280. package/ds-tabs/notification-badge/DSTabs.notification-badge.axe-core.func.spec.js +28 -0
  281. package/ds-tabs/notification-badge/DSTabs.notification-badge.func.spec.js +51 -0
  282. package/ds-tooltip-v3/DSTooltipV3CO.js +21 -0
  283. package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.axe-core.func.spec.js +23 -0
  284. package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.func.spec.js +29 -0
  285. package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.func.spec.js +45 -0
  286. package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.visual.spec.js +29 -0
  287. package/ds-treeview/DSTreeViewCO.js +23 -0
  288. package/ds-treeview/dragAndDrop/TreeView-dnd_keyboard.func.spec.js +96 -0
  289. package/ds-typography/DSTypographyCO.js +10 -0
  290. package/ds-typography/theme-font/DSTypography.theme-font.func.spec.js +30 -0
  291. package/package.json +150 -153
  292. package/paths.js +16 -6
  293. package/ds-card-v3/disabled/DSCardV3.disabled.visual.spec.js +0 -17
  294. package/ds-chat-tile/TileCO.js +0 -35
  295. package/ds-hooks/DSHook.func.spec.js +0 -60
  296. package/ds-hooks/useFocusStack/DSHook.useFocusStack.skipped.js +0 -57
  297. package/ds-treeview/dragAndDrop/TreeView-dnd_mouse.func.spec.js +0 -61
@@ -12,6 +12,7 @@ const DSShuttleV2DataTestIds = {
12
12
  ITEM_LABEL_WRAPPER: 'ds-shuttlev2-item-label-wrapper',
13
13
  ITEM_MIDSECTION_WRAPPER: 'ds-shuttlev2-item-midsection-wrapper',
14
14
  ITEM_SELECTION: 'ds-shuttlev2-item-selection',
15
+ ITEM_SELECTION_CHECKBOX_UI: 'ds-shuttlev2-item-selection-checkbox-ui',
15
16
  ITEM_ACTIONS_WRAPPER: 'ds-shuttlev2-item-actions-wrapper',
16
17
  ITEM_ACTION_WRAPPER: 'ds-shuttlev2-item-action-wrapper',
17
18
  ITEM_ACTION_BTN: 'ds-shuttlev2-item-action-btn',
@@ -27,7 +28,6 @@ const DSShuttleV2DataTestIds = {
27
28
  MOVE_MULTIPLE_WRAPPER: 'ds-shuttlev2-move-multiple-wrapper',
28
29
  MOVE_MULTIPLE_BTN: 'ds-shuttlev2-move-multiple-btn',
29
30
  LIST_WRAPPER_MID: 'ds-shuttlev2-list-wrapper-mid',
30
- LIST_WRAPPER_MID_SCROLLER: 'ds-shuttlev2-list-wrapper-mid-scroller',
31
31
  LIST_WRAPPER_TOP: 'ds-shuttlev2-list-wrapper-top',
32
32
  AREA_SEARCH_WRAPPER: 'ds-shuttlev2-area-search-wrapper',
33
33
  AREA_SEARCH_BAR: 'ds-shuttlev2-area-search-bar',
@@ -42,6 +42,8 @@ export default class DSShuttleV2CO extends PageObject {
42
42
 
43
43
  static basicURL = new Urlbuilder(PATH_E2E_SHUTTLE_V2, 'basic-test');
44
44
 
45
+ static breadcrumbAccessibleURL = new Urlbuilder(PATH_E2E_SHUTTLE_V2, 'breadcrumb-accessible-test');
46
+
45
47
  static adHocRenderAfterBulkMove = new Urlbuilder(PATH_E2E_SHUTTLE_V2, 'ad-hoc-render-after-bulk-move');
46
48
 
47
49
  static ariaPropsUrl = new Urlbuilder(PATH_E2E_SHUTTLE_V2, 'aria-props-test');
@@ -78,6 +80,8 @@ export default class DSShuttleV2CO extends PageObject {
78
80
 
79
81
  static insideDialogURL = new Urlbuilder(PATH_E2E_SHUTTLE_V2, 'inside-dialog-test');
80
82
 
83
+ static explicitSelectionUIURL = new Urlbuilder(PATH_E2E_SHUTTLE_V2, 'explicit-selection-ui-test');
84
+
81
85
  // Getter's
82
86
 
83
87
  static getHeaderSearchIcon = async (index = 0) =>
@@ -104,6 +108,14 @@ export default class DSShuttleV2CO extends PageObject {
104
108
 
105
109
  static getItemSelection = async (index = 0) => $$(`[data-testid=${DSShuttleV2DataTestIds.ITEM_SELECTION}]`)[index];
106
110
 
111
+ static getItemSelectionCheckboxUI = async (index = 0) =>
112
+ $$(`[data-testid=${DSShuttleV2DataTestIds.ITEM_SELECTION_CHECKBOX_UI}]`)[index];
113
+
114
+ static getItemSelections = async () => $$(`[data-testid=${DSShuttleV2DataTestIds.ITEM_SELECTION}]`);
115
+
116
+ static getItemSelectionCheckboxUIs = async () =>
117
+ $$(`[data-testid=${DSShuttleV2DataTestIds.ITEM_SELECTION_CHECKBOX_UI}]`);
118
+
107
119
  static getItemsActionsWrapper = async (index = 0) =>
108
120
  $$(`[data-testid=${DSShuttleV2DataTestIds.ITEM_ACTIONS_WRAPPER}]`)[index];
109
121
 
@@ -182,6 +194,8 @@ export default class DSShuttleV2CO extends PageObject {
182
194
 
183
195
  static getBreadcrumbs = async () => $$(`[data-testid="ds-breadcrumb-link"]`);
184
196
 
197
+ static getActiveBreadcrumb = async () => $(`[data-testid="ds-breadcrumb-link"][aria-current="step"]`);
198
+
185
199
  static getSubtitleByItem = async (item) => item.$$(`p`)[1];
186
200
 
187
201
  static getActionButtonByItemAndIndex = async (item, index = 0) =>
@@ -0,0 +1,43 @@
1
+ import DSShuttleV2CO from '../DSShuttleV2CO';
2
+
3
+ // Tests for the fix introduced in PUI-17395 (ShuttleV2 breadcrumb a11y):
4
+ // every step renders as a focusable <button> and the active/current step exposes
5
+ // aria-current="step". DOM-attribute assertions are browser-agnostic, so this runs Chrome-only.
6
+ if (
7
+ (!browser.capabilities['ice:options'].isPhone &&
8
+ !browser.capabilities['ice:options'].isTablet &&
9
+ browser.capabilities.browserName === 'chrome') ||
10
+ browser.capabilities.browserName === 'Chrome'
11
+ ) {
12
+ describe('PUI-18762 - DSShuttleV2:: breadcrumb active step aria-current -Func', () => {
13
+ before(async () => {
14
+ const errorOnGo = await DSShuttleV2CO.breadcrumbAccessibleURL.go();
15
+ if (errorOnGo) throw errorOnGo;
16
+ });
17
+
18
+ it('01: active step exposes aria-current="step" and every step is a focusable button', async () => {
19
+ // Drill down two levels so the breadcrumb has multiple steps (ancestors + current)
20
+ const rootItem = await DSShuttleV2CO.getItemFromSourceByIndex(1);
21
+ await (await DSShuttleV2CO.getActionButtonByItemAndIndex(rootItem, 0)).click();
22
+ const subItem = await DSShuttleV2CO.getItemFromSourceByIndex(2);
23
+ await (await DSShuttleV2CO.getActionButtonByItemAndIndex(subItem, 0)).click();
24
+
25
+ // Gather elements/values
26
+ const crumbs = await DSShuttleV2CO.getBreadcrumbs();
27
+ const activeCrumb = await DSShuttleV2CO.getActiveBreadcrumb();
28
+ const activeCrumbTag = await activeCrumb.getTagName();
29
+ const firstCrumb = crumbs[0];
30
+ const firstCrumbTag = await firstCrumb.getTagName();
31
+
32
+ // Assertions
33
+ await expect(crumbs.length).toBeGreaterThan(1);
34
+ // The current/active step (last) is announced as the current step
35
+ await expect(activeCrumb).toBeExisting();
36
+ await expect(activeCrumb).toHaveAttribute('aria-current', 'step');
37
+ await expect(activeCrumbTag).toBe('button');
38
+ // Non-active ancestor steps are buttons without aria-current
39
+ await expect(firstCrumbTag).toBe('button');
40
+ await expect(firstCrumb).not.toHaveAttribute('aria-current');
41
+ });
42
+ });
43
+ }
@@ -0,0 +1,37 @@
1
+ import DSShuttleV2CO from '../DSShuttleV2CO';
2
+
3
+ // Tests for the WCAG 1.4.1 "Use of Color" fix introduced in PUI-15539:
4
+ // the `explicitSelectionUI` flag swaps the color-only vertical bar for an
5
+ // explicit checkbox as the per-item selection indicator.
6
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
+ describe('PUI-18638 - DSShuttleV2:: explicitSelectionUI checkbox indicator - func', () => {
8
+ before(async () => {
9
+ const errorOnGo = await DSShuttleV2CO.explicitSelectionUIURL.go();
10
+ if (errorOnGo) throw errorOnGo;
11
+ });
12
+
13
+ it('01: should render an explicit checkbox indicator per item and no color-only vertical bar', async () => {
14
+ const verticalBars = await DSShuttleV2CO.getItemSelections();
15
+ const checkboxUIs = await DSShuttleV2CO.getItemSelectionCheckboxUIs();
16
+ await expect(verticalBars.length).toBe(0);
17
+ await expect(checkboxUIs.length).toBeGreaterThan(0);
18
+ await expect(await DSShuttleV2CO.getItemSelectionCheckboxUI(0)).toBeExisting();
19
+ });
20
+
21
+ it('02: should check the selection indicator after selecting a selectable item', async () => {
22
+ const selectableItem = await DSShuttleV2CO.getItemWrapper(0); // "Source 0.0" — even index, selectable
23
+ const selectableCheckbox = await DSShuttleV2CO.getItemCheckboxByIndex(0);
24
+ await expect(await selectableCheckbox.getAttribute('aria-checked')).toBe('false');
25
+ await selectableItem.click();
26
+ await expect(await selectableCheckbox.getAttribute('aria-checked')).toBe('true');
27
+ });
28
+
29
+ it('03: should keep the selection-prevented item disabled and unchecked after click', async () => {
30
+ const preventedItem = await DSShuttleV2CO.getItemWrapper(1); // "Source 0.1" — odd index, prevented
31
+ const preventedCheckbox = await DSShuttleV2CO.getItemCheckboxByIndex(1);
32
+ await expect(await preventedCheckbox.getAttribute('aria-disabled')).toBe('true');
33
+ await preventedItem.click();
34
+ await expect(await preventedCheckbox.getAttribute('aria-checked')).toBe('false');
35
+ });
36
+ });
37
+ }
@@ -0,0 +1,30 @@
1
+ import DSShuttleV2CO from '../DSShuttleV2CO';
2
+
3
+ // Visual coverage for the WCAG 1.4.1 "Use of Color" fix (PUI-15539): with
4
+ // `explicitSelectionUI`, items expose unselected, selected and disabled
5
+ // checkbox states as a non-color selection indicator.
6
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
+ describe('PUI-18639 - DSShuttleV2:: explicitSelectionUI checkbox indicators - visual', () => {
8
+ before(async () => {
9
+ const errorOnGo = await DSShuttleV2CO.explicitSelectionUIURL.go();
10
+ if (errorOnGo) throw errorOnGo;
11
+ });
12
+
13
+ it('01: should display unselected checkboxes and disabled checkboxes on prevented items', async () => {
14
+ const firstSelectable = await DSShuttleV2CO.getItemWrapper(0); // "Source 0.0" — selectable
15
+ await firstSelectable.waitForDisplayed();
16
+ const snapshot = await browser.percyCheckScreenshot();
17
+ await expect(snapshot).toEqual(0);
18
+ });
19
+
20
+ it('02: should display checked checkboxes and the BAB after selecting selectable items', async () => {
21
+ const firstSelectable = await DSShuttleV2CO.getItemWrapper(0); // "Source 0.0" — selectable
22
+ await firstSelectable.waitForDisplayed();
23
+ await firstSelectable.click();
24
+ const secondSelectable = await DSShuttleV2CO.getItemWrapper(2); // "Source 0.2" — selectable
25
+ await secondSelectable.click();
26
+ const snapshot = await browser.percyCheckScreenshot();
27
+ await expect(snapshot).toEqual(0);
28
+ });
29
+ });
30
+ }
@@ -51,19 +51,24 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
51
51
  before(async () => {
52
52
  const errorOnGo = await DSShuttleV2CO.loadMoreURL.go();
53
53
  if (errorOnGo) throw errorOnGo;
54
- await browser.maximizeWindow();
55
54
  });
56
55
  it('01: should move all the items a, focus jump to body panel and load more items', async () => {
57
- await browser.eyesOpen();
58
56
  const selectAllCheckbox = await DSShuttleV2CO.getCheckboxByIndex(0);
59
57
  await selectAllCheckbox.click();
60
58
  const bab = await DSShuttleV2CO.getMoveMultipleButton();
61
59
  await bab.click();
60
+ // await browser.keys(Key.Tab);
61
+ // await browser.keys(Key.Return);
62
62
  const loadMoreBtn = await DSShuttleV2CO.getSourceLoadMore();
63
63
  await loadMoreBtn.click();
64
64
  const firstItem = await DSShuttleV2CO.getItemFromSourceByIndex(0);
65
65
  await firstItem.waitForDisplayed();
66
- const snapshot = await browser.eyesCheckSnapshot(DSShuttleV2CO.snapshotPath('shuttle-v2-after-loadmore'));
66
+ const sourcePanelBody = await DSShuttleV2CO.getListWrapperMid(0);
67
+ await browser.waitUntil(async () => sourcePanelBody.isFocused(), {
68
+ timeout: 5000,
69
+ timeoutMsg: 'Source panel body never received focus before snapshot',
70
+ });
71
+ const snapshot = await browser.percyCheckScreenshot();
67
72
  await expect(snapshot).toEqual(0);
68
73
  });
69
74
  });
@@ -74,11 +74,13 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
74
74
  it('01: should not move the item when the disabled move action button is clicked', async () => {
75
75
  const testItem = await DSShuttleV2CO.getItemWrapper(1);
76
76
  const testItemMoveBtn = await DSShuttleV2CO.getActionButtonByItemAndIndex(testItem, 1);
77
- const testItemMoveBtnDisabled = await testItemMoveBtn.getAttribute('aria-disabled');
78
77
  const testItemText = await testItem.getText();
79
78
  await testItemMoveBtn.click();
80
79
  await expect(testItemText).toBe('Source 0.1');
81
- await expect(testItemMoveBtnDisabled).toBe('true');
80
+ // PUI-17909: a natively disabled DSButton emits the native `disabled` attribute and
81
+ // intentionally omits aria-disabled (that is reserved for applyAriaDisabled). Assert the
82
+ // native disabled state instead of the now-absent aria-disabled.
83
+ await expect(testItemMoveBtn).toBeDisabled();
82
84
  });
83
85
  it('02: should not display the BAB when a disabled item is clicked', async () => {
84
86
  const testItem = await DSShuttleV2CO.getItemWrapper(1);
@@ -7,7 +7,7 @@ if (
7
7
  browser.capabilities.browserName === 'Chrome') ||
8
8
  browser.capabilities.browserName === 'chrome'
9
9
  ) {
10
- // to be unskiped after PUI-10785 is fixed
10
+ // to be unskiped after PUI-18632 is fixed
11
11
  describe.skip('PUI-10774 - Shuttle V2, Load More -AxeCore.', () => {
12
12
  before(async () => {
13
13
  const errorOnGo = await DSShuttleV2CO.loadMoreURL.go();
@@ -7,7 +7,7 @@ if (
7
7
  browser.capabilities.browserName === 'Chrome') ||
8
8
  browser.capabilities.browserName === 'chrome'
9
9
  ) {
10
- // to be unskiped after PUI-11211 is fixed
10
+ // to be unskiped after PUI-18632 is fixed
11
11
  describe.skip('PUI-10775 - Shuttle V2, Filter axe-core -Func.', () => {
12
12
  before(async () => {
13
13
  const errorOnGo = await DSShuttleV2CO.filterURL.go();
@@ -7,7 +7,7 @@ if (
7
7
  browser.capabilities.browserName === 'Chrome') ||
8
8
  browser.capabilities.browserName === 'chrome'
9
9
  ) {
10
- // to be unskiped after PUI-10785 is fixed
10
+ // to be unskiped after PUI-18632 is fixed
11
11
  describe.skip('PUI-10776 - Shuttle V2, Select/deselect with disabled items -AxeCore.', () => {
12
12
  before(async () => {
13
13
  const errorOnGo = await DSShuttleV2CO.disabledItemsURL.go();
@@ -7,7 +7,7 @@ if (
7
7
  browser.capabilities.browserName === 'Chrome') ||
8
8
  browser.capabilities.browserName === 'chrome'
9
9
  ) {
10
- // to be unskiped after PUI-10785 is fixed
10
+ // to be unskiped after PUI-18632 is fixed
11
11
  describe.skip('PUI-10777 - Shuttle V2, Soft delete -AxeCore.', () => {
12
12
  before(async () => {
13
13
  const errorOnGo = await DSShuttleV2CO.softDeleteURL.go();
@@ -28,7 +28,7 @@ if (
28
28
  expect(result.length).toBe(0);
29
29
  });
30
30
  });
31
- // to be unskiped after PUI-10785 is fixed
31
+ // to be unskiped after PUI-18632 is fixed
32
32
  describe.skip('PUI-10778 - Shuttle V2, Subtitle -AxeCore.', () => {
33
33
  before(async () => {
34
34
  const errorOnGo = await DSShuttleV2CO.subtitleURL.go();
@@ -46,7 +46,7 @@ if (
46
46
  expect(result.length).toBe(0);
47
47
  });
48
48
  });
49
- // to be unskiped after PUI-10785 is fixed
49
+ // to be unskiped after PUI-18632 is fixed
50
50
  describe.skip('PUI-10779 - Shuttle V2, Max selected items -AxeCore.', () => {
51
51
  before(async () => {
52
52
  const errorOnGo = await DSShuttleV2CO.maxSelectedURL.go();
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable max-statements */
2
2
  /* eslint-disable max-lines */
3
- // to be unskiped after PUI-11211 is fixed
3
+ // to be unskiped after PUI-18632 is fixed
4
4
  describe.skip('PUI-10768 - Shuttle V2, Basic -AxeCore.', () => {
5
5
  before(async () => {
6
6
  const errorOnGo = await DSShuttleV2CO.basicURL.go();
@@ -25,7 +25,7 @@ describe.skip('PUI-10768 - Shuttle V2, Basic -AxeCore.', () => {
25
25
  });
26
26
  });
27
27
 
28
- // to be unskiped after PUI-10785 is fixed
28
+ // to be unskiped after PUI-18632 is fixed
29
29
  describe.skip('PUI-10770 - Shuttle V2, Tooltip with keyboard -AxeCore.', () => {
30
30
  before(async () => {
31
31
  const errorOnGo = await DSShuttleV2CO.customRendererURL.go();
@@ -46,7 +46,7 @@ describe.skip('PUI-10770 - Shuttle V2, Tooltip with keyboard -AxeCore.', () =>
46
46
 
47
47
  // From drilldown
48
48
 
49
- // to be unskiped after PUI-11211 is fixed
49
+ // to be unskiped after PUI-18632 is fixed
50
50
  describe.skip('PUI-10771 - Shuttle V2, Drill Down and NOT Keep parent -AxeCore.', () => {
51
51
  before(async () => {
52
52
  const errorOnGo = await DSShuttleV2CO.basicURL.go();
@@ -72,7 +72,7 @@ describe.skip('PUI-10771 - Shuttle V2, Drill Down and NOT Keep parent -AxeCore.'
72
72
  expect(result.length).toBe(0);
73
73
  });
74
74
  });
75
- // to be unskiped after PUI-11211 is fixed
75
+ // to be unskiped after PUI-18632 is fixed
76
76
  describe.skip('PUI-10772 - Shuttle V2, Drill down and keep parent -AxeCore.', () => {
77
77
  before(async () => {
78
78
  const errorOnGo = await DSShuttleV2CO.basicKeepParentURL.go();
@@ -92,7 +92,7 @@ describe.skip('PUI-10772 - Shuttle V2, Drill down and keep parent -AxeCore.', (
92
92
 
93
93
  // From drilldown KB
94
94
 
95
- // To be unskipped and steps to be added after 11211 is fixed
95
+ // To be unskipped and steps to be added after PUI-18632 is fixed
96
96
  describe.skip('PUI-10109 - Shuttle V2, Drill down and keep parent, KB -Func.', () => {
97
97
  before(async () => {
98
98
  const errorOnGo = await DSShuttleV2CO.basicKeepParentURL.go();
@@ -105,8 +105,9 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
105
105
  await expect(valueAfterChange).toEqual('75');
106
106
  await expect(value2AfterChange).toEqual('100');
107
107
  });
108
- it.skip('04: should move second multiple slider handler to 75 (uncomplete step backwards fromm 100)', async () => {
109
- // Unskip after PUI-12653 is done
108
+ it('04: should move second multiple slider handler to 75 (uncomplete step backwards fromm 100)', async () => {
109
+ // Unskipped after PUI-12653 / PUI-12643: handlers can no longer cross, so the max handler
110
+ // stepping back from 100 is capped by the min handler (75) instead of landing on 25.
110
111
  const handler = await DSSliderV2CO.getSliderThumb(1);
111
112
  const handler2 = await DSSliderV2CO.getSliderThumb(2);
112
113
  await browser.keys(Key.Tab);
@@ -199,35 +200,27 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
199
200
  await expect(valueHandler1after).toEqual('25');
200
201
  await expect(valueHandler2after).toEqual('75');
201
202
  });
202
- it('02: should be able to change the handlers order (with mouse)', async () => {
203
+ it('02: should stop the max handler at the min handler value (with mouse)', async () => {
204
+ // PUI-12643: dragging the max handler well past the min handler no longer swaps their order,
205
+ // the min handler acts as the limit for that direction and both end up sharing the same value.
203
206
  const minSlider = await DSSliderV2CO.getMinHandlerByAriaLabel();
204
207
  const maxSlider = await DSSliderV2CO.getMaxHandlerByAriaLabel();
205
- await minSlider.dragAndDrop({ x: 550, y: 0 });
206
208
  await maxSlider.dragAndDrop({ x: -1200, y: 0 });
207
209
  const valueMinSliderAfter = await DSSliderV2CO.getSliderValue(minSlider);
208
210
  const valueMaxSliderAfter = await DSSliderV2CO.getSliderValue(maxSlider);
209
- await expect(valueMinSliderAfter).toEqual('50');
210
- await expect(valueMaxSliderAfter).toEqual('0');
211
+ await expect(valueMinSliderAfter).toEqual('25');
212
+ await expect(valueMaxSliderAfter).toEqual('25');
211
213
  });
212
- it('03: should be to set both handlers at the same value with mouse', async () => {
214
+ it('03: should separate both handlers again after they overlap (with mouse)', async () => {
215
+ // Both handlers share the value 25, so the pointer lands on the topmost one (the max handler).
216
+ // Dragging it away from the min handler must re-open the range.
213
217
  const minSlider = await DSSliderV2CO.getMinHandlerByAriaLabel();
214
218
  const maxSlider = await DSSliderV2CO.getMaxHandlerByAriaLabel();
215
- await minSlider.dragAndDrop({ x: 900, y: 0 });
216
- await maxSlider.dragAndDrop({ x: 900, y: 0 });
217
219
  await maxSlider.dragAndDrop({ x: 900, y: 0 });
218
220
  const valueMinSliderAfter = await DSSliderV2CO.getSliderValue(minSlider);
219
221
  const valueMaxSliderAfter = await DSSliderV2CO.getSliderValue(maxSlider);
220
- await expect(valueMinSliderAfter).toEqual('100');
221
- await expect(valueMaxSliderAfter).toEqual('100');
222
- });
223
- it('04: should be to move from 100', async () => {
224
- const minSlider = await DSSliderV2CO.getMinHandlerByAriaLabel();
225
- const maxSlider = await DSSliderV2CO.getMaxHandlerByAriaLabel();
226
- await minSlider.dragAndDrop({ x: -750, y: 0 });
227
- const valueMinSliderAfter = await DSSliderV2CO.getSliderValue(minSlider);
228
- const valueMaxSliderAfter = await DSSliderV2CO.getSliderValue(maxSlider);
229
- await expect(valueMinSliderAfter).toEqual('100');
230
- await expect(valueMaxSliderAfter).toEqual('50');
222
+ await expect(valueMinSliderAfter).toEqual('25');
223
+ await expect(Number(valueMaxSliderAfter)).toBeGreaterThan(Number(valueMinSliderAfter));
231
224
  });
232
225
  });
233
226
 
@@ -253,27 +246,45 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
253
246
  await expect(valueHandler1after).toEqual('25');
254
247
  await expect(valueHandler2after).toEqual('75');
255
248
  });
256
- it('02: should be able to change the handlers order (with KB)', async () => {
249
+ it('02: should not let either handler cross the other one (with KB)', async () => {
250
+ // PUI-12643: the max handler stops on the min handler value (25) and further ArrowLeft presses
251
+ // are ignored; the same applies to the min handler pressing ArrowRight against the max handler.
252
+ // The aria-labels stay bound to their handler, so min/max never swap roles.
257
253
  const minSlider = await DSSliderV2CO.getMinHandlerByAriaLabel();
258
254
  const maxSlider = await DSSliderV2CO.getMaxHandlerByAriaLabel();
259
255
  await browser.keys(Key.ArrowLeft);
260
256
  await browser.keys(Key.ArrowLeft);
257
+ await browser.keys(Key.ArrowLeft);
261
258
  await browser.keys([Key.Shift, Key.Tab]);
262
259
  await browser.keys(Key.ArrowRight);
263
260
  const valueMinSliderAfter = await DSSliderV2CO.getSliderValue(minSlider);
264
261
  const valueMaxSliderAfter = await DSSliderV2CO.getSliderValue(maxSlider);
265
- await expect(valueMinSliderAfter).toEqual('50');
262
+ await expect(valueMinSliderAfter).toEqual('25');
266
263
  await expect(valueMaxSliderAfter).toEqual('25');
264
+ await expect(minSlider).toBeFocused();
267
265
  });
268
- it('03: should be to set both handlers at the same value (with KB)', async () => {
266
+ it('03: should move both handlers away from the upper limit (with KB)', async () => {
267
+ // PUI-12653: with both handlers stacked on the right-most limit the keyboard must still be able
268
+ // to move them, which is the accessible escape hatch the mouse does not provide.
269
269
  const minSlider = await DSSliderV2CO.getMinHandlerByAriaLabel();
270
270
  const maxSlider = await DSSliderV2CO.getMaxHandlerByAriaLabel();
271
271
  await browser.keys(Key.Tab);
272
272
  await browser.keys(Key.ArrowRight);
273
+ await browser.keys(Key.ArrowRight);
274
+ await browser.keys(Key.ArrowRight);
275
+ await browser.keys([Key.Shift, Key.Tab]);
276
+ await browser.keys(Key.ArrowRight);
277
+ await browser.keys(Key.ArrowRight);
278
+ await browser.keys(Key.ArrowRight);
279
+ const valueMinAtLimit = await DSSliderV2CO.getSliderValue(minSlider);
280
+ const valueMaxAtLimit = await DSSliderV2CO.getSliderValue(maxSlider);
281
+ await expect(valueMinAtLimit).toEqual('100');
282
+ await expect(valueMaxAtLimit).toEqual('100');
283
+ await browser.keys(Key.ArrowLeft);
273
284
  const valueMinSliderAfter = await DSSliderV2CO.getSliderValue(minSlider);
274
285
  const valueMaxSliderAfter = await DSSliderV2CO.getSliderValue(maxSlider);
275
- await expect(valueMinSliderAfter).toEqual('50');
276
- await expect(valueMaxSliderAfter).toEqual('50');
286
+ await expect(valueMinSliderAfter).toEqual('75');
287
+ await expect(valueMaxSliderAfter).toEqual('100');
277
288
  });
278
289
  });
279
290
 
@@ -9,6 +9,8 @@ export default class DSSliderCO extends PageObject {
9
9
 
10
10
  static multipleURL = new Urlbuilder(PATH_E2E_SLIDER_V2, 'multiple-test');
11
11
 
12
+ static minRangeURL = new Urlbuilder(PATH_E2E_SLIDER_V2, 'min-range-test');
13
+
12
14
  static slotsTest = new Urlbuilder(PATH_E2E_SLIDER_V2, 'slots-test');
13
15
 
14
16
  static singleURL = new Urlbuilder(PATH_E2E_SLIDER_V2, 'single-test');
@@ -93,6 +95,14 @@ export default class DSSliderCO extends PageObject {
93
95
  return $('[aria-label="Max Range slider multiple aria"]');
94
96
  }
95
97
 
98
+ static async getMinRangeMinHandler() {
99
+ return $('[aria-label="Min Range slider minRange aria"]');
100
+ }
101
+
102
+ static async getMinRangeMaxHandler() {
103
+ return $('[aria-label="Max Range slider minRange aria"]');
104
+ }
105
+
96
106
  // actions
97
107
  static async getSliderValue(sliderThumb) {
98
108
  return sliderThumb.getAttribute('aria-valuenow');
@@ -0,0 +1,69 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSSliderV2CO from '../DSSliderV2CO';
3
+
4
+ // Tests for the fix introduced in PUI-12643 ([SliderV2] Can move a handler over the other).
5
+ // The fix relies on the `minRange` prop: on a multiple slider the neighbouring handler acts as the
6
+ // limit for that direction, so the handlers can neither cross over nor sit on top of each other.
7
+ // The story uses minValue 0, maxValue 100, step 25 and minRange 25, so the smallest allowed
8
+ // distance between both handlers is exactly one step.
9
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
10
+ describe('PUI-12646 - DSSliderV2:: multiple handlers cannot overlap with minRange - Func', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSSliderV2CO.minRangeURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should stop the min handler one minRange away from the max handler (with KB)', async () => {
17
+ const minHandler = await DSSliderV2CO.getMinRangeMinHandler();
18
+ const maxHandler = await DSSliderV2CO.getMinRangeMaxHandler();
19
+ await browser.keys(Key.Tab);
20
+ await browser.keys(Key.ArrowRight);
21
+ await browser.keys(Key.ArrowRight);
22
+ await browser.keys(Key.ArrowRight);
23
+ const valueMinAtLimit = await DSSliderV2CO.getSliderValue(minHandler);
24
+ // the next step would put the min handler on 100, closing the range below minRange
25
+ await browser.keys(Key.ArrowRight);
26
+ const valueMinAfter = await DSSliderV2CO.getSliderValue(minHandler);
27
+ const valueMaxAfter = await DSSliderV2CO.getSliderValue(maxHandler);
28
+ await expect(valueMinAtLimit).toEqual('75');
29
+ await expect(valueMinAfter).toEqual('75');
30
+ await expect(valueMaxAfter).toEqual('100');
31
+ await expect(minHandler).toBeFocused();
32
+ });
33
+
34
+ it('02: should not let the max handler close the gap below minRange (with KB)', async () => {
35
+ const minHandler = await DSSliderV2CO.getMinRangeMinHandler();
36
+ const maxHandler = await DSSliderV2CO.getMinRangeMaxHandler();
37
+ await browser.keys(Key.Tab);
38
+ await browser.keys(Key.ArrowLeft);
39
+ const valueMinAfter = await DSSliderV2CO.getSliderValue(minHandler);
40
+ const valueMaxAfter = await DSSliderV2CO.getSliderValue(maxHandler);
41
+ await expect(valueMinAfter).toEqual('75');
42
+ await expect(valueMaxAfter).toEqual('100');
43
+ await expect(maxHandler).toBeFocused();
44
+ });
45
+
46
+ it('03: should move the min handler back to the start of the track (with KB)', async () => {
47
+ const minHandler = await DSSliderV2CO.getMinRangeMinHandler();
48
+ const maxHandler = await DSSliderV2CO.getMinRangeMaxHandler();
49
+ // the min handler travels freely while the gap allows it, leaving the range fully open
50
+ await browser.keys([Key.Shift, Key.Tab]);
51
+ await browser.keys(Key.ArrowLeft);
52
+ await browser.keys(Key.ArrowLeft);
53
+ await browser.keys(Key.ArrowLeft);
54
+ const valueMinAfter = await DSSliderV2CO.getSliderValue(minHandler);
55
+ const valueMaxAfter = await DSSliderV2CO.getSliderValue(maxHandler);
56
+ await expect(valueMinAfter).toEqual('0');
57
+ await expect(valueMaxAfter).toEqual('100');
58
+ });
59
+
60
+ // Pointer coverage is deliberately NOT part of this describe. Dragging a handler on a multiple
61
+ // slider currently runs into the known defects tracked in PUI-18876: a handler sitting on the
62
+ // right-most position cannot be actuated with the mouse (item 2) and a drag leaves no thumb
63
+ // focused (item 4). Asserting around those would either encode the broken behavior or produce a
64
+ // test that fails for reasons unrelated to minRange.
65
+ // The minRange guard itself lives in the `handleOnChange` of MainContent and filters the change
66
+ // regardless of the input device, so the keyboard cases above fully cover the contract.
67
+ // Mouse dragging on a multiple slider stays covered by PUI-12328.
68
+ });
69
+ }
@@ -12,7 +12,7 @@ import DSTabButtonCO from './DSTabButtonCO';
12
12
  });
13
13
  }
14
14
  */
15
- describe('PUI-XXXX - TabButton:: example test - data-testid exists', () => {
15
+ describe.skip('PUI-XXXX - TabButton:: example test - data-testid exists', () => {
16
16
  before('loading page', async () => {
17
17
  const errorOnGo = await DSTabButtonCO.basic.go();
18
18
  if (errorOnGo) throw errorOnGo;
@@ -60,6 +60,8 @@ export default class DSTabsCO extends PageObject {
60
60
 
61
61
  static allTabsDisabled = new Urlbuilder(PATH_E2E_TABS, 'all-tabs-disabled');
62
62
 
63
+ static withNotificationBadge = new Urlbuilder(PATH_E2E_TABS, 'with-notification-badge-test');
64
+
63
65
  static getUrl(component = 'basic') {
64
66
  return PageObject.getUrl(PATH_E2E_TABS, component);
65
67
  }
@@ -102,6 +104,8 @@ export default class DSTabsCO extends PageObject {
102
104
 
103
105
  static getTabByName = async (name) => $(`button*=${name}`);
104
106
 
107
+ static getTabBadges = async () => (await this.getTabsList()).$$('[data-testid="ds-notification-badge"]');
108
+
105
109
  // Snapshots
106
110
  static snapshotPath(example = 'basic') {
107
111
  return PageObject.getSnapshotPathBuilder('Tabs', example);
@@ -0,0 +1,28 @@
1
+ import DSTabsCO from '../DSTabsCO';
2
+ import { axeCoreCheck } from '../../helpers';
3
+
4
+ if (
5
+ (!browser.capabilities['ice:options'].isPhone &&
6
+ !browser.capabilities['ice:options'].isTablet &&
7
+ browser.capabilities.browserName === 'chrome') ||
8
+ browser.capabilities.browserName === 'Chrome'
9
+ ) {
10
+ describe('PUI-18932 - DSTabs:: notification badge tab list a11y scan - Axe-Core', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSTabsCO.withNotificationBadge.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should have no violations with the badged tab selected', async () => {
17
+ await (await DSTabsCO.getTabsList()).waitForDisplayed();
18
+ const result = await axeCoreCheck();
19
+ await expect(result).toHaveLength(0);
20
+ });
21
+
22
+ it('02: should have no violations after switching to a tab without a badge', async () => {
23
+ await (await DSTabsCO.getTabsByIndex(1)).click();
24
+ const result = await axeCoreCheck();
25
+ await expect(result).toHaveLength(0);
26
+ });
27
+ });
28
+ }
@@ -0,0 +1,51 @@
1
+ import DSTabsCO from '../DSTabsCO';
2
+ import DSNotificationBadgeCO from '../../ds-notification-badge/DSNotificationBadgeCO';
3
+
4
+ if (
5
+ (!browser.capabilities['ice:options'].isPhone &&
6
+ !browser.capabilities['ice:options'].isTablet &&
7
+ browser.capabilities.browserName === 'chrome') ||
8
+ browser.capabilities.browserName === 'Chrome'
9
+ ) {
10
+ describe('PUI-18931 - DSTabs:: notification badge in the tab accessible name - Func', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSTabsCO.withNotificationBadge.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should expose a named badge into the tab name', async () => {
17
+ const badgedTab = await DSTabsCO.getTabsByIndex(0);
18
+ await badgedTab.waitForDisplayed();
19
+
20
+ const badge = await DSNotificationBadgeCO.getNotificationBadgeByIndex(0);
21
+ await expect(badge).toBeExisting();
22
+ await expect(badge).toHaveText('3');
23
+
24
+ const wrapper = await badge.parentElement();
25
+ await expect(wrapper).toHaveAttribute('role', 'img');
26
+ await expect(wrapper).toHaveAttribute('aria-label', '3 new notifications');
27
+
28
+ const computedName = await badgedTab.getComputedLabel();
29
+ expect(computedName).toMatch(/Fields Sent\s*3 new notifications/i);
30
+ expect(await badgedTab.getComputedRole()).toBe('tab');
31
+ });
32
+
33
+ it('02: should announce tabs without a badge by their title only', async () => {
34
+ const plainTab = await DSTabsCO.getTabsByIndex(1);
35
+ const plainName = await plainTab.getComputedLabel();
36
+ expect(plainName.trim()).toMatch(/^Fields Received$/i);
37
+ expect(plainName).not.toContain('3');
38
+
39
+ const badges = await DSTabsCO.getTabBadges();
40
+ await expect(badges).toHaveLength(1);
41
+ });
42
+
43
+ it('03: should keep the required tab announcing its Required indicator', async () => {
44
+ const requiredTab = await DSTabsCO.getTabsByIndex(3);
45
+ await expect(requiredTab).toHaveAttribute('data-required', 'true');
46
+
47
+ const requiredName = await requiredTab.getComputedLabel();
48
+ expect(requiredName).toMatch(/Required docs\s*Required/i);
49
+ });
50
+ });
51
+ }