dimsum-e2e-tests 3.70.0-next.6 → 3.70.0-next.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +300 -0
- package/ds-accordion/DSAccordion.visual.spec.js +6 -0
- package/ds-accordion/DSAccordionCO.js +15 -3
- package/ds-accordion/QA_NOTES.md +105 -0
- package/ds-accordion/controlled/DSAccordion.controlled.func.spec.js +23 -0
- package/ds-accordion/header-structure/DSAccordion.header-structure.func.spec.js +65 -0
- package/ds-accordion/input-inside/DSAccordion.input-inside.func.spec.js +19 -0
- package/ds-apppicker/DSAppPickerCO.js +1 -1
- package/ds-apppicker/truncation/DSAppPicker.truncation.visual.spec.js +5 -9
- package/ds-autocomplete/DSAutocomplete.visual.spec.js +34 -0
- package/ds-autocomplete/DSAutocompleteCO.js +36 -1
- package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.axe-core.func.spec.js +50 -0
- package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.func.spec.js +122 -0
- package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.visual.spec.js +48 -0
- package/ds-autocomplete/slots/DSAutocomplete.slots.func.spec.js +6 -1
- package/ds-button-v3/DSButtonV3.aria-disabled-attribute.func.spec.js +33 -0
- package/ds-button-v3/DSButtonV3CO.js +10 -0
- package/ds-button-v3/theme-font/DSButtonV3.theme-font.func.spec.js +30 -0
- package/ds-card/DSCard.cardv2_v1.func.spec.js +54 -0
- package/ds-card/DSCard.cardv2_v1.visual.spec.js +29 -0
- package/ds-card/DSCardCO.js +50 -0
- package/ds-card/detail-slots/DSCard.detail-slots.axe-core.func.spec.js +29 -0
- package/ds-card/detail-slots/DSCard.detail-slots.func.spec.js +72 -0
- package/ds-card/detail-slots/DSCard.detail-slots.visual.spec.js +19 -0
- package/ds-card-v3/DSCardV3CO.js +93 -1
- package/ds-card-v3/accordion/DSCardV3.accordion-aria-structure.func.spec.js +41 -0
- package/ds-card-v3/accordion/DSCardV3.accordion-aria.keyboard.func.spec.js +49 -0
- package/ds-card-v3/accordion/DSCardV3.accordion.axe-core.func.spec.js +28 -0
- package/ds-card-v3/accordion/DSCardV3.accordion.visual.spec.js +4 -6
- package/ds-card-v3/action/DSCardV3.action.axe-core.func.spec.js +24 -0
- package/ds-card-v3/action/DSCardV3.action.func.spec.js +53 -0
- package/ds-card-v3/action/DSCardV3.action.visual.spec.js +28 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.axe-core.func.spec.js +42 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.func.spec.js +129 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.reorder.func.spec.js +73 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.visual.spec.js +5 -12
- package/ds-card-v3/global-attributes/DSCardV3.global-attributes.axe-core.func.spec.js +33 -0
- package/ds-card-v3/global-attributes/DSCardV3.global-attributes.visual.spec.js +20 -0
- package/ds-card-v3/multi-select/DSCardV3.multi-select.aria-grouping.func.spec.js +24 -0
- package/ds-card-v3/multi-select/DSCardV3.multiselect.axe-core.func.spec.js +47 -0
- package/ds-card-v3/multi-select/DSCardV3.multiselect.keyboard.func.spec.js +65 -0
- package/ds-card-v3/multi-select/DSCardV3.multiselect.visual.spec.js +17 -0
- package/ds-card-v3/multiple-action/DSCardV3.multiple-action.axe-core.func.spec.js +35 -0
- package/ds-card-v3/multiple-action/DSCardV3.multiple-action.func.spec.js +53 -0
- package/ds-card-v3/multiple-action/DSCardV3.multiple-action.visual.spec.js +18 -0
- package/ds-card-v3/multiple-control/DSCardV3.multi-control.axe-core.func.spec.js +34 -0
- package/ds-card-v3/multiple-control/DSCardV3.multi-control.func.spec.js +26 -0
- package/ds-card-v3/multiple-control/DSCardV3.multi-control.visual.spec.js +29 -0
- package/ds-card-v3/no-action/DSCardV3.no-action.axe-core.func.spec.js +22 -0
- package/ds-card-v3/no-action/DSCardV3.no-action.func.spec.js +23 -0
- package/ds-card-v3/no-action/DSCardV3.no-action.visual.spec.js +15 -0
- package/ds-card-v3/notification-badges/DSCardV3.notification-badges.axe-core.func.spec.js +33 -0
- package/ds-card-v3/notification-badges/DSCardV3.notification-badges.func.spec.js +19 -0
- package/ds-card-v3/notification-badges/DSCardV3.notification-badges.visual.spec.js +28 -0
- package/ds-card-v3/reflow/DSCardV3.reflow.axe-core.func.spec.js +28 -0
- package/ds-card-v3/reflow/DSCardV3.reflow.func.spec.js +36 -0
- package/ds-card-v3/reflow/DSCardV3.reflow.visual.spec.js +1 -2
- package/ds-card-v3/single-select/DSCardV3.single-select.aria-grouping.func.spec.js +24 -0
- package/ds-card-v3/single-select/DSCardV3.single-select.axe-core.func.spec.js +37 -0
- package/ds-card-v3/single-select/DSCardV3.single-select.visual.spec.js +1 -2
- package/ds-card-v3/slots/DSCardV3.slots.visual.spec.js +1 -2
- package/ds-card-v3/variant-accented/DSCardV3.variant-accented.axe-core.func.spec.js +45 -0
- package/ds-card-v3/variant-accented/DSCardV3.variant-accented.func.spec.js +28 -0
- package/ds-card-v3/variant-accented/DSCardV3.variant-accented.visual.spec.js +35 -0
- package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.axe-core.func.spec.js +35 -0
- package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.func.spec.js +53 -0
- package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.visual.spec.js +28 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.axe-core.func.spec.js +22 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.func.spec.js +61 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.visual.spec.js +20 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variantDisabled-non-interactive.func.spec.js +25 -0
- package/ds-chat/DSChat.axe-core.func.spec.js +2 -2
- package/ds-chat/DSChat.visual.spec.js +4 -4
- package/ds-chat/DSChatCO.js +18 -24
- package/ds-chat/bubbles/slots/DSChatBubble.slots.axe-core.func.spec.js +24 -0
- package/ds-chat/bubbles/slots/DSChatBubble.slots.func.spec.js +49 -0
- package/ds-chat/bubbles/slots/DSChatBubble.slots.visual.spec.js +25 -0
- package/ds-chat/card/slots/DSChatCard.slots.axe-core.func.spec.js +24 -0
- package/ds-chat/card/slots/DSChatCard.slots.func.spec.js +47 -0
- package/ds-chat/card/slots/DSChatCard.slots.visual.spec.js +18 -0
- package/ds-chat/card/truncated-text/DSChatCard.truncated-text.func.spec.js +32 -0
- package/ds-chat/card/truncated-text/DSChatCard.truncated-text.visual.spec.js +26 -0
- package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.axe-core.func.spec.js +23 -0
- package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.visual.spec.js +17 -0
- package/ds-chat/components/BubbleCO.js +46 -3
- package/ds-chat/components/CardCO.js +75 -0
- package/ds-chat/components/ComposerCO.js +6 -6
- package/ds-chat/components/FloatingButtonCO.js +5 -3
- package/ds-chat/components/HeaderCO.js +2 -2
- package/ds-chat/components/TileCO.js +82 -0
- package/ds-chat/components/index.js +3 -2
- package/ds-chat/floatingbutton/DSChat-floating-button.visual.spec.js +1 -1
- package/ds-chat/loadmore/DSChat-loadmore.func.spec.js +1 -1
- package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.axe-core.func.spec.js +2 -2
- package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.func.spec.js +1 -1
- package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.visual.spec.js +2 -2
- package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.axe-core.func.spec.js +2 -2
- package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.visual.spec.js +1 -1
- package/ds-chat/tile/slots/DSChatTile.slots.func.spec.js +53 -0
- package/ds-chat/tile/slots/DSChatTile.slots.visual.spec.js +18 -0
- package/ds-controlled-form/ds-combobox/DSComboboxCO.js +2 -2
- package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable-tooltip.func.spec.js +47 -0
- package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable.visual.spec.js +12 -21
- package/ds-controlled-form/ds-combobox/disabled/DSCombobox.disabled.visual.spec.js +6 -1
- package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.axe-core.basic.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.basic.visual.spec.js +56 -0
- package/ds-controlled-form/ds-controlled-checkbox/DSControlledCheckboxCO.js +15 -1
- package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.axe-core.disabled.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.disabled.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.axe-core.hasError.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.has-error.visual.spec.js +71 -1
- package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.axe-core.mixed.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.axe-core.read-only.func.spec.js +3 -3
- package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.read-only.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.axe-core.with-tooltip.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.with-tooltip.visual.spec.js +1 -3
- package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.axe-core.wrap-label.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.wrap-label.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.aria-disabled.visual.spec.js +2 -6
- package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.axe-core.aria-disabled.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/theme-font/DSControlledCheckbox.theme-font.func.spec.js +30 -0
- package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.axe-core.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-inputgroup/DSControlledInputGroupCO.js +1 -1
- package/ds-controlled-form/ds-controlled-radio/DSControlledRadioCO.js +10 -0
- package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.axe-core.func.spec.js +16 -2
- package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.func.spec.js +37 -0
- package/ds-controlled-form/ds-controlled-radio/theme-font/DSControlledRadio.theme-font.func.spec.js +30 -0
- package/ds-controlled-form/react-hook-form/ReactHook.func.spec.js +1 -3
- package/ds-data-table-async/DSDataTableCO.js +189 -12
- package/ds-data-table-async/basic/DSDataTable.basic.visual.spec.js +1 -1
- package/ds-data-table-async/components/FilterBarCO.js +7 -0
- package/ds-data-table-async/components/FiltersCO.js +1 -1
- package/ds-data-table-async/components/HeaderCO.js +45 -1
- package/ds-data-table-async/dnd/DSDataTable.dnd-keyboard-scroll.func.spec.js +51 -0
- package/ds-data-table-async/filter-menu-close/DSDataTable.filter-menu-close.func.spec.js +77 -0
- package/ds-data-table-async/filter-popover-boundary/DSDataTable.filter-popover-boundary.func.spec.js +98 -0
- package/ds-data-table-async/filters/DSDataTable.filters-creatable-active-descendant.func.spec.js +51 -0
- package/ds-data-table-async/filters/DSDataTable.filters-creatable.func.spec.js +39 -0
- package/ds-data-table-async/filters/DSDataTable.filters.axe-core.func.spec.js +11 -9
- package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatablemultiselect.keyboard.func.spec.js +2 -2
- package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatableselect.keyboard.func.spec.js +2 -2
- package/ds-data-table-async/filtersV2/DSDataTable.filtersV2.axe-core.func.spec.js +45 -29
- package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.axe-core.func.spec.js +23 -0
- package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.func.spec.js +50 -0
- package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.visual.spec.js +21 -0
- package/ds-data-table-async/header-affordances/DSDataTable.header-affordances.func.spec.js +92 -0
- package/ds-data-table-async/helpers/getInputSelection.js +6 -0
- package/ds-data-table-async/helpers/index.js +1 -0
- package/ds-data-table-async/keyboard-scroll/DSDataTable.keyboard-scroll.func.spec.js +39 -0
- package/ds-data-table-async/menubutton/DSDataTable.MenuButton.keyboard.func.spec.js +8 -7
- package/ds-data-table-async/menubutton/DSDataTable.MenuButton.mouse.func.spec.js +6 -7
- package/ds-data-table-async/pagination/DSDataTable.pagination.func.spec.js +3 -2
- package/ds-data-table-async/resizable/DSDataTable.resize-min-clamp.func.spec.js +72 -0
- package/ds-data-table-async/resizable/DSDataTable.resizerA11y.axe-core.func.spec.js +43 -0
- package/ds-data-table-async/resizable/DSDataTable.resizerA11y.func.spec.js +92 -0
- package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.axe-core.func.spec.js +23 -0
- package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.visual.spec.js +106 -0
- package/ds-data-table-async/textwrapping/DSDataTable.text-wrap-toolbar.visual.spec.js +27 -0
- package/ds-data-table-async/toggle-cell-focus/DSDataTable.toggle-cell-enter-focus.func.spec.js +31 -0
- package/ds-data-table-async/vissibility/DSDataTable.vissibility.visual.spec.js +2 -0
- package/ds-dataviz/DSDataVizCO.js +2 -0
- package/ds-dataviz/axecore/DSDataViz.axis.axe-core.func.spec.js +1 -1
- package/ds-floating-context/DSFloatingContextCO.js +10 -0
- package/ds-floating-context/placement/DSFloatingContext.placement.visual.spec.js +48 -0
- package/ds-form-combobox-multi/DSComboboxMultiCO.js +22 -3
- package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.axe-core.func.spec.js +55 -0
- package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.func.spec.js +57 -0
- package/ds-form-combobox-multi/aria-disabled/DSComboboxMulti.aria-disabled.visual.spec.js +15 -0
- package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.axe-core.func.spec.js +24 -0
- package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.visual.spec.js +22 -0
- package/ds-form-combobox-multi/grouped/DSComboboxMulti.grouped.visual.spec.js +42 -0
- package/ds-form-combobox-multi/inline/DSComboboxMulti.inline.visual.spec.js +21 -0
- package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.func.spec.js +59 -0
- package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.visual.spec.js +39 -0
- package/ds-form-combobox-multi/skeleton/DSComboboxMulti.skeleton.visual.spec.js +25 -0
- package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.axe-core.func.spec.js +39 -0
- package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.func.spec.js +39 -0
- package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.visual.spec.js +29 -0
- package/ds-form-combobox-single/DSComboboxSingleCO.js +15 -3
- package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.axe-core.func.spec.js +49 -0
- package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.func.spec.js +54 -0
- package/ds-form-combobox-single/aria-disabled/DSComboboxSingle.aria-disabled.visual.spec.js +18 -0
- package/ds-form-combobox-single/creatable/DSComboboxSingle.creatable.visual.spec.js +30 -0
- package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.axe-core.func.spec.js +24 -0
- package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.visual.spec.js +22 -0
- package/ds-form-combobox-single/grouped/DSComboboxSingle.grouped.visual.spec.js +45 -0
- package/ds-form-combobox-single/inline/DSComboboxSingle.inline.visual.spec.js +23 -0
- package/ds-form-combobox-single/skeleton/DSComboboxSingle.skeleton.visual.spec.js +25 -0
- package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.axe-core.func.spec.js +39 -0
- package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.func.spec.js +39 -0
- package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.visual.spec.js +29 -0
- package/ds-form-date-range-picker/DateRangePicker.axe-core.spec.js +5 -0
- package/ds-form-date-range-picker/DateRangePicker.functional.spec.js +80 -18
- package/ds-form-date-range-picker/DateRangePickerCO.js +13 -0
- package/ds-form-date-range-picker/date-segment-aria-labels/DateRangePicker.date-segment-aria-labels.func.spec.js +66 -0
- package/ds-form-date-range-picker/grouped-field-error-announcement/DateRangePicker.grouped-field-error-announcement.func.spec.js +59 -0
- package/ds-form-date-time-picker/DSControlledDateTimePickerCO.js +7 -0
- package/ds-form-date-time-picker/date-time-full/DateTimeFull.axe-core.func.spec.js +8 -1
- package/ds-form-date-time-picker/date-time-full/DateTimePicker.DateTimeFull.visual.spec.js +9 -0
- package/ds-form-date-time-picker/partial-date-open-focus/DateTimePicker.partial-date-open-focus.func.spec.js +45 -0
- package/ds-form-native-select/NativeSelect.axe-core.func.spec.js +39 -0
- package/ds-form-native-select/NativeSelect.visual.spec.js +33 -0
- package/ds-form-native-select/NativeSelectCO.js +6 -0
- package/ds-form-native-select/option-selection/NativeSelect.option-selection.func.spec.js +25 -0
- package/ds-form-toggle/DSToggle.func.spec.js +20 -23
- package/ds-form-toggle/DSToggleCO.js +11 -2
- package/ds-global-header/GlobalHeader.announcements.func.spec.js +27 -0
- package/ds-global-header/GlobalHeader.axe-core.func.spec.js +15 -15
- package/ds-global-header/GlobalHeader.func.spec.js +70 -1
- package/ds-global-header/GlobalHeaderCO.js +25 -1
- package/ds-hooks/DSHook.usetree.func.spec.js +3 -2
- package/ds-hooks/DSHookCO.js +1 -22
- package/ds-hooks/useFocusStack/DSHook.useFocusStack.func.spec.js +83 -0
- package/ds-hooks/useFocusTrap/UseFocusTrapCO.js +2 -0
- package/ds-hooks/useFocusTrap/UseFocusTrapToggle.func.spec.js +48 -0
- package/ds-hooks/useMask/Number/UseNumberMask.axe-core.func.spec.js +48 -0
- package/ds-leftnavigation/LeftNavigationCO.js +2 -2
- package/ds-menu-button/DSMenuButtonCO.js +23 -0
- package/ds-menu-button/slots/DSMenuButton.slots.axe-core.func.spec.js +28 -0
- package/ds-menu-button/slots/DSMenuButton.slots.func.spec.js +59 -0
- package/ds-menu-button/slots/DSMenuButton.slots.visual.spec.js +26 -0
- package/ds-modal-slide/ModalSlideCO.js +46 -0
- package/ds-modal-slide/custom-header/ModalSlide.customHeader.focusRing.visual.spec.js +2 -1
- package/ds-modal-slide/heading-level/ModalSlide.headingLevel.axe-core.func.spec.js +25 -0
- package/ds-modal-slide/heading-level/ModalSlide.headingLevel.func.spec.js +25 -0
- package/ds-modal-slide/slots/ModalSlide.slots.func.spec.js +74 -0
- package/ds-modal-slide/slots/ModalSlide.slots.visual.spec.js +27 -0
- package/ds-notification-badge/DSNotificationBadge.visual.spec.js +17 -20
- package/ds-page-layout/PageLayoutCO.js +4 -4
- package/ds-pills-v2/DSPillsV2CO.js +12 -0
- package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.func.spec.js +53 -0
- package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.visual.spec.js +26 -0
- package/ds-pills-v2/disabled/DSPills.disabled.func.spec.js +53 -0
- package/ds-pills-v2/disabled/DSPills.disabled.visual.spec.js +33 -0
- package/ds-progress-indicator/DSProgressIndicator.axe-core.func.spec.js +2 -0
- package/ds-progress-indicator/DSProgressIndicatorCO.js +1 -1
- package/ds-shuttle-v2/DSShuttleV2CO.js +15 -1
- package/ds-shuttle-v2/breadcrumb-a11y/DSShuttleV2.breadcrumb-a11y.func.spec.js +43 -0
- package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.func.spec.js +37 -0
- package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.visual.spec.js +30 -0
- package/ds-shuttle-v2/extra/DSShuttleV2.extra.visual.spec.js +8 -3
- package/ds-shuttle-v2/items/DSShuttleV2.items.func.spec.js +4 -2
- package/ds-shuttle-v2/skipped/DSShuttleV2.extra.axe-core.skipped.js +1 -1
- package/ds-shuttle-v2/skipped/DSShuttleV2.filter.axe-core.skipped.js +1 -1
- package/ds-shuttle-v2/skipped/DSShuttleV2.globalcheckbox.axe-core.skipped.js +1 -1
- package/ds-shuttle-v2/skipped/DSShuttleV2.items.axe-core.skipped.js +3 -3
- package/ds-shuttle-v2/skipped/DSShuttleV2.skipped.js +5 -5
- package/ds-slider-v2/DSSliderV2.func.spec.js +36 -25
- package/ds-slider-v2/DSSliderV2CO.js +10 -0
- package/ds-slider-v2/min-range/DSSliderV2.min-range.func.spec.js +69 -0
- package/ds-tab-button/DSTabButton.func.spec.js +1 -1
- package/ds-tooltip-v3/DSTooltipV3CO.js +21 -0
- package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.axe-core.func.spec.js +23 -0
- package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.func.spec.js +29 -0
- package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.func.spec.js +45 -0
- package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.visual.spec.js +29 -0
- package/ds-treeview/DSTreeViewCO.js +25 -2
- package/ds-treeview/dragAndDrop/TreeView-dnd_keyboard.func.spec.js +96 -0
- package/ds-typography/DSTypographyCO.js +10 -0
- package/ds-typography/theme-font/DSTypography.theme-font.func.spec.js +30 -0
- package/package.json +150 -153
- package/paths.js +9 -6
- package/ds-card-v3/disabled/DSCardV3.disabled.visual.spec.js +0 -17
- package/ds-chat-tile/TileCO.js +0 -35
- package/ds-hooks/DSHook.func.spec.js +0 -60
- package/ds-hooks/useFocusStack/DSHook.useFocusStack.skipped.js +0 -57
- package/ds-treeview/dragAndDrop/TreeView-dnd_mouse.func.spec.js +0 -61
|
@@ -18,4 +18,38 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
18
18
|
await expect(snapshot).toEqual(0);
|
|
19
19
|
});
|
|
20
20
|
});
|
|
21
|
+
describe('PUI-17180 - Autocomplete:: Floating After Filtering -Visual', () => {
|
|
22
|
+
before('loading page', async () => {
|
|
23
|
+
const errorOnGo = await DSAutocompleteCO.floatingAfterFiltering.go();
|
|
24
|
+
if (errorOnGo) throw errorOnGo;
|
|
25
|
+
});
|
|
26
|
+
it('01: should display menu correctly - after filtering', async () => {
|
|
27
|
+
await browser.keys(Key.Tab);
|
|
28
|
+
await type('44444-');
|
|
29
|
+
const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
|
|
30
|
+
await menulist.waitForDisplayed({ timeout: 2000 });
|
|
31
|
+
const snapshot = await browser.percyCheckScreenshot(
|
|
32
|
+
DSAutocompleteCO.snapshotPath('autocomplete-floating-after-filtering'),
|
|
33
|
+
);
|
|
34
|
+
await expect(snapshot).toEqual(0);
|
|
35
|
+
});
|
|
36
|
+
it('02: should display menu correctly - after re filtering', async () => {
|
|
37
|
+
await type('6');
|
|
38
|
+
const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
|
|
39
|
+
await menulist.waitForDisplayed({ timeout: 2000 });
|
|
40
|
+
const snapshot = await browser.percyCheckScreenshot(
|
|
41
|
+
DSAutocompleteCO.snapshotPath('autocomplete-floating-after-re-filtering'),
|
|
42
|
+
);
|
|
43
|
+
await expect(snapshot).toEqual(0);
|
|
44
|
+
});
|
|
45
|
+
it('03: should display menu correctly - after backspace', async () => {
|
|
46
|
+
await browser.keys(Key.Backspace);
|
|
47
|
+
const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
|
|
48
|
+
await menulist.waitForDisplayed({ timeout: 2000 });
|
|
49
|
+
const snapshot = await browser.percyCheckScreenshot(
|
|
50
|
+
DSAutocompleteCO.snapshotPath('autocomplete-floating-after-backspace'),
|
|
51
|
+
);
|
|
52
|
+
await expect(snapshot).toEqual(0);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
21
55
|
}
|
|
@@ -12,6 +12,16 @@ export default class DSAutocompleteCO extends PageObject {
|
|
|
12
12
|
|
|
13
13
|
static sectionTitles = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'with-section-titles-test');
|
|
14
14
|
|
|
15
|
+
static floatingAfterFiltering = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'floating-after-filtering');
|
|
16
|
+
|
|
17
|
+
static loadingTest = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'loading-test');
|
|
18
|
+
|
|
19
|
+
static skeletonTest = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'skeleton-test');
|
|
20
|
+
|
|
21
|
+
static loadingInputProps = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'loading-input-props-test');
|
|
22
|
+
|
|
23
|
+
static skeletonInputProps = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'skeleton-input-props-test');
|
|
24
|
+
|
|
15
25
|
// Snapshots
|
|
16
26
|
static snapshotPath(example = 'basic') {
|
|
17
27
|
return PageObject.getSnapshotPathBuilder('Autocomplete', example);
|
|
@@ -35,8 +45,10 @@ export default class DSAutocompleteCO extends PageObject {
|
|
|
35
45
|
return $$('[data-dimsum-slot="dsAutocompleteContainer"]')[index];
|
|
36
46
|
}
|
|
37
47
|
|
|
48
|
+
// the option is a nested slot: the rendered element owns dsMenuitemMenuItemWrapper and carries the
|
|
49
|
+
// autocomplete slot on data-dimsum-parent-slot, which is where the custom attributes land
|
|
38
50
|
static async getOptionSlot(index = 0) {
|
|
39
|
-
return $$('[data-dimsum-slot="dsAutocompleteOption"]')[index];
|
|
51
|
+
return $$('[data-dimsum-parent-slot="dsAutocompleteOption"]')[index];
|
|
40
52
|
}
|
|
41
53
|
|
|
42
54
|
static async getInputSlot(index = 0) {
|
|
@@ -46,4 +58,27 @@ export default class DSAutocompleteCO extends PageObject {
|
|
|
46
58
|
static async getMenulistSlot(index = 0) {
|
|
47
59
|
return $$('[data-dimsum-slot="dsAutocompleteMenuList"]')[index];
|
|
48
60
|
}
|
|
61
|
+
|
|
62
|
+
// loading / skeleton (busy listbox) states
|
|
63
|
+
static async getLoadingListbox() {
|
|
64
|
+
return $('[data-testid="autocomplete-loading"]');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static async getLoadingIndicator() {
|
|
68
|
+
return $('[data-testid="ds-autocomplete-loading-indicator"]');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static async getSkeletonListbox() {
|
|
72
|
+
return $('[data-testid="autocomplete-skeleton"]');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static async getSkeletonMenuItems() {
|
|
76
|
+
return $$('[data-testid="ds-autocomplete-skeleton-menu-item"]');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// the input Autocomplete renders itself (onValueChange / inputProps API); the deprecated
|
|
80
|
+
// children API renders a consumer-owned DSInputText instead, which carries no autocomplete testid
|
|
81
|
+
static async getAutocompleteInput() {
|
|
82
|
+
return $('[data-testid="ds-autocomplete-input"]');
|
|
83
|
+
}
|
|
49
84
|
}
|
package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.axe-core.func.spec.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSAutocompleteCO from '../DSAutocompleteCO';
|
|
3
|
+
import { axeCoreCheck, type } from '../../helpers';
|
|
4
|
+
|
|
5
|
+
// Coverage for the loading state added in PUI-17137 ([Autocomplete] Add Support for Loading State).
|
|
6
|
+
// The busy listbox surfaces are the riskiest part for axe: role="listbox" normally requires option
|
|
7
|
+
// children (satisfied via aria-busy) and the spinner's role="status" is a forbidden listbox child
|
|
8
|
+
// (removed from the accessibility tree via aria-hidden). This spec guards both.
|
|
9
|
+
if (
|
|
10
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
11
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
12
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
13
|
+
browser.capabilities.browserName === 'Chrome'
|
|
14
|
+
) {
|
|
15
|
+
describe('PUI-18864 - DSAutocomplete:: busy listbox while isLoading -Axe-Core', () => {
|
|
16
|
+
before('loading page', async () => {
|
|
17
|
+
const errorOnGo = await DSAutocompleteCO.loadingTest.go();
|
|
18
|
+
if (errorOnGo) throw errorOnGo;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('01: should have no accessibility violations while the loading spinner is shown', async () => {
|
|
22
|
+
await browser.keys(Key.Tab);
|
|
23
|
+
await type('4');
|
|
24
|
+
|
|
25
|
+
const loading = await DSAutocompleteCO.getLoadingListbox();
|
|
26
|
+
await loading.waitForDisplayed();
|
|
27
|
+
|
|
28
|
+
const result = await axeCoreCheck();
|
|
29
|
+
expect(result.length).toBe(0);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('PUI-18865 - DSAutocomplete:: busy listbox while isSkeleton -Axe-Core', () => {
|
|
34
|
+
before('loading page', async () => {
|
|
35
|
+
const errorOnGo = await DSAutocompleteCO.skeletonTest.go();
|
|
36
|
+
if (errorOnGo) throw errorOnGo;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('01: should have no accessibility violations while the skeleton menu is shown', async () => {
|
|
40
|
+
await browser.keys(Key.Tab);
|
|
41
|
+
await type('4');
|
|
42
|
+
|
|
43
|
+
const skeleton = await DSAutocompleteCO.getSkeletonListbox();
|
|
44
|
+
await skeleton.waitForDisplayed();
|
|
45
|
+
|
|
46
|
+
const result = await axeCoreCheck();
|
|
47
|
+
expect(result.length).toBe(0);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSAutocompleteCO from '../DSAutocompleteCO';
|
|
3
|
+
import { type } from '../../helpers';
|
|
4
|
+
|
|
5
|
+
// Coverage for the loading state added in PUI-17137 ([Autocomplete] Add Support for Loading State).
|
|
6
|
+
// While options are being fetched the options array is still empty, so LoadingContainer /
|
|
7
|
+
// SkeletonContainer keep the popover open on their own and carry the canonical listbox id +
|
|
8
|
+
// role="listbox" + aria-busy + aria-label. Only one of skeleton / loading / options list is ever
|
|
9
|
+
// mounted at a time, so the listbox id is never duplicated in the DOM.
|
|
10
|
+
//
|
|
11
|
+
// The last two describes exercise the `onValueChange` + `inputProps` API, which is the only path
|
|
12
|
+
// where Autocomplete renders its own input and therefore wires role="combobox" + aria-expanded +
|
|
13
|
+
// aria-controls onto it. The deprecated `children` API (first two describes) renders a
|
|
14
|
+
// consumer-owned input that receives none of those attributes.
|
|
15
|
+
//
|
|
16
|
+
// Pure DOM-attribute assertions -> Chrome-only guard.
|
|
17
|
+
if (
|
|
18
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
19
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
20
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
21
|
+
browser.capabilities.browserName === 'Chrome'
|
|
22
|
+
) {
|
|
23
|
+
describe('PUI-18860 - DSAutocomplete:: busy listbox while isLoading -Func', () => {
|
|
24
|
+
before('loading page', async () => {
|
|
25
|
+
const errorOnGo = await DSAutocompleteCO.loadingTest.go();
|
|
26
|
+
if (errorOnGo) throw errorOnGo;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('01: should render a busy loading listbox and hide the options list', async () => {
|
|
30
|
+
await browser.keys(Key.Tab);
|
|
31
|
+
await type('4');
|
|
32
|
+
|
|
33
|
+
const loading = await DSAutocompleteCO.getLoadingListbox();
|
|
34
|
+
await loading.waitForDisplayed();
|
|
35
|
+
|
|
36
|
+
await expect(loading).toHaveAttribute('role', 'listbox');
|
|
37
|
+
await expect(loading).toHaveAttribute('aria-busy', 'true');
|
|
38
|
+
await expect(loading).toHaveAttribute('aria-label', 'Loading options please wait');
|
|
39
|
+
|
|
40
|
+
// the spinner exposes role="status", a forbidden child of role="listbox", so it must be
|
|
41
|
+
// removed from the accessibility tree while staying visible
|
|
42
|
+
const indicator = await DSAutocompleteCO.getLoadingIndicator();
|
|
43
|
+
await expect(indicator).toBeDisplayedInViewport();
|
|
44
|
+
await expect(indicator).toHaveAttribute('aria-hidden', 'true');
|
|
45
|
+
|
|
46
|
+
// only one of loading / skeleton / options list is mounted at a time
|
|
47
|
+
const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
|
|
48
|
+
await expect(menulist).not.toBeExisting();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('PUI-18861 - DSAutocomplete:: busy listbox while isSkeleton -Func', () => {
|
|
53
|
+
before('loading page', async () => {
|
|
54
|
+
const errorOnGo = await DSAutocompleteCO.skeletonTest.go();
|
|
55
|
+
if (errorOnGo) throw errorOnGo;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('01: should render a busy skeleton listbox with five presentational items', async () => {
|
|
59
|
+
await browser.keys(Key.Tab);
|
|
60
|
+
await type('4');
|
|
61
|
+
|
|
62
|
+
const skeleton = await DSAutocompleteCO.getSkeletonListbox();
|
|
63
|
+
await skeleton.waitForDisplayed();
|
|
64
|
+
|
|
65
|
+
await expect(skeleton).toHaveAttribute('role', 'listbox');
|
|
66
|
+
await expect(skeleton).toHaveAttribute('aria-busy', 'true');
|
|
67
|
+
await expect(skeleton).toHaveAttribute('aria-label', 'Loading options please wait');
|
|
68
|
+
|
|
69
|
+
const skeletonItems = await DSAutocompleteCO.getSkeletonMenuItems();
|
|
70
|
+
await expect(skeletonItems).toHaveLength(5);
|
|
71
|
+
// the count above is what pins SKELETON_AMOUNT; every item is rendered from the same JSX
|
|
72
|
+
// literal, so one sample is enough to prove role="presentation" reaches the DOM and keeps
|
|
73
|
+
// the busy listbox free of fake options
|
|
74
|
+
await expect(skeletonItems[2]).toHaveAttribute('role', 'presentation');
|
|
75
|
+
|
|
76
|
+
const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
|
|
77
|
+
await expect(menulist).not.toBeExisting();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('PUI-18862 - DSAutocomplete:: input aria-controls linkage while isLoading -Func', () => {
|
|
82
|
+
before('loading page', async () => {
|
|
83
|
+
const errorOnGo = await DSAutocompleteCO.loadingInputProps.go();
|
|
84
|
+
if (errorOnGo) throw errorOnGo;
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('01: should point the input aria-controls at the busy loading listbox', async () => {
|
|
88
|
+
await browser.keys(Key.Tab);
|
|
89
|
+
await type('4');
|
|
90
|
+
|
|
91
|
+
const loading = await DSAutocompleteCO.getLoadingListbox();
|
|
92
|
+
await loading.waitForDisplayed();
|
|
93
|
+
const loadingId = await loading.getAttribute('id');
|
|
94
|
+
|
|
95
|
+
const input = await DSAutocompleteCO.getAutocompleteInput();
|
|
96
|
+
await expect(input).toHaveAttribute('role', 'combobox');
|
|
97
|
+
await expect(input).toHaveAttribute('aria-expanded', 'true');
|
|
98
|
+
await expect(input).toHaveAttribute('aria-controls', loadingId);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe('PUI-18863 - DSAutocomplete:: input aria-controls linkage while isSkeleton -Func', () => {
|
|
103
|
+
before('loading page', async () => {
|
|
104
|
+
const errorOnGo = await DSAutocompleteCO.skeletonInputProps.go();
|
|
105
|
+
if (errorOnGo) throw errorOnGo;
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('01: should point the input aria-controls at the busy skeleton listbox', async () => {
|
|
109
|
+
await browser.keys(Key.Tab);
|
|
110
|
+
await type('4');
|
|
111
|
+
|
|
112
|
+
const skeleton = await DSAutocompleteCO.getSkeletonListbox();
|
|
113
|
+
await skeleton.waitForDisplayed();
|
|
114
|
+
const skeletonId = await skeleton.getAttribute('id');
|
|
115
|
+
|
|
116
|
+
const input = await DSAutocompleteCO.getAutocompleteInput();
|
|
117
|
+
await expect(input).toHaveAttribute('role', 'combobox');
|
|
118
|
+
await expect(input).toHaveAttribute('aria-expanded', 'true');
|
|
119
|
+
await expect(input).toHaveAttribute('aria-controls', skeletonId);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSAutocompleteCO from '../DSAutocompleteCO';
|
|
3
|
+
import { type } from '../../helpers';
|
|
4
|
+
|
|
5
|
+
// Coverage for the loading state added in PUI-17137 ([Autocomplete] Add Support for Loading State).
|
|
6
|
+
// The acceptance criteria is the loading example from the InputText spec, so these snapshots pin the
|
|
7
|
+
// two menu appearances: the centered indeterminate spinner and the five skeleton menu items.
|
|
8
|
+
// Percy freezes CSS animations, so both the spinner rotation and the skeleton shimmer are captured
|
|
9
|
+
// deterministically.
|
|
10
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
11
|
+
describe('PUI-18866 - DSAutocomplete:: loading spinner menu -Visual', () => {
|
|
12
|
+
before('loading page', async () => {
|
|
13
|
+
const errorOnGo = await DSAutocompleteCO.loadingTest.go();
|
|
14
|
+
if (errorOnGo) throw errorOnGo;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('01: should display the loading spinner centered in the menu', async () => {
|
|
18
|
+
await browser.keys(Key.Tab);
|
|
19
|
+
await type('4');
|
|
20
|
+
|
|
21
|
+
const loading = await DSAutocompleteCO.getLoadingListbox();
|
|
22
|
+
await loading.waitForDisplayed();
|
|
23
|
+
|
|
24
|
+
const snapshot = await browser.percyCheckScreenshot(
|
|
25
|
+
DSAutocompleteCO.snapshotPath('autocomplete-loading-spinner-menu'),
|
|
26
|
+
);
|
|
27
|
+
await expect(snapshot).toEqual(0);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('PUI-18867 - DSAutocomplete:: skeleton menu items -Visual', () => {
|
|
32
|
+
before('loading page', async () => {
|
|
33
|
+
const errorOnGo = await DSAutocompleteCO.skeletonTest.go();
|
|
34
|
+
if (errorOnGo) throw errorOnGo;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('01: should display five skeleton menu items in the menu', async () => {
|
|
38
|
+
await browser.keys(Key.Tab);
|
|
39
|
+
await type('4');
|
|
40
|
+
|
|
41
|
+
const skeleton = await DSAutocompleteCO.getSkeletonListbox();
|
|
42
|
+
await skeleton.waitForDisplayed();
|
|
43
|
+
|
|
44
|
+
const snapshot = await browser.percyCheckScreenshot(DSAutocompleteCO.snapshotPath('autocomplete-skeleton-menu'));
|
|
45
|
+
await expect(snapshot).toEqual(0);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { Key } from 'webdriverio';
|
|
2
2
|
import DSAutocompleteCO from '../DSAutocompleteCO';
|
|
3
3
|
|
|
4
|
-
if (
|
|
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
|
+
) {
|
|
5
10
|
describe('PUI-17529 - Autocomplete:: Slots -Func', () => {
|
|
6
11
|
before('loading page', async () => {
|
|
7
12
|
const errorOnGo = await DSAutocompleteCO.slots.go();
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import DSButtonV3CO from './DSButtonV3CO';
|
|
2
|
+
|
|
3
|
+
// Tests for the fix introduced in PUI-17909:
|
|
4
|
+
// aria-disabled is no longer emitted as "false" on interactive buttons. A default (enabled) button
|
|
5
|
+
// carries no aria-disabled at all, and a native `disabled` button conveys its state via the native
|
|
6
|
+
// `disabled` attribute, so aria-disabled is intentionally absent there too (it was dropped from the
|
|
7
|
+
// emission condition, which is now applyAriaDisabled || readOnly).
|
|
8
|
+
// Both states already exist in the ShowcaseTest story (index 0 = enabled, index 3 = disabled).
|
|
9
|
+
// Pure DOM-attribute assertions produce identical results in every browser, so this runs Chrome-only.
|
|
10
|
+
if (
|
|
11
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
12
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
13
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
14
|
+
browser.capabilities.browserName === 'Chrome'
|
|
15
|
+
) {
|
|
16
|
+
describe('PUI-18796 - DSButtonV3:: aria-disabled absent on enabled and disabled buttons - Func', () => {
|
|
17
|
+
before('loading page', async () => {
|
|
18
|
+
const errorOnGo = await DSButtonV3CO.showcaseURL.go();
|
|
19
|
+
if (errorOnGo) throw errorOnGo;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('01: should not emit aria-disabled on enabled or native-disabled buttons', async () => {
|
|
23
|
+
// Enabled (default): aria-disabled must be entirely absent — the core PUI-17909 fix.
|
|
24
|
+
const enabled = await DSButtonV3CO.getButtonByIndex(0);
|
|
25
|
+
await expect(enabled).not.toHaveAttribute('aria-disabled');
|
|
26
|
+
|
|
27
|
+
// Native disabled: relies on the native `disabled` attribute, aria-disabled stays absent.
|
|
28
|
+
const disabled = await DSButtonV3CO.getButtonByIndex(3);
|
|
29
|
+
await expect(disabled).toHaveAttribute('disabled');
|
|
30
|
+
await expect(disabled).not.toHaveAttribute('aria-disabled');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -17,6 +17,8 @@ export default class DSButtonV3CO extends PageObject {
|
|
|
17
17
|
|
|
18
18
|
static submitBtn = new Urlbuilder(PATH_E2E_BUTTON_V3, 'pui-16729-buttons-can-submit-forms');
|
|
19
19
|
|
|
20
|
+
static themeFontURL = new Urlbuilder(PATH_E2E_BUTTON_V3, 'theme-font-family-test');
|
|
21
|
+
|
|
20
22
|
// selectors
|
|
21
23
|
static async getButtonByIndex(index) {
|
|
22
24
|
return $$('[data-testid="ds-button"]')[index];
|
|
@@ -38,6 +40,14 @@ export default class DSButtonV3CO extends PageObject {
|
|
|
38
40
|
return $(`button*=${label}`);
|
|
39
41
|
}
|
|
40
42
|
|
|
43
|
+
static async getThemedButton() {
|
|
44
|
+
return $('[data-testid="theme-font-sentinel"] [data-testid="ds-button"]');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
static async getFallbackButton() {
|
|
48
|
+
return $('[data-testid="theme-font-fallback"] [data-testid="ds-button"]');
|
|
49
|
+
}
|
|
50
|
+
|
|
41
51
|
// Snapshot
|
|
42
52
|
static snapshotPath(example = 'basic') {
|
|
43
53
|
return PageObject.getSnapshotPathBuilder('ButtonV3', example);
|
|
@@ -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
|
+
}
|
package/ds-card/DSCardCO.js
CHANGED
|
@@ -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
|
+
}
|