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
@@ -0,0 +1,30 @@
1
+ import DSButtonV3CO from '../DSButtonV3CO';
2
+
3
+ // Tests the theme-driven font-family support shipped under PUI-18210
4
+ // (V3 buttons reuse the b1 typography base → typographyFontFamily → theme.fonts.default,
5
+ // falling back to proxima-nova). Theme-agnostic: uses a sentinel font, never the
6
+ // dsConsumer POC theme values, so it survives any future theme change.
7
+ if (
8
+ (!browser.capabilities['ice:options'].isPhone &&
9
+ !browser.capabilities['ice:options'].isTablet &&
10
+ browser.capabilities.browserName === 'chrome') ||
11
+ browser.capabilities.browserName === 'Chrome'
12
+ ) {
13
+ describe('PUI-18708 - DSButtonV3:: theme font-family wiring - Func', () => {
14
+ before('loading page', async () => {
15
+ const errorOnGo = await DSButtonV3CO.themeFontURL.go();
16
+ if (errorOnGo) throw errorOnGo;
17
+ });
18
+
19
+ it('01: should read font-family from theme with proxima-nova fallback', async () => {
20
+ const themed = await DSButtonV3CO.getThemedButton();
21
+ await themed.waitForDisplayed();
22
+ const themedFont = (await themed.getCSSProperty('font-family')).value.toLowerCase();
23
+ await expect(themedFont).toContain('sentinelfont');
24
+
25
+ const fallback = await DSButtonV3CO.getFallbackButton();
26
+ const fallbackFont = (await fallback.getCSSProperty('font-family')).value.toLowerCase();
27
+ await expect(fallbackFont).toContain('proxima-nova');
28
+ });
29
+ });
30
+ }
@@ -0,0 +1,54 @@
1
+ import DSCardCO from './DSCardCO';
2
+
3
+ if (
4
+ (!browser.capabilities['ice:options'].isPhone &&
5
+ !browser.capabilities['ice:options'].isTablet &&
6
+ browser.capabilities.browserName === 'chrome') ||
7
+ browser.capabilities.browserName === 'Chrome'
8
+ ) {
9
+ describe('PUI-18706 - Card V2, no native title attribute on container', () => {
10
+ before('loading page', async () => {
11
+ const errorOnGo = await DSCardCO.V2URL.go();
12
+ if (errorOnGo) throw errorOnGo;
13
+ });
14
+ it('01: the card container does not render a native title attribute', async () => {
15
+ const card = await DSCardCO.getCard();
16
+ const titleAttr = await card.getAttribute('title');
17
+ await expect(titleAttr).toBeNull();
18
+ });
19
+ it('02: the title still renders as visible header text', async () => {
20
+ const header = await DSCardCO.getCardHeader();
21
+ await expect(header).toBeDisplayed();
22
+ await expect(header).toHaveText(expect.stringContaining('Card Title'));
23
+ });
24
+ it('03: hovering inside the card never exposes the section name as a native tooltip', async () => {
25
+ const card = await DSCardCO.getCard();
26
+ await card.moveTo();
27
+ const sectionTitleTooltip = await card.$('[title="Card Title"]');
28
+ await expect(sectionTitleTooltip).not.toBeExisting();
29
+ });
30
+ });
31
+
32
+ describe('PUI-18724 - Card V1, no native title attribute on header', () => {
33
+ before('loading page', async () => {
34
+ const errorOnGo = await DSCardCO.button.go();
35
+ if (errorOnGo) throw errorOnGo;
36
+ });
37
+ it('01: the card header does not render a native title attribute', async () => {
38
+ const header = await DSCardCO.getV1CardHeader();
39
+ const titleAttr = await header.getAttribute('title');
40
+ await expect(titleAttr).toBeNull();
41
+ });
42
+ it('02: the title still renders as visible header text', async () => {
43
+ const header = await DSCardCO.getV1CardHeader();
44
+ await expect(header).toBeDisplayed();
45
+ await expect(header).toHaveText(expect.stringContaining('Loren ipsum dolor'));
46
+ });
47
+ it('03: hovering inside the card never exposes the section name as a native tooltip', async () => {
48
+ const header = await DSCardCO.getV1CardHeader();
49
+ await header.moveTo();
50
+ const sectionTitleTooltip = await header.$('[title="Loren ipsum dolor"]');
51
+ await expect(sectionTitleTooltip).not.toBeExisting();
52
+ });
53
+ });
54
+ }
@@ -0,0 +1,29 @@
1
+ import DSCardCO from './DSCardCO';
2
+
3
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
4
+ describe('PUI-18728 - DSCard:: V2 header title renders unchanged - Visual', () => {
5
+ before('loading page', async () => {
6
+ const errorOnGo = await DSCardCO.V2URL.go();
7
+ if (errorOnGo) throw errorOnGo;
8
+ const card = await DSCardCO.getCard();
9
+ await card.waitForDisplayed({ timeout: 5000 });
10
+ });
11
+ it('should render the V2 card header title unchanged', async () => {
12
+ const snapshot = await browser.checkSnapshot(DSCardCO.snapshotPath('cardv2-header-title'));
13
+ await expect(snapshot).toEqual(0);
14
+ });
15
+ });
16
+
17
+ describe('PUI-18729 - DSCard:: V1 header title renders unchanged - Visual', () => {
18
+ before('loading page', async () => {
19
+ const errorOnGo = await DSCardCO.button.go();
20
+ if (errorOnGo) throw errorOnGo;
21
+ const header = await DSCardCO.getV1CardHeader();
22
+ await header.waitForDisplayed({ timeout: 5000 });
23
+ });
24
+ it('should render the V1 card header title unchanged', async () => {
25
+ const snapshot = await browser.checkSnapshot(DSCardCO.snapshotPath('cardv1-header-title'));
26
+ await expect(snapshot).toEqual(0);
27
+ });
28
+ });
29
+ }
@@ -24,6 +24,8 @@ export default class DSCardCO extends PageObject {
24
24
 
25
25
  static slotsTest = new Urlbuilder(PATH_E2E_CARD, 'slots-test');
26
26
 
27
+ static detailSlotsTest = new Urlbuilder(PATH_E2E_CARD, 'detail-slots-test');
28
+
27
29
  static ucDetailCardLongTitleURL = new Urlbuilder(PATH_E2E_CARD, 'detail-card-long-title');
28
30
 
29
31
  static detailExpandableURL = new Urlbuilder(PATH_E2E_CARD, 'detail-expandable-test');
@@ -48,6 +50,10 @@ export default class DSCardCO extends PageObject {
48
50
  return $('[data-testid="em-ds-card-header"]');
49
51
  }
50
52
 
53
+ static async getV1CardHeader() {
54
+ return $('[data-testid="ds-card-header"]');
55
+ }
56
+
51
57
  static async getCardDetailContainer() {
52
58
  return $('[data-testid="card-detail-container"]');
53
59
  }
@@ -128,4 +134,48 @@ export default class DSCardCO extends PageObject {
128
134
  static async getCardNavigationTypeSlotByIndex(index = 0) {
129
135
  return $$('[data-dimsum-slot="dsCardnavigationType"]')[index];
130
136
  }
137
+
138
+ // DetailCard (ds-card-v1-detail) slots — PUI-15889.
139
+ // SELECTABLE (checkbox) and EXPAND_CONTENT_BUTTON (chevron) are nested Dimsum
140
+ // components, so the consumer slot name surfaces as data-dimsum-parent-slot on
141
+ // the inner root (input / button); the rest use data-dimsum-slot directly.
142
+ static async getDetailContainerSlot() {
143
+ return $('[data-dimsum-slot="dsCardv1detailContainer"]');
144
+ }
145
+
146
+ static async getDetailTitleSlot() {
147
+ return $('[data-dimsum-slot="dsCardv1detailTitle"]');
148
+ }
149
+
150
+ static async getDetailDescriptionSlot() {
151
+ return $('[data-dimsum-slot="dsCardv1detailDescription"]');
152
+ }
153
+
154
+ static async getDetailSelectableSlot() {
155
+ return $('[data-dimsum-parent-slot="dsCardv1detailSelectable"]');
156
+ }
157
+
158
+ static async getDetailExpandContentButtonSlot() {
159
+ return $('[data-dimsum-parent-slot="dsCardv1detailExpandContentButton"]');
160
+ }
161
+
162
+ static async getDetailExpandContentSlot() {
163
+ return $('[data-dimsum-slot="dsCardv1detailExpandContent"]');
164
+ }
165
+
166
+ static async getDetailSeparatorSlot() {
167
+ return $('[data-dimsum-slot="dsCardv1detailSeparator"]');
168
+ }
169
+
170
+ static async getDetailRightAddonSlot() {
171
+ return $('[data-dimsum-slot="dsCardv1detailRightAddon"]');
172
+ }
173
+
174
+ static async getDetailRightDescriptionSlot() {
175
+ return $('[data-dimsum-slot="dsCardv1detailRightDescription"]');
176
+ }
177
+
178
+ static async getDetailRightValueSlot() {
179
+ return $('[data-dimsum-slot="dsCardv1detailRightValue"]');
180
+ }
131
181
  }
@@ -0,0 +1,29 @@
1
+ // Tests for the fix introduced in PUI-15889 (DetailCard selectable/expandable slots).
2
+ import DSCardCO from '../DSCardCO';
3
+ import { axeCoreCheck } from '../../helpers';
4
+
5
+ if (
6
+ (!browser.capabilities['ice:options'].isPhone &&
7
+ !browser.capabilities['ice:options'].isTablet &&
8
+ browser.capabilities.browserName === 'chrome') ||
9
+ browser.capabilities.browserName === 'Chrome'
10
+ ) {
11
+ describe('PUI-18691 - Card:: DetailCard slot attribute injection - Axe-Core', () => {
12
+ before(async () => {
13
+ const errorOnGo = await DSCardCO.detailSlotsTest.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ });
16
+
17
+ it('01: should have no accessibility violations with slot customizations', async () => {
18
+ await (await DSCardCO.getDetailContainerSlot()).waitForDisplayed();
19
+ // The slots story injects synthetic aria-labels onto every slot to prove
20
+ // attribute pass-through — including decorative elements (the description
21
+ // <p>, the right-side Grid <div>s) whose role prohibits aria-label. That is
22
+ // a test probe, not real consumer usage, so aria-prohibited-attr is disabled
23
+ // here — the same rationale axeCoreCheck already uses to disable valid-lang
24
+ // for the synthetic lang codes these slots tests inject.
25
+ const result = await axeCoreCheck({ extraDisabledRules: ['aria-prohibited-attr'] });
26
+ expect(result.length).toBe(0);
27
+ });
28
+ });
29
+ }
@@ -0,0 +1,72 @@
1
+ /* eslint-disable max-statements */
2
+ // Tests for the fix introduced in PUI-15889 (DetailCard selectable/expandable slots).
3
+ // Verifies consumer slot function props thread aria-label / data-testid / lang through
4
+ // to each DetailCard slot, including the checkbox (SELECTABLE) and chevron
5
+ // (EXPAND_CONTENT_BUTTON) sub-components that previously could not be addressed.
6
+ import DSCardCO from '../DSCardCO';
7
+
8
+ if (
9
+ (!browser.capabilities['ice:options'].isPhone &&
10
+ !browser.capabilities['ice:options'].isTablet &&
11
+ browser.capabilities.browserName === 'chrome') ||
12
+ browser.capabilities.browserName === 'Chrome'
13
+ ) {
14
+ describe('PUI-18689 - Card:: DetailCard slot attribute injection - Func', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSCardCO.detailSlotsTest.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: should have custom aria-label for each slot', async () => {
21
+ await (await DSCardCO.getDetailContainerSlot()).waitForDisplayed();
22
+ await expect(await DSCardCO.getDetailContainerSlot()).toHaveAttribute('aria-label', 'container aria');
23
+ await expect(await DSCardCO.getDetailTitleSlot()).toHaveAttribute('aria-label', 'title aria');
24
+ await expect(await DSCardCO.getDetailDescriptionSlot()).toHaveAttribute('aria-label', 'description aria');
25
+ await expect(await DSCardCO.getDetailSelectableSlot()).toHaveAttribute('aria-label', 'selectable aria');
26
+ await expect(await DSCardCO.getDetailExpandContentButtonSlot()).toHaveAttribute(
27
+ 'aria-label',
28
+ 'expand content button aria',
29
+ );
30
+ await expect(await DSCardCO.getDetailExpandContentSlot()).toHaveAttribute('aria-label', 'expand content aria');
31
+ await expect(await DSCardCO.getDetailSeparatorSlot()).toHaveAttribute('aria-label', 'separator aria');
32
+ await expect(await DSCardCO.getDetailRightAddonSlot()).toHaveAttribute('aria-label', 'right addon aria');
33
+ await expect(await DSCardCO.getDetailRightDescriptionSlot()).toHaveAttribute(
34
+ 'aria-label',
35
+ 'right description aria',
36
+ );
37
+ await expect(await DSCardCO.getDetailRightValueSlot()).toHaveAttribute('aria-label', 'right value aria');
38
+ });
39
+
40
+ it('02: should have custom data-testid for each slot', async () => {
41
+ await expect(await DSCardCO.getDetailContainerSlot()).toHaveAttribute('data-testid', 'container data');
42
+ await expect(await DSCardCO.getDetailTitleSlot()).toHaveAttribute('data-testid', 'title data');
43
+ await expect(await DSCardCO.getDetailDescriptionSlot()).toHaveAttribute('data-testid', 'description data');
44
+ await expect(await DSCardCO.getDetailSelectableSlot()).toHaveAttribute('data-testid', 'selectable data');
45
+ await expect(await DSCardCO.getDetailExpandContentButtonSlot()).toHaveAttribute(
46
+ 'data-testid',
47
+ 'expand content button data',
48
+ );
49
+ await expect(await DSCardCO.getDetailExpandContentSlot()).toHaveAttribute('data-testid', 'expand content data');
50
+ await expect(await DSCardCO.getDetailSeparatorSlot()).toHaveAttribute('data-testid', 'separator data');
51
+ await expect(await DSCardCO.getDetailRightAddonSlot()).toHaveAttribute('data-testid', 'right addon data');
52
+ await expect(await DSCardCO.getDetailRightDescriptionSlot()).toHaveAttribute(
53
+ 'data-testid',
54
+ 'right description data',
55
+ );
56
+ await expect(await DSCardCO.getDetailRightValueSlot()).toHaveAttribute('data-testid', 'right value data');
57
+ });
58
+
59
+ it('03: should have custom lang for each slot', async () => {
60
+ await expect(await DSCardCO.getDetailContainerSlot()).toHaveAttribute('lang', 'es');
61
+ await expect(await DSCardCO.getDetailTitleSlot()).toHaveAttribute('lang', 'fr');
62
+ await expect(await DSCardCO.getDetailDescriptionSlot()).toHaveAttribute('lang', 'de');
63
+ await expect(await DSCardCO.getDetailSelectableSlot()).toHaveAttribute('lang', 'it');
64
+ await expect(await DSCardCO.getDetailExpandContentButtonSlot()).toHaveAttribute('lang', 'pt');
65
+ await expect(await DSCardCO.getDetailExpandContentSlot()).toHaveAttribute('lang', 'ja');
66
+ await expect(await DSCardCO.getDetailSeparatorSlot()).toHaveAttribute('lang', 'nl');
67
+ await expect(await DSCardCO.getDetailRightAddonSlot()).toHaveAttribute('lang', 'sv');
68
+ await expect(await DSCardCO.getDetailRightDescriptionSlot()).toHaveAttribute('lang', 'ko');
69
+ await expect(await DSCardCO.getDetailRightValueSlot()).toHaveAttribute('lang', 'en');
70
+ });
71
+ });
72
+ }
@@ -0,0 +1,19 @@
1
+ // Tests for the fix introduced in PUI-15889 (DetailCard selectable/expandable slots).
2
+ // Snapshots the DetailCard with per-slot styleOverrides applied via ThemeProvider,
3
+ // exercising the slot theming API end to end.
4
+ import DSCardCO from '../DSCardCO';
5
+
6
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
+ describe('PUI-18690 - Card:: DetailCard slot theming - Visual', () => {
8
+ before(async () => {
9
+ const errorOnGo = await DSCardCO.detailSlotsTest.go();
10
+ if (errorOnGo) throw errorOnGo;
11
+ });
12
+
13
+ it('01: should display the detail card with slot theming overrides', async () => {
14
+ await (await DSCardCO.getDetailContainerSlot()).waitForDisplayed();
15
+ const snapshot = await browser.percyCheckScreenshot(DSCardCO.snapshotPath('detail-slot-theming'));
16
+ await expect(snapshot).toEqual(0);
17
+ });
18
+ });
19
+ }
@@ -7,13 +7,17 @@ export default class DSCardV3CO extends PageObject {
7
7
  // URL's
8
8
  static accordionURL = new Urlbuilder(PATH_E2E_CARD_V3, 'accordion-test');
9
9
 
10
+ static accordionAriaURL = new Urlbuilder(PATH_E2E_CARD_V3, 'accordion-aria-test');
11
+
10
12
  static actionURL = new Urlbuilder(PATH_E2E_CARD_V3, 'action-test');
11
13
 
12
14
  static disabledURL = new Urlbuilder(PATH_E2E_CARD_V3, 'disabled-test');
13
15
 
14
16
  static dragAndDropURL = new Urlbuilder(PATH_E2E_CARD_V3, 'drag-and-drop-test');
15
17
 
16
- static multiActionURL = new Urlbuilder(PATH_E2E_CARD_V3, 'multi-action-test');
18
+ static multiActionURL = new Urlbuilder(PATH_E2E_CARD_V3, 'multiple-action-test');
19
+
20
+ static multipleControlURL = new Urlbuilder(PATH_E2E_CARD_V3, 'multiple-control-test');
17
21
 
18
22
  static multiSelectURL = new Urlbuilder(PATH_E2E_CARD_V3, 'multi-select-test');
19
23
 
@@ -29,6 +33,12 @@ export default class DSCardV3CO extends PageObject {
29
33
 
30
34
  static globalAttributesURL = new Urlbuilder(PATH_E2E_CARD_V3, 'global-attributes-test');
31
35
 
36
+ static variantDisabledURL = new Urlbuilder(PATH_E2E_CARD_V3, 'variant-disabled-test');
37
+
38
+ static variantAccentURL = new Urlbuilder(PATH_E2E_CARD_V3, 'variant-accented-test');
39
+
40
+ static variantAccentedDisabledURL = new Urlbuilder(PATH_E2E_CARD_V3, 'variant-accented-disabled-test');
41
+
32
42
  // selectors
33
43
  static async getActionAreaByIndex(index = 0) {
34
44
  return $$('[data-testid="ds-cardv3-action-area"]')[index];
@@ -90,6 +100,18 @@ export default class DSCardV3CO extends PageObject {
90
100
  return $('[data-testid="ds-button"][aria-label="Expand Card Content"]');
91
101
  }
92
102
 
103
+ static async getAccordionButton() {
104
+ return $('button[aria-expanded]');
105
+ }
106
+
107
+ static async getGroupContainer() {
108
+ return $('[role="group"]');
109
+ }
110
+
111
+ static async getRadioGroupContainer() {
112
+ return $('[role="radiogroup"]');
113
+ }
114
+
93
115
  static async getCardHandlerByIndex(index) {
94
116
  return $$('button[aria-label="drag and drop gripper"]')[index];
95
117
  }
@@ -116,4 +138,74 @@ export default class DSCardV3CO extends PageObject {
116
138
  static snapshotPath(example = 'basic') {
117
139
  return PageObject.getSnapshotPathBuilder('card-v3', example);
118
140
  }
141
+
142
+ static async getButtonByIndex(index) {
143
+ return $$('[data-testid="ds-button"]')[index];
144
+ }
145
+
146
+ static async getCardCheckBoxByIndex(index) {
147
+ return $$('[data-testid="ds-checkbox"]')[index];
148
+ }
149
+
150
+ static async getByRole() {
151
+ return $('div[role="img"][aria-label="3 new notifications"]');
152
+ }
153
+
154
+ static async getElement(index) {
155
+ return $$('[data-testid="ds-typography-element"]')[index];
156
+ }
157
+
158
+ static async getRadioButtonByIndex(index) {
159
+ return $$('[data-testid="ds-radio"]')[index];
160
+ }
161
+
162
+ static async getDnDLiveRegion() {
163
+ return $('[id^="DndLiveRegion"]');
164
+ }
165
+
166
+ static async getDnDInstructions() {
167
+ return $('[id^="DndDescribedBy"]');
168
+ }
169
+
170
+ static async getDnDLists() {
171
+ return $$('[role="list"]');
172
+ }
173
+
174
+ static async getDnDListByIndex(index = 0) {
175
+ return $$('[role="list"]')[index];
176
+ }
177
+
178
+ static async getDnDListItems() {
179
+ return $$('[role="listitem"]');
180
+ }
181
+
182
+ static async getElementById(id) {
183
+ return $(`#${id}`);
184
+ }
185
+
186
+ static async getCardByDataId(id) {
187
+ return $(`[data-id="${id}"]`);
188
+ }
189
+
190
+ static async getCardDataIdsByListIndex(index = 0) {
191
+ const list = await DSCardV3CO.getDnDListByIndex(index);
192
+ const cards = await list.$$('[data-id]');
193
+ return cards.map((card) => card.getAttribute('data-id'));
194
+ }
195
+
196
+ static async expectCardOrderInList(index, expectedOrder) {
197
+ let actualOrder = [];
198
+ await browser.waitUntil(
199
+ async () => {
200
+ actualOrder = await DSCardV3CO.getCardDataIdsByListIndex(index);
201
+ return JSON.stringify(actualOrder) === JSON.stringify(expectedOrder);
202
+ },
203
+ {
204
+ timeout: 5000,
205
+ timeoutMsg: `Expected list ${index} to be ordered ${JSON.stringify(expectedOrder)} but was ${JSON.stringify(
206
+ actualOrder,
207
+ )}`,
208
+ },
209
+ );
210
+ }
119
211
  }
@@ -0,0 +1,41 @@
1
+ import DSCardV3CO from '../DSCardV3CO';
2
+
3
+ if (
4
+ (!browser.capabilities['ice:options'].isPhone &&
5
+ !browser.capabilities['ice:options'].isTablet &&
6
+ browser.capabilities.browserName === 'chrome') ||
7
+ browser.capabilities.browserName === 'Chrome'
8
+ ) {
9
+ // Tests for the fix introduced in PUI-17887 (accordion heading/button/panel ARIA relationship)
10
+ describe('PUI-18597 - DSCardV3:: accordion ARIA structure - Func', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSCardV3CO.accordionAriaURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: button and panel have correct ARIA relationship (controls, labelledby, region, h3 container)', async () => {
17
+ const button = await DSCardV3CO.getAccordionButton();
18
+ const panelId = await button.getAttribute('aria-controls');
19
+ expect(panelId).toBeTruthy();
20
+ const panel = await $(`#${panelId}`);
21
+ await expect(panel).toBeExisting();
22
+ const labelId = await button.getAttribute('aria-labelledby');
23
+ expect(labelId).toBeTruthy();
24
+ const title = await $(`#${labelId}`);
25
+ await expect(title).toBeExisting();
26
+ await expect(panel).toHaveAttribute('role', 'region');
27
+ const buttonId = await button.getAttribute('id');
28
+ await expect(panel).toHaveAttribute('aria-labelledby', buttonId);
29
+ const h3 = await $('h3');
30
+ const buttonInsideH3 = await h3.$('button');
31
+ await expect(buttonInsideH3).toBeExisting();
32
+ });
33
+
34
+ it('02: aria-expanded toggles from false to true after clicking the button', async () => {
35
+ const button = await DSCardV3CO.getAccordionButton();
36
+ await expect(button).toHaveAttribute('aria-expanded', 'false');
37
+ await button.click();
38
+ await expect(button).toHaveAttribute('aria-expanded', 'true');
39
+ });
40
+ });
41
+ }
@@ -0,0 +1,49 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSCardV3CO from '../DSCardV3CO';
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-18823 - DSCardV3:: accordion ARIA keyboard operation - Func', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSCardV3CO.accordionAriaURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should move focus to the accordion trigger as the first tab stop - [TAB]', async () => {
17
+ const trigger = await DSCardV3CO.getAccordionButton();
18
+ await trigger.waitForDisplayed();
19
+ await browser.keys(Key.Tab);
20
+
21
+ await expect(trigger).toBeFocused();
22
+ await expect(trigger).toHaveAttribute('aria-expanded', 'false');
23
+ });
24
+
25
+ it('02: should expand the panel and keep focus on the trigger - [ENTER]', async () => {
26
+ const trigger = await DSCardV3CO.getAccordionButton();
27
+ await browser.keys(Key.Enter);
28
+
29
+ await expect(trigger).toHaveAttribute('aria-expanded', 'true');
30
+ await expect(trigger).toBeFocused();
31
+ });
32
+
33
+ it('03: should collapse the panel and keep focus on the trigger - [SPACE]', async () => {
34
+ const trigger = await DSCardV3CO.getAccordionButton();
35
+ await browser.keys(Key.Space);
36
+
37
+ await expect(trigger).toHaveAttribute('aria-expanded', 'false');
38
+ await expect(trigger).toBeFocused();
39
+ });
40
+
41
+ it('04: should move focus from the trigger to the card actions button - [TAB]', async () => {
42
+ await browser.keys(Key.Tab);
43
+ const cardActions = await DSCardV3CO.getButtonByIndex(1);
44
+
45
+ await expect(cardActions).toBeFocused();
46
+ await expect(cardActions).toHaveAttribute('aria-label', 'Card actions');
47
+ });
48
+ });
49
+ }
@@ -0,0 +1,28 @@
1
+ import DSCardV3CO from '../DSCardV3CO';
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-18713 - Accordion, basic -AxeCore', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSCardV3CO.accordionURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+ it('01: should display the accordion closed and pass axecore test', async () => {
16
+ await (await DSCardV3CO.getAccordionButton()).waitForDisplayed();
17
+ const result = await axeCoreCheck();
18
+ await expect(result).toHaveLength(0);
19
+ });
20
+ it('02: should open the accordion and pass axecore test', async () => {
21
+ await (await DSCardV3CO.getAccordionButton()).click();
22
+ const getAccordionFirstElement = await DSCardV3CO.getElement(2);
23
+ await getAccordionFirstElement.waitForDisplayed();
24
+ const result = await axeCoreCheck();
25
+ await expect(result).toHaveLength(0);
26
+ });
27
+ });
28
+ }
@@ -7,15 +7,13 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
7
7
  if (errorOnGo) throw errorOnGo;
8
8
  });
9
9
  it('01: should display accordion card-v3 closed', async () => {
10
- await browser.eyesOpen();
11
- const snapshot = await browser.eyesCheckSnapshot(DSCardV3CO.snapshotPath('card-v3-closed'));
10
+ const snapshot = await browser.percyCheckScreenshot();
12
11
  await expect(snapshot).toEqual(0);
13
12
  });
14
13
  it('02: should display accordion card-v3 expanded', async () => {
15
- await browser.eyesOpen();
16
- const expandContentButton = await DSCardV3CO.getExpandContentButton();
17
- await expandContentButton.click();
18
- const snapshot = await browser.eyesCheckSnapshot(DSCardV3CO.snapshotPath('card-v3-expanded'));
14
+ const accordionButton = await DSCardV3CO.getAccordionButton();
15
+ await accordionButton.click();
16
+ const snapshot = await browser.percyCheckScreenshot();
19
17
  await expect(snapshot).toEqual(0);
20
18
  });
21
19
  });
@@ -0,0 +1,24 @@
1
+ import DSCardV3CO from '../DSCardV3CO';
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-18803 - DSCardV3:: action button card accessibility - Axe-Core', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSCardV3CO.actionURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should have no accessibility violations', async () => {
17
+ const card = await DSCardV3CO.getCardContainer();
18
+ await card.waitForDisplayed();
19
+
20
+ const result = await axeCoreCheck();
21
+ await expect(result).toHaveLength(0);
22
+ });
23
+ });
24
+ }
@@ -0,0 +1,53 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSCardV3CO from '../DSCardV3CO';
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-18802 - DSCardV3:: action button structure and keyboard focus - Func', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSCardV3CO.actionURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should render the card root, header, title, subtitle and a single action button', async () => {
17
+ const card = await DSCardV3CO.getCardContainer();
18
+ await card.waitForDisplayed();
19
+
20
+ const header = await DSCardV3CO.getCardHeader();
21
+ await expect(header).toBeDisplayed();
22
+
23
+ const title = await DSCardV3CO.getElement(0);
24
+ await expect(title).toBeDisplayed();
25
+ await expect(title).toHaveText('Card Title');
26
+ await expect(await title.getTagName()).toBe('h3');
27
+
28
+ const subtitle = await DSCardV3CO.getElement(1);
29
+ await expect(subtitle).toBeDisplayed();
30
+ await expect(subtitle).toHaveText('Card Subtitle');
31
+
32
+ const deleteAction = await DSCardV3CO.getButtonByIndex(0);
33
+ await expect(deleteAction).toBeDisplayed();
34
+ await expect(deleteAction).toHaveAttribute('aria-label', 'Delete Action');
35
+ await expect(deleteAction).toHaveAttribute('type', 'button');
36
+
37
+ const actionButtons = await $$('[data-testid="ds-button"]');
38
+ await expect(actionButtons).toBeElementsArrayOfSize(1);
39
+ });
40
+
41
+ it('02: should move focus to the action button - [TAB]', async () => {
42
+ await browser.keys(Key.Tab);
43
+ const deleteAction = await DSCardV3CO.getButtonByIndex(0);
44
+ await expect(deleteAction).toBeFocused();
45
+ });
46
+
47
+ it('03: should move focus away from the action button - [SHIFT+TAB]', async () => {
48
+ await browser.keys([Key.Shift, Key.Tab]);
49
+ const deleteAction = await DSCardV3CO.getButtonByIndex(0);
50
+ await expect(deleteAction).not.toBeFocused();
51
+ });
52
+ });
53
+ }