dimsum-e2e-tests 3.70.0-next.4 → 3.70.0-next.40

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 (123) hide show
  1. package/CHANGELOG.md +204 -0
  2. package/ds-accordion/DSAccordion.visual.spec.js +6 -0
  3. package/ds-accordion/DSAccordionCO.js +11 -3
  4. package/ds-accordion/controlled/DSAccordion.controlled.func.spec.js +23 -0
  5. package/ds-accordion/header-structure/DSAccordion.header-structure.func.spec.js +49 -0
  6. package/ds-accordion/input-inside/DSAccordion.input-inside.func.spec.js +17 -0
  7. package/ds-accordion-native/DSAccordionNative.axe-core.func.spec.js +135 -0
  8. package/ds-accordion-native/DSAccordionNative.func.spec.js +200 -0
  9. package/ds-accordion-native/DSAccordionNative.visual.spec.js +158 -0
  10. package/ds-accordion-native/DSAccordionNativeCO.js +161 -0
  11. package/ds-accordion-native/QA_NOTES.md +88 -0
  12. package/ds-accordion-native/aria-disabled/DSAccordionNative.aria-disabled.axe-core.func.spec.js +25 -0
  13. package/ds-accordion-native/aria-disabled/DSAccordionNative.aria-disabled.visual.spec.js +28 -0
  14. package/ds-accordion-native/controlled/DSAccordionNative.controlled.func.spec.js +22 -0
  15. package/ds-accordion-native/header-structure/DSAccordionNative.header-structure.func.spec.js +53 -0
  16. package/ds-accordion-native/input-inside/DSAccordionNative.input-inside.func.spec.js +16 -0
  17. package/ds-accordion-native/role/DSAccordionNative.role-heading.func.spec.js +27 -0
  18. package/ds-accordion-native/scrollable-content/DSAccordionNative.scrollable-content.visual.spec.js +49 -0
  19. package/ds-accordion-native/slots/DSAccordionNative.slots.axe-core.func.spec.js +25 -0
  20. package/ds-accordion-native/slots/DSAccordionNative.slots.func.spec.js +73 -0
  21. package/ds-accordion-native/slots/DSAccordionNative.slots.visual.spec.js +21 -0
  22. package/ds-accordion-native/wrapLabel/DSAccordionNative.wrap-label.visual.spec.js +21 -0
  23. package/ds-apppicker/DSAppPickerCO.js +1 -1
  24. package/ds-autocomplete/DSAutocomplete.visual.spec.js +34 -0
  25. package/ds-autocomplete/DSAutocompleteCO.js +2 -0
  26. package/ds-card-v3/DSCardV3CO.js +14 -0
  27. package/ds-card-v3/accordion/DSCardV3.accordion-aria-structure.func.spec.js +41 -0
  28. package/ds-card-v3/disabled/DSCardV3.disabled-non-interactive.func.spec.js +25 -0
  29. package/ds-card-v3/multi-select/DSCardV3.multi-select.aria-grouping.func.spec.js +24 -0
  30. package/ds-card-v3/single-select/DSCardV3.single-select.aria-grouping.func.spec.js +24 -0
  31. package/ds-chat/DSChat.axe-core.func.spec.js +2 -2
  32. package/ds-chat/DSChat.visual.spec.js +3 -3
  33. package/ds-chat/DSChatCO.js +17 -23
  34. package/ds-chat/bubbles/slots/DSChatBubble.slots.axe-core.func.spec.js +24 -0
  35. package/ds-chat/bubbles/slots/DSChatBubble.slots.func.spec.js +49 -0
  36. package/ds-chat/bubbles/slots/DSChatBubble.slots.visual.spec.js +25 -0
  37. package/ds-chat/card/slots/DSChatCard.slots.axe-core.func.spec.js +24 -0
  38. package/ds-chat/card/slots/DSChatCard.slots.func.spec.js +47 -0
  39. package/ds-chat/card/slots/DSChatCard.slots.visual.spec.js +18 -0
  40. package/ds-chat/card/truncated-text/DSChatCard.truncated-text.func.spec.js +32 -0
  41. package/ds-chat/card/truncated-text/DSChatCard.truncated-text.visual.spec.js +26 -0
  42. package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.axe-core.func.spec.js +23 -0
  43. package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.visual.spec.js +17 -0
  44. package/ds-chat/components/BubbleCO.js +46 -3
  45. package/ds-chat/components/CardCO.js +77 -0
  46. package/ds-chat/components/ComposerCO.js +6 -6
  47. package/ds-chat/components/FloatingButtonCO.js +2 -2
  48. package/ds-chat/components/HeaderCO.js +2 -2
  49. package/ds-chat/components/TileCO.js +82 -0
  50. package/ds-chat/components/index.js +3 -2
  51. package/ds-chat/loadmore/DSChat-loadmore.func.spec.js +1 -1
  52. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.axe-core.func.spec.js +2 -2
  53. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.func.spec.js +1 -1
  54. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.visual.spec.js +2 -2
  55. package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.axe-core.func.spec.js +2 -2
  56. package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.visual.spec.js +1 -1
  57. package/ds-chat/tile/slots/DSChatTile.slots.func.spec.js +53 -0
  58. package/ds-chat/tile/slots/DSChatTile.slots.visual.spec.js +18 -0
  59. package/ds-controlled-form/ds-combobox/DSComboboxCO.js +2 -2
  60. package/ds-controlled-form/ds-controlled-checkbox/DSControlledCheckboxCO.js +1 -1
  61. package/ds-controlled-form/ds-controlled-inputgroup/DSControlledInputGroupCO.js +1 -1
  62. package/ds-data-table-async/DSDataTableCO.js +14 -12
  63. package/ds-data-table-async/basic/DSDataTable.basic.visual.spec.js +1 -1
  64. package/ds-data-table-async/components/FiltersCO.js +1 -1
  65. package/ds-data-table-async/menubutton/DSDataTable.MenuButton.keyboard.func.spec.js +8 -7
  66. package/ds-data-table-async/menubutton/DSDataTable.MenuButton.mouse.func.spec.js +6 -7
  67. package/ds-floating-context/DSFloatingContextCO.js +10 -0
  68. package/ds-floating-context/placement/DSFloatingContext.placement.visual.spec.js +48 -0
  69. package/ds-form-combobox-multi/DSComboboxMultiCO.js +11 -3
  70. package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.axe-core.func.spec.js +55 -0
  71. package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.func.spec.js +57 -0
  72. package/ds-form-combobox-multi/aria-disabled/DSComboboxMulti.aria-disabled.visual.spec.js +15 -0
  73. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.axe-core.func.spec.js +24 -0
  74. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.visual.spec.js +22 -0
  75. package/ds-form-combobox-multi/grouped/DSComboboxMulti.grouped.visual.spec.js +42 -0
  76. package/ds-form-combobox-multi/inline/DSComboboxMulti.inline.visual.spec.js +21 -0
  77. package/ds-form-combobox-multi/skeleton/DSComboboxMulti.skeleton.visual.spec.js +25 -0
  78. package/ds-form-combobox-single/DSComboboxSingleCO.js +11 -3
  79. package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.axe-core.func.spec.js +49 -0
  80. package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.func.spec.js +54 -0
  81. package/ds-form-combobox-single/aria-disabled/DSComboboxSingle.aria-disabled.visual.spec.js +18 -0
  82. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.axe-core.func.spec.js +24 -0
  83. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.visual.spec.js +22 -0
  84. package/ds-form-combobox-single/grouped/DSComboboxSingle.grouped.visual.spec.js +45 -0
  85. package/ds-form-combobox-single/inline/DSComboboxSingle.inline.visual.spec.js +23 -0
  86. package/ds-form-combobox-single/skeleton/DSComboboxSingle.skeleton.visual.spec.js +25 -0
  87. package/ds-form-date-range-picker/date-segment-aria-labels/DateRangePicker.date-segment-aria-labels.func.spec.js +64 -0
  88. package/ds-form-native-select/NativeSelect.axe-core.func.spec.js +39 -0
  89. package/ds-form-native-select/NativeSelect.visual.spec.js +33 -0
  90. package/ds-form-native-select/NativeSelectCO.js +6 -0
  91. package/ds-form-native-select/option-selection/NativeSelect.option-selection.func.spec.js +25 -0
  92. package/ds-leftnavigation/LeftNavigationCO.js +2 -2
  93. package/ds-menu-button/DSMenuButtonCO.js +23 -0
  94. package/ds-menu-button/slots/DSMenuButton.slots.func.spec.js +40 -0
  95. package/ds-menu-button/slots/DSMenuButton.slots.visual.spec.js +26 -0
  96. package/ds-modal-slide/ModalSlideCO.js +39 -0
  97. package/ds-modal-slide/custom-header/ModalSlide.customHeader.focusRing.visual.spec.js +2 -1
  98. package/ds-modal-slide/slots/ModalSlide.slots.func.spec.js +74 -0
  99. package/ds-modal-slide/slots/ModalSlide.slots.visual.spec.js +27 -0
  100. package/ds-notification-badge/DSNotificationBadge.visual.spec.js +17 -20
  101. package/ds-page-layout/PageLayoutCO.js +4 -4
  102. package/ds-progress-indicator/DSProgressIndicator.axe-core.func.spec.js +2 -0
  103. package/ds-progress-indicator/DSProgressIndicatorCO.js +1 -1
  104. package/ds-shuttle-v2/DSShuttleV2CO.js +11 -1
  105. package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.func.spec.js +37 -0
  106. package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.visual.spec.js +27 -0
  107. package/ds-shuttle-v2/skipped/DSShuttleV2.extra.axe-core.skipped.js +1 -1
  108. package/ds-shuttle-v2/skipped/DSShuttleV2.filter.axe-core.skipped.js +1 -1
  109. package/ds-shuttle-v2/skipped/DSShuttleV2.globalcheckbox.axe-core.skipped.js +1 -1
  110. package/ds-shuttle-v2/skipped/DSShuttleV2.items.axe-core.skipped.js +3 -3
  111. package/ds-shuttle-v2/skipped/DSShuttleV2.skipped.js +5 -5
  112. package/ds-tab-button/DSTabButton.func.spec.js +1 -1
  113. package/ds-tooltip-v3/DSTooltipV3CO.js +21 -0
  114. package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.axe-core.func.spec.js +23 -0
  115. package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.func.spec.js +29 -0
  116. package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.func.spec.js +45 -0
  117. package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.visual.spec.js +29 -0
  118. package/ds-treeview/DSTreeViewCO.js +25 -2
  119. package/ds-treeview/dragAndDrop/TreeView-dnd_keyboard.func.spec.js +96 -0
  120. package/package.json +150 -152
  121. package/paths.js +9 -1
  122. package/ds-chat-tile/TileCO.js +0 -35
  123. package/ds-treeview/dragAndDrop/TreeView-dnd_mouse.func.spec.js +0 -61
@@ -1,8 +1,9 @@
1
1
  import BubbleCO from './BubbleCO';
2
+ import CardCO from './CardCO';
2
3
  import FloatingButtonCO from './FloatingButtonCO';
3
- import TileCO from '../../ds-chat-tile/TileCO';
4
+ import TileCO from './TileCO';
4
5
  import HeaderCO from './HeaderCO';
5
6
  import ComposerCO from './ComposerCO';
6
7
  import ChatCO from '../DSChatCO';
7
8
  import StoryBtnsCO from './StoryBtnsCO';
8
- export { BubbleCO, FloatingButtonCO, TileCO, HeaderCO, ComposerCO, ChatCO, StoryBtnsCO };
9
+ export { BubbleCO, CardCO, FloatingButtonCO, TileCO, HeaderCO, ComposerCO, ChatCO, StoryBtnsCO };
@@ -21,7 +21,7 @@ if (!browser.capabilities['ice:options'].isPhone) {
21
21
  await browser.pause(2000);
22
22
  const howManyMsgs = (await DSChatCO.getBubbleContainers()).length;
23
23
  await expect(howManyMsgs).toEqual(20);
24
- await expect(bubble0).toBeDisplayedInViewport();
24
+ await expect(bubble0).toBeDisplayed();
25
25
  });
26
26
  });
27
27
  }
@@ -1,6 +1,6 @@
1
1
  import { Key } from 'webdriverio';
2
- import { axeCoreCheck } from '../helpers';
3
- import TileCO from './TileCO';
2
+ import { axeCoreCheck } from '../../helpers';
3
+ import { TileCO } from '../components';
4
4
 
5
5
  if (
6
6
  (!browser.capabilities['ice:options'].isPhone &&
@@ -1,5 +1,5 @@
1
1
  import { Key } from 'webdriverio';
2
- import TileCO from './TileCO';
2
+ import { TileCO } from '../components';
3
3
 
4
4
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
5
5
  describe('PUI-6684 - Chat, Tile, Keyboard Navigation', () => {
@@ -1,6 +1,6 @@
1
1
  import { Key } from 'webdriverio';
2
- import TileCO from './TileCO';
3
- import { mouseOver, keyboardActions, tickActions, performKeyboardAction } from '../helpers';
2
+ import { TileCO } from '../components';
3
+ import { mouseOver, keyboardActions, tickActions, performKeyboardAction } from '../../helpers';
4
4
 
5
5
  if (!browser.capabilities['ice:options'].isPhone) {
6
6
  describe('PUI-6674 - Chat, Tile, Visual Tests', () => {
@@ -1,5 +1,5 @@
1
- import { axeCoreCheck } from '../../helpers';
2
- import TileCO from '../TileCO';
1
+ import { axeCoreCheck } from '../../../helpers';
2
+ import { TileCO } from '../../components';
3
3
 
4
4
  if (
5
5
  (!browser.capabilities['ice:options'].isPhone &&
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable max-len */
2
2
  import { Key } from 'webdriverio';
3
- import TileCO from '../TileCO';
3
+ import { TileCO } from '../../components';
4
4
 
5
5
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
6
  describe('PUI-14368 - [Tile] applyAriaDisabled prop - visual Test', () => {
@@ -0,0 +1,53 @@
1
+ // Tests for PUI-17908 (ds-chat-tile slots implementation)
2
+ import { TileCO } from '../../components';
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-18465 - DSChatTile:: slot wiring - Func', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await TileCO.slotsTestURL.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: should have custom aria-* for each slot', async () => {
17
+ await (await TileCO.getRootSlot()).waitForDisplayed();
18
+ await expect(await TileCO.getRootSlot()).toHaveAttribute('aria-label', 'root aria');
19
+ await expect(await TileCO.getTooltipWrapperSlot()).toHaveAttribute('aria-label', 'tooltip-wrapper aria');
20
+ await expect(await TileCO.getWrapperSlot()).toHaveAttribute('aria-label', 'wrapper aria');
21
+ await expect(await TileCO.getLeftBorderSlot()).toHaveAttribute('aria-label', 'left-border aria');
22
+ await expect(await TileCO.getCentralContentSlot()).toHaveAttribute('aria-label', 'central-content aria');
23
+ await expect(await TileCO.getIconSlot()).toHaveAttribute('aria-label', 'icon aria');
24
+ await expect(await TileCO.getLabelSlot()).toHaveAttribute('aria-label', 'label aria');
25
+ await expect(await TileCO.getBadgeSlot()).toHaveAttribute('aria-label', 'badge aria');
26
+ await expect(await TileCO.getCloseButtonSlot()).toHaveAttribute('aria-label', 'close-button aria');
27
+ });
28
+
29
+ it('02: should have custom data-testid for each slot', async () => {
30
+ await expect(await TileCO.getRootSlot()).toHaveAttribute('data-testid', 'root data');
31
+ await expect(await TileCO.getTooltipWrapperSlot()).toHaveAttribute('data-testid', 'tooltip-wrapper data');
32
+ await expect(await TileCO.getWrapperSlot()).toHaveAttribute('data-testid', 'wrapper data');
33
+ await expect(await TileCO.getLeftBorderSlot()).toHaveAttribute('data-testid', 'left-border data');
34
+ await expect(await TileCO.getCentralContentSlot()).toHaveAttribute('data-testid', 'central-content data');
35
+ await expect(await TileCO.getIconSlot()).toHaveAttribute('data-testid', 'icon data');
36
+ await expect(await TileCO.getLabelSlot()).toHaveAttribute('data-testid', 'label data');
37
+ await expect(await TileCO.getBadgeSlot()).toHaveAttribute('data-testid', 'badge data');
38
+ await expect(await TileCO.getCloseButtonSlot()).toHaveAttribute('data-testid', 'close-button data');
39
+ });
40
+
41
+ it('03: should have custom lang for each slot', async () => {
42
+ await expect(await TileCO.getRootSlot()).toHaveAttribute('lang', 'pt');
43
+ await expect(await TileCO.getTooltipWrapperSlot()).toHaveAttribute('lang', 'es');
44
+ await expect(await TileCO.getWrapperSlot()).toHaveAttribute('lang', 'de');
45
+ await expect(await TileCO.getLeftBorderSlot()).toHaveAttribute('lang', 'en');
46
+ await expect(await TileCO.getCentralContentSlot()).toHaveAttribute('lang', 'fr');
47
+ await expect(await TileCO.getIconSlot()).toHaveAttribute('lang', 'it');
48
+ await expect(await TileCO.getLabelSlot()).toHaveAttribute('lang', 'nl');
49
+ await expect(await TileCO.getBadgeSlot()).toHaveAttribute('lang', 'sv');
50
+ await expect(await TileCO.getCloseButtonSlot()).toHaveAttribute('lang', 'ja');
51
+ });
52
+ });
53
+ }
@@ -0,0 +1,18 @@
1
+ // Tests for PUI-17908 (ds-chat-tile slots implementation)
2
+ import { TileCO } from '../../components';
3
+
4
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
5
+ describe('PUI-18464 - DSChatTile:: slot variants - Visual', () => {
6
+ before(async () => {
7
+ const errorOnGo = await TileCO.slotsTestURL.go();
8
+ if (errorOnGo) throw errorOnGo;
9
+ });
10
+
11
+ it('01: should display all tile slot variants', async () => {
12
+ const firstTile = await TileCO.getRootSlot();
13
+ await firstTile.waitForDisplayed();
14
+ const snapshot = await browser.percyCheckScreenshot(TileCO.snapshotPath('tile-slot-variants'));
15
+ await expect(snapshot).toEqual(0);
16
+ });
17
+ });
18
+ }
@@ -134,7 +134,7 @@ export default class DSComboboxCO extends PageObject {
134
134
  }
135
135
 
136
136
  static async getSimpleTruncateText() {
137
- return $('[data-testid="DS-SimpleTruncateText"]');
137
+ return $('[data-testid="combobox-selected-values"]');
138
138
  }
139
139
 
140
140
  static async getNumberOptions() {
@@ -183,7 +183,7 @@ export default class DSComboboxCO extends PageObject {
183
183
  }
184
184
 
185
185
  static async getTooltip() {
186
- return $('[data-testid="popover-container"]');
186
+ return $('[data-testid="ds-floating-wrapper-root"]');
187
187
  }
188
188
 
189
189
  // actions
@@ -58,7 +58,7 @@ export default class DSControlledCheckboxCO extends PageObject {
58
58
  static getCheckboxByIndex = async (index) => getElementByIndex(this.getCheckboxes, index);
59
59
 
60
60
  static async getCheckboxLabels() {
61
- return $$('[data-testid="DS-SimpleTruncateText"]');
61
+ return $$('[data-testid="ds-checkbox-label"]');
62
62
  }
63
63
 
64
64
  static getCheckboxLabelByIndex = async (index) => getElementByIndex(this.getCheckboxLabels, index);
@@ -47,7 +47,7 @@ export default class DSControlledInputGroupCO extends PageObject {
47
47
  }
48
48
 
49
49
  static async getComboSelectedOptText() {
50
- return $('[data-testid="DS-SimpleTruncateText"]');
50
+ return $('[data-testid="combobox-selected-values"]');
51
51
  }
52
52
 
53
53
  static async getComboboxInput() {
@@ -142,10 +142,6 @@ export default class DataTableCO extends PageObject {
142
142
 
143
143
  static performance = new Urlbuilder(PATH_E2E_DATATABLE_ADVANCED, 'performance');
144
144
 
145
- static emptyStateFullCustom = new Urlbuilder(PATH_E2E_DATATABLE_ADVANCED, 'empty-state-full-custom');
146
-
147
- static customCellRowHeader = new Urlbuilder(PATH_E2E_DATATABLE_ADVANCED, 'custom-cell-row-and-header');
148
-
149
145
  static responsive = new Urlbuilder(PATH_E2E_DATATABLE_ADVANCED, 'responsive');
150
146
 
151
147
  // ROW
@@ -162,10 +158,15 @@ export default class DataTableCO extends PageObject {
162
158
 
163
159
  static singleSelectDisabledSelectionUC = new Urlbuilder(PATH_E2E_DATATABLE, 'single-select-disabled-selection');
164
160
 
165
- static multiSelectDisabledSelectionUC = new Urlbuilder(PATH_E2E_DATATABLE, 'multi-select-disabled-selection');
161
+ static multiSelectDisabledSelectionUC = new Urlbuilder(PATH_E2E_DATATABLE_ROW, 'multi-select-disabled-selection');
166
162
 
167
163
  static multiSelectEmpty = new Urlbuilder(PATH_E2E_DATATABLE_ROW, 'multi-select-empty');
168
164
 
165
+ static multiSelectDisabledWithUniqueRowAccessor = new Urlbuilder(
166
+ PATH_E2E_DATATABLE_ROW,
167
+ 'multi-select-disabled-selection-with-unique-row-accessor',
168
+ );
169
+
169
170
  // Column
170
171
 
171
172
  static columnLayout = new Urlbuilder(PATH_E2E_DATATABLE_COLUMN, 'basic-column-layout');
@@ -242,6 +243,8 @@ export default class DataTableCO extends PageObject {
242
243
 
243
244
  static pui16461SkeletonAndNoResults = new Urlbuilder(PATH_E2E_DATATABLE_STATES, 'pui-16461-skeleton-and-no-results');
244
245
 
246
+ static emptyStateFullCustom = new Urlbuilder(PATH_E2E_DATATABLE_STATES, 'empty-state-full-custom');
247
+
245
248
  // Cell
246
249
  static editableCells = new Urlbuilder(PATH_E2E_DATATABLE_CELL, 'editable-cells');
247
250
 
@@ -297,11 +300,6 @@ export default class DataTableCO extends PageObject {
297
300
 
298
301
  // eslint-disable-next-line max-len
299
302
 
300
- static multiSelectDisabledWithUniqueRowAccessor = new Urlbuilder(
301
- PATH_E2E_DATATABLE,
302
- 'multi-select-disabled-selection-with-unique-row-accessor',
303
- );
304
-
305
303
  static resizableWithConstrains = new Urlbuilder(PATH_E2E_DATATABLE, 'pui-8896-resizable-with-constrains');
306
304
 
307
305
  static memoizedSearchFilterTest = new Urlbuilder(PATH_E2E_DATATABLE, 'pui-12253-memoized-filter-component');
@@ -392,17 +390,21 @@ export default class DataTableCO extends PageObject {
392
390
  }
393
391
 
394
392
  static getPopoverContainer() {
395
- return $('[data-testid="popover-container"]');
393
+ return $('[data-testid="ds-floating-wrapper-root"]');
396
394
  }
397
395
 
398
396
  static getPopoverContainers() {
399
- return $$('[data-testid="popover-container"]');
397
+ return $$('[data-testid="ds-floating-wrapper-root"]');
400
398
  }
401
399
 
402
400
  static getButtons(index) {
403
401
  return $$('[data-testid="ds-button"]')[index];
404
402
  }
405
403
 
404
+ static getRowActionResult() {
405
+ return $('[data-testid="datatable-row-action-result"]');
406
+ }
407
+
406
408
  static async getSkipToButton() {
407
409
  return $(`[id="storybook-root"] button`);
408
410
  }
@@ -20,7 +20,7 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
20
20
  });
21
21
  describe('PUI-6988 - DataTable, Custom cell and row header -visual.', async () => {
22
22
  before('loading page', async () => {
23
- const errorOnGo = await DSDataTableCO.customCellRowHeader.go();
23
+ const errorOnGo = await DSDataTableCO.customCellRowAndHeaderTest.go();
24
24
  if (errorOnGo) throw errorOnGo;
25
25
  await DSDataTableCO.waitForDataTable();
26
26
  });
@@ -145,7 +145,7 @@ export default class FiltersCO extends PageObject {
145
145
 
146
146
  static getFilterMenuContentSlot = async () => $('[data-dimsum-slot="dsDatatableFilterPopoverContent"]');
147
147
 
148
- static getFilterPopoverSlot = async () => $('[data-dimsum-slot="dsDatatableFilterPopover"]');
148
+ static getFilterPopoverSlot = async () => $('[data-dimsum-parent-slot="dsDatatableFilterPopover"]');
149
149
 
150
150
  static getFreeTextSearchWrapperSlot = async () => $('[data-dimsum-slot="dsDatatableFreeTextSearchWrapper"]');
151
151
 
@@ -1,7 +1,6 @@
1
1
  import { Key } from 'webdriverio';
2
2
  import DSDataTableCO from '../DSDataTableCO';
3
3
  import DSMenuButtonCO from '../../ds-menu-button/DSMenuButtonCO';
4
- import { safeDismissAlert } from '../../helpers';
5
4
 
6
5
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
6
  describe('PUI-16414 - DataTable, MenuButton (keyboard) - Functional Test', async () => {
@@ -29,12 +28,14 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
29
28
  it('03: should trigger menuButton item with keyboard', async () => {
30
29
  await browser.keys(Key.ArrowUp);
31
30
  await browser.keys(Key.Return);
32
- const alertText = await browser.getAlertText();
33
- await expect(alertText).toEqual('item selected: log actions - undefined');
31
+ const result = await DSDataTableCO.getRowActionResult();
32
+ await result.waitForDisplayed();
33
+ await expect(result).toHaveText('item selected: log actions');
34
34
  });
35
35
  it('03: should expand menuButton submenu for datatable row with keyboard', async () => {
36
- await safeDismissAlert();
37
36
  await browser.keys(Key.Return);
37
+ const menuRoot = await DSMenuButtonCO.getMenuRoot();
38
+ await menuRoot.waitForDisplayed();
38
39
  await browser.keys(Key.ArrowDown);
39
40
  const menuItems = (await DSMenuButtonCO.getMenuItems()).length;
40
41
  await expect(menuItems).toEqual(6);
@@ -42,11 +43,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
42
43
  it('04: should trigger menuButton submenu item with keyboard', async () => {
43
44
  await browser.keys(Key.ArrowRight);
44
45
  await browser.keys(Key.Return);
45
- const alertText = await browser.getAlertText();
46
- await expect(alertText).toEqual('item selected: Realtor Phone - (424) 000-0000');
46
+ const result = await DSDataTableCO.getRowActionResult();
47
+ await result.waitForDisplayed();
48
+ await expect(result).toHaveText('item selected: Realtor Phone - (424) 000-0000');
47
49
  });
48
50
  it('05: should close menuButton menu with keyboard', async () => {
49
- await safeDismissAlert();
50
51
  await browser.keys(Key.Return);
51
52
  const menu = await DSMenuButtonCO.getMenuRoot();
52
53
  await menu.waitForDisplayed();
@@ -1,5 +1,4 @@
1
1
  import DSDataTableCO from '../DSDataTableCO';
2
- import { safeDismissAlert } from '../../helpers';
3
2
  import CellCO from '../components/CellCO';
4
3
  import DSMenuButtonCO from '../../ds-menu-button/DSMenuButtonCO';
5
4
 
@@ -21,11 +20,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
21
20
  it('02: should trigger menuButton item', async () => {
22
21
  const thirdItem = await DSMenuButtonCO.getMenuItemWrapper(2);
23
22
  await thirdItem.click();
24
- const alertText = await browser.getAlertText();
25
- await expect(alertText).toEqual('item selected: sms - undefined');
23
+ const result = await DSDataTableCO.getRowActionResult();
24
+ await result.waitForDisplayed();
25
+ await expect(result).toHaveText('item selected: sms');
26
26
  });
27
27
  it('03: should expand menuButton submenu for datatable row', async () => {
28
- await safeDismissAlert();
29
28
  const menuButtonTrigger = await DSDataTableCO.getButtons(2);
30
29
  await menuButtonTrigger.click();
31
30
  const submenuTriggerItem = await DSMenuButtonCO.getMenuItemWrapper(1);
@@ -39,11 +38,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
39
38
  it('04: should trigger menuButton submenu item', async () => {
40
39
  const submenuItem = await DSMenuButtonCO.getMenuItemWrapper(5);
41
40
  await submenuItem.click();
42
- const alertText = await browser.getAlertText();
43
- await expect(alertText).toEqual('item selected: Realtor Phone - (424) 000-0000');
41
+ const result = await DSDataTableCO.getRowActionResult();
42
+ await result.waitForDisplayed();
43
+ await expect(result).toHaveText('item selected: Realtor Phone - (424) 000-0000');
44
44
  });
45
45
  it('05: should close menuButton flyout clicking outside the menu (cell for example)', async () => {
46
- await safeDismissAlert();
47
46
  const menuButtonTrigger = await DSDataTableCO.getButtons(2);
48
47
  await menuButtonTrigger.click();
49
48
  const menu = await DSMenuButtonCO.getMenuRoot();
@@ -10,6 +10,8 @@ export default class DSFloatingContextCO extends PageObject {
10
10
 
11
11
  static slotsURL = new Urlbuilder(PATH_E2E_FLOATING_CONTEXT, 'slots-test');
12
12
 
13
+ static positionsTestURL = new Urlbuilder(PATH_E2E_FLOATING_CONTEXT, 'positions-test');
14
+
13
15
  static async getFloatingContextWrapper() {
14
16
  return $('[data-testid="ds-floating-wrapper-root"]');
15
17
  }
@@ -18,6 +20,14 @@ export default class DSFloatingContextCO extends PageObject {
18
20
  return $('[data-testid="ds-floatingwrapper-content"]');
19
21
  }
20
22
 
23
+ static async getFloatingContextContents() {
24
+ return $$('[data-testid="ds-floatingwrapper-content"]');
25
+ }
26
+
27
+ static async getHelpButtons() {
28
+ return $$('[aria-label="Help"]');
29
+ }
30
+
21
31
  static async getFloatingContextArrowSlot() {
22
32
  return $('[data-dimsum-slot="dsFloatingwrapperArrow"]');
23
33
  }
@@ -0,0 +1,48 @@
1
+ // Tests for the fix introduced in PUI-14527 (useFloatingContext placement string type mismatch)
2
+ import { mouseOver } from '../../helpers';
3
+ import DSFloatingContextCO from '../DSFloatingContextCO';
4
+
5
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
+ describe('PUI-18529 - DSFloatingContext:: useFloatingContext placement directions - visual', () => {
7
+ before('loading page', async () => {
8
+ const errorOnGo = await DSFloatingContextCO.positionsTestURL.go();
9
+ if (errorOnGo) throw errorOnGo;
10
+ });
11
+
12
+ it('01: should display tooltip with right placement on hover', async () => {
13
+ const buttons = await DSFloatingContextCO.getHelpButtons();
14
+ await mouseOver(buttons[0]);
15
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
16
+ await contents[0].waitForDisplayed();
17
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-right'));
18
+ await expect(snapshot).toEqual(0);
19
+ });
20
+
21
+ it('02: should display tooltip with top placement on hover', async () => {
22
+ const buttons = await DSFloatingContextCO.getHelpButtons();
23
+ await mouseOver(buttons[1]);
24
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
25
+ await contents[0].waitForDisplayed();
26
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-top'));
27
+ await expect(snapshot).toEqual(0);
28
+ });
29
+
30
+ it('03: should display tooltip with bottom placement on hover', async () => {
31
+ const buttons = await DSFloatingContextCO.getHelpButtons();
32
+ await mouseOver(buttons[2]);
33
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
34
+ await contents[0].waitForDisplayed();
35
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-bottom'));
36
+ await expect(snapshot).toEqual(0);
37
+ });
38
+
39
+ it('04: should display tooltip with left placement on hover', async () => {
40
+ const buttons = await DSFloatingContextCO.getHelpButtons();
41
+ await mouseOver(buttons[3]);
42
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
43
+ await contents[0].waitForDisplayed();
44
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-left'));
45
+ await expect(snapshot).toEqual(0);
46
+ });
47
+ });
48
+ }
@@ -6,6 +6,10 @@ export default class DSComboboxMultiCO extends PageObject {
6
6
  // STORIES
7
7
  static basicTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'basic-test');
8
8
 
9
+ static loadingTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'loading-test');
10
+
11
+ static skeletonTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'skeleton-test');
12
+
9
13
  static applyAriaDisabled = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'apply-aria-disabled-test');
10
14
 
11
15
  static readOnly = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'read-only-test');
@@ -29,6 +33,10 @@ export default class DSComboboxMultiCO extends PageObject {
29
33
 
30
34
  static disabled = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'disabled-test');
31
35
 
36
+ static grouped = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'grouped-test');
37
+
38
+ static inlineTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'inline-test');
39
+
32
40
  static controlledMenuStateWithSectionsSlotsTest = new Urlbuilder(
33
41
  PATH_E2E_COMBOBOX_MULTI_SLOTS,
34
42
  'controlled-menu-state-with-section-slots-test',
@@ -142,7 +150,7 @@ export default class DSComboboxMultiCO extends PageObject {
142
150
  }
143
151
 
144
152
  static async getSimpleTruncateText() {
145
- return $('[data-testid="DS-SimpleTruncateText"]');
153
+ return $('[data-testid="combobox-selected-values"]');
146
154
  }
147
155
 
148
156
  static async getNumberOptions() {
@@ -191,7 +199,7 @@ export default class DSComboboxMultiCO extends PageObject {
191
199
  }
192
200
 
193
201
  static async getTooltip() {
194
- return $('[data-testid="popover-container"]');
202
+ return $('[data-testid="ds-floating-wrapper-root"]');
195
203
  }
196
204
 
197
205
  // actions
@@ -273,7 +281,7 @@ export default class DSComboboxMultiCO extends PageObject {
273
281
  }
274
282
 
275
283
  static async getComboboxSectionLabelByIndex(index) {
276
- return $$('[data-dimsum-slot="dsComboboxSectionLabel"]')[index];
284
+ return $$('[data-dimsum-parent-slot="dsComboboxSectionLabel"]')[index];
277
285
  }
278
286
 
279
287
  static async getComboboxSectionWrapperSlotByIndex(index) {
@@ -0,0 +1,55 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+ import { axeCoreCheck } from '../../helpers';
3
+
4
+ // Tests for the fix introduced in PUI-18034
5
+ // (busy listbox with aria-busy + aria-label so screen readers announce the
6
+ // in-progress state via the input's aria-controls linkage; this spec verifies
7
+ // the busy listbox surface passes axe-core).
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-18471 - ComboboxMulti:: busy listbox while isLoading - axe-core', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSComboboxMultiCO.loadingTest.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: busy listbox while isLoading should pass axe-core scan', async () => {
21
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
22
+ await dropdownMenuBtn.click();
23
+
24
+ const listbox = await DSComboboxMultiCO.getComboListbox();
25
+ await listbox.waitForExist();
26
+
27
+ // `scrollable-region-focusable` is disabled here as a documented false positive:
28
+ // in the busy/isLoading state the fast-list container is empty, so the region is
29
+ // not authentically scrollable from a user's perspective — TanStack Virtual leaves
30
+ // a residual scrollHeight that triggers the rule. The container's tabindex=-1 is a
31
+ // long-standing Firefox scroll-prevention workaround. The rule remains active for
32
+ // all other states (open menu with items, read-only, etc.).
33
+ const result = await axeCoreCheck({ extraDisabledRules: ['scrollable-region-focusable'] });
34
+ expect(result.length).toBe(0);
35
+ });
36
+ });
37
+
38
+ describe('PUI-18472 - ComboboxMulti:: busy listbox while isSkeleton - axe-core', () => {
39
+ before('loading page', async () => {
40
+ const errorOnGo = await DSComboboxMultiCO.skeletonTest.go();
41
+ if (errorOnGo) throw errorOnGo;
42
+ });
43
+
44
+ it('01: busy listbox while isSkeleton should pass axe-core scan', async () => {
45
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
46
+ await dropdownMenuBtn.click();
47
+
48
+ const listbox = await DSComboboxMultiCO.getComboListbox();
49
+ await listbox.waitForExist();
50
+
51
+ const result = await axeCoreCheck();
52
+ expect(result.length).toBe(0);
53
+ });
54
+ });
55
+ }
@@ -0,0 +1,57 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+
3
+ // Tests for the fix introduced in PUI-18034
4
+ // (carries aria-busy + aria-label on the listbox during loading/skeleton so
5
+ // screen readers announce the in-progress state via the input's aria-controls
6
+ // linkage; replaces the prior racing assertive live region).
7
+ // aria-multiselectable is preserved on the busy listbox.
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-18447 - ComboboxMulti:: busy listbox while isLoading - Func', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSComboboxMultiCO.loadingTest.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: listbox is aria-busy + aria-multiselectable and aria-controls linked', async () => {
21
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
22
+ await dropdownMenuBtn.click();
23
+
24
+ const listbox = await DSComboboxMultiCO.getComboListbox();
25
+ await listbox.waitForExist();
26
+
27
+ await expect(listbox).toHaveAttribute('role', 'listbox');
28
+ await expect(listbox).toHaveAttribute('aria-busy', 'true');
29
+ await expect(listbox).toHaveAttribute('aria-label', 'Loading options please wait');
30
+ await expect(listbox).toHaveAttribute('aria-multiselectable', 'true');
31
+
32
+ const listboxId = await listbox.getAttribute('id');
33
+ const input = await DSComboboxMultiCO.getComboboxInput();
34
+ await expect(input).toHaveAttribute('aria-controls', listboxId);
35
+ });
36
+ });
37
+
38
+ describe('PUI-18448 - ComboboxMulti:: busy listbox while isSkeleton - Func', () => {
39
+ before('loading page', async () => {
40
+ const errorOnGo = await DSComboboxMultiCO.skeletonTest.go();
41
+ if (errorOnGo) throw errorOnGo;
42
+ });
43
+
44
+ it('01: listbox is aria-busy + aria-multiselectable with aria-label', async () => {
45
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
46
+ await dropdownMenuBtn.click();
47
+
48
+ const listbox = await DSComboboxMultiCO.getComboListbox();
49
+ await listbox.waitForExist();
50
+
51
+ await expect(listbox).toHaveAttribute('role', 'listbox');
52
+ await expect(listbox).toHaveAttribute('aria-busy', 'true');
53
+ await expect(listbox).toHaveAttribute('aria-label', 'Loading options please wait');
54
+ await expect(listbox).toHaveAttribute('aria-multiselectable', 'true');
55
+ });
56
+ });
57
+ }
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable max-lines */
2
2
  import { Key } from 'webdriverio';
3
3
  import DSComboboxMultiCO from '../DSComboboxMultiCO';
4
+ import { mouseOver } from '../../helpers';
4
5
 
5
6
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
7
  describe('PUI-14364 - ComboboxMulti:: applyAriaDisabled prop - visual', () => {
@@ -43,5 +44,19 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
43
44
  );
44
45
  await expect(snapshot).toEqual(0);
45
46
  });
47
+ // PUI-15476: aria-disabled item text color must change to n600 on hover
48
+ it('04: listbox with aria-disabled item hovered should display n600 text color', async () => {
49
+ await browser.eyesOpen();
50
+ const secondCombobox = await DSComboboxMultiCO.getComboboxWrapperByIndex(1);
51
+ await secondCombobox.click();
52
+ const menuList = await DSComboboxMultiCO.getMenuList();
53
+ await menuList.waitForDisplayed();
54
+ const ariaDisabledOption = await DSComboboxMultiCO.getOptionByIndex(1);
55
+ await mouseOver(ariaDisabledOption);
56
+ const snapshot = await browser.eyesCheckSnapshot(
57
+ DSComboboxMultiCO.snapshotPath('combobox-multi-aria-disabled-item-hovered'),
58
+ );
59
+ await expect(snapshot).toEqual(0);
60
+ });
46
61
  });
47
62
  }
@@ -0,0 +1,24 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
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-18473 - ComboboxMulti:: disabled - axe-core', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSComboboxMultiCO.disabled.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: disabled combobox should pass axe-core scan', async () => {
17
+ const combobox = await DSComboboxMultiCO.getCombobox();
18
+ await combobox.waitForExist();
19
+
20
+ const result = await axeCoreCheck();
21
+ expect(result.length).toBe(0);
22
+ });
23
+ });
24
+ }