dimsum-e2e-tests 3.51.0-rc.8 → 3.51.1

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 (64) hide show
  1. package/CHANGELOG.md +48 -290
  2. package/ds-apppicker/slots/DSAppPicker.slots.func.spec.js +5 -5
  3. package/ds-card-v3/DSCardV3CO.js +4 -0
  4. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.visual.spec.js +62 -0
  5. package/ds-card-v3/single-select/DSCardV3.single-select.func.spec.js +2 -8
  6. package/ds-controlled-form/ds-combobox/DSCombobox.smoke.spec.js +1 -0
  7. package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable.visual.spec.js +4 -0
  8. package/ds-controlled-form/ds-combobox/only-selectable/DSCombobox.only-selectable.axe-core.func.spec.js +1 -0
  9. package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.func.spec.js +8 -0
  10. package/ds-controlled-form/ds-controlled-inputgroup/basic/DSControlledInputGroup.a11y.func.spec.js +4 -3
  11. package/ds-controlled-form/ds-controlled-radio/DSControlledRadio.visual.spec.js +0 -22
  12. package/ds-controlled-form/ds-controlled-radio/DSControlledRadioCO.js +2 -0
  13. package/ds-controlled-form/ds-controlled-radio/read-only/DSControlledRadio.readOnly.axe-core.func.spec.js +22 -0
  14. package/ds-controlled-form/ds-controlled-radio/read-only/DSControlledRadio.readOnly.visual.spec.js +24 -0
  15. package/ds-controlled-form/ds-controlled-radio/wrapLabel/DSControlledRadio.wrapLabel.visual.spec.js +15 -0
  16. package/ds-controlled-form/ds-input-text/DSInputTextCO.js +2 -0
  17. package/ds-controlled-form/ds-input-text/aria-disabled/DSInputText.aria-disabled.func.spec.js +19 -0
  18. package/ds-data-table-async/DSDataTableCO.js +5 -1
  19. package/ds-data-table-async/components/HeaderCO.js +2 -0
  20. package/ds-data-table-async/components/PaginationNavCO.js +4 -0
  21. package/ds-data-table-async/filters/DSDataTable.filters-creatable.func.spec.js +8 -12
  22. package/ds-data-table-async/filters/DSDataTable.filters-creatable.visual.spec.js +5 -4
  23. package/ds-data-table-async/filters/DSDataTable.filters.empty-value.visual.spec.js +9 -8
  24. package/ds-data-table-async/filters/DSDataTable.filters.visual.spec.js +3 -2
  25. package/ds-data-table-async/pagination/DSDataTable.pagination.func.spec.js +23 -0
  26. package/ds-data-table-async/select/DSDataTable.select.shift.func.spec.js +47 -0
  27. package/ds-floating-context/DSFloatingContextCO.js +14 -0
  28. package/ds-floating-context/slots/DSFloatingContext.slots.axe-core.func.spec.js +23 -0
  29. package/ds-floating-context/slots/DSFloatingContext.slots.func.spec.js +41 -0
  30. package/ds-floating-context/slots/DSFloatingContext.slots.visual.spec.js +18 -0
  31. package/ds-form-combobox-multi/DSComboboxMultiCO.js +2 -0
  32. package/ds-form-combobox-multi/read-only/DSComboboxMulti.read-only.axe-core.func.spec.js +2 -2
  33. package/ds-form-combobox-multi/read-only/DSComboboxMulti.read-only.keyboard-nav.func.spec.js +38 -12
  34. package/ds-form-combobox-multi/read-only/DSComboboxMulti.read-only.mouse.func.spec.js +24 -2
  35. package/ds-form-combobox-multi/read-only/DSComboboxMulti.read-only.visual.spec.js +22 -7
  36. package/ds-form-combobox-single/DSComboboxSingleCO.js +2 -0
  37. package/ds-form-combobox-single/read-only/DSComboboxSingle.read-only.axe-core.func.spec.js +3 -3
  38. package/ds-form-combobox-single/read-only/DSComboboxSingle.read-only.keyboard-nav.func.spec.js +38 -11
  39. package/ds-form-combobox-single/read-only/DSComboboxSingle.read-only.mouse.func.spec.js +24 -2
  40. package/ds-form-combobox-single/read-only/DSComboboxSingle.read-only.visual.spec.js +28 -8
  41. package/ds-form-date-range-picker/read-only/DateRangePicker.readOnly.keyboard-nav.func.spec.js +31 -5
  42. package/ds-form-date-time-picker/date-time-input/DateTimeInput.readOnly.keyboard-nav.func.spec.js +40 -4
  43. package/ds-global-header/GlobalHeaderCO.js +68 -0
  44. package/ds-global-header/slots/GlobalHeader.slots.func.spec.js +86 -0
  45. package/ds-global-header/slots/GlobalHeader.slots.visual.spec.js +20 -0
  46. package/ds-leftnavigation/LeftNavigation.axe-core.func.spec.js +14 -16
  47. package/ds-leftnavigation/LeftNavigation.func.spec.js +30 -34
  48. package/ds-leftnavigation/LeftNavigation.keeping.items.visual.spec.js +2 -2
  49. package/ds-leftnavigation/LeftNavigation.keyboard.func.spec.js +34 -30
  50. package/ds-leftnavigation/LeftNavigation.states.func.spec.js +2 -2
  51. package/ds-leftnavigation/LeftNavigation.visual.spec.js +24 -24
  52. package/ds-leftnavigation/LeftNavigationCO.js +29 -47
  53. package/ds-page-layout/PageLayout.visual.spec.js +6 -3
  54. package/ds-page-layout/PageLayoutCO.js +0 -4
  55. package/ds-shuttle-v2/Dnd/DSShuttleV2.DnD.func.spec.js +66 -0
  56. package/ds-shuttle-v2/basic/DSShuttleV2.keyboard.func.spec.js +0 -22
  57. package/ds-shuttle-v2/drillingdown/DSShuttleV2.drilldown.kb.func.spec.js +0 -41
  58. package/ds-tabs/DSTabs.visual.spec.js +0 -33
  59. package/ds-tabs/DSTabsCO.js +4 -0
  60. package/ds-tabs/with-carousel/DSTabs.with-carousel.visual.spec.js +58 -0
  61. package/ds-treeview/DSTreeViewCO.js +2 -0
  62. package/ds-treeview/removeWidthMaxContentProp/TreeView.removeWidthMaxContent.visual.spec.js +16 -0
  63. package/package.json +119 -119
  64. package/ds-data-table-async/DSDataTable.smoke.spec.js +0 -322
@@ -35,28 +35,6 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
35
35
  await expect(snapshot).toEqual(0);
36
36
  });
37
37
  });
38
- describe('PUI-8840 - DSControlledRadio - Visual Test - ReadOnly', () => {
39
- before('loading page', async () => {
40
- const errorOnGo = await DSControlledRadioCO.readOnly.go();
41
- if (errorOnGo) throw errorOnGo;
42
- });
43
- it('should display readonly radio styles correctly', async () => {
44
- const radio = await DSControlledRadioCO.getRadioByIndex(0);
45
- const radio2 = await DSControlledRadioCO.getRadioByIndex(1);
46
- await radio.click();
47
- await mouseOver(radio2);
48
- const snapshot = await browser.checkSnapshot(DSControlledRadioCO.snapshotPath('radio-readonly'));
49
- await expect(snapshot).toEqual(0);
50
- });
51
- it('should display readonly radio different styles correctly', async () => {
52
- const radio = await DSControlledRadioCO.getRadioByIndex(0);
53
- const radio2 = await DSControlledRadioCO.getRadioByIndex(1);
54
- await radio2.click();
55
- await mouseOver(radio);
56
- const snapshot = await browser.checkSnapshot(DSControlledRadioCO.snapshotPath('radio-readonly-bis'));
57
- await expect(snapshot).toEqual(0);
58
- });
59
- });
60
38
  describe('PUI-8839 - DSControlledRadio - Visual Test - HasError', () => {
61
39
  before('loading page', async () => {
62
40
  const errorOnGo = await DSControlledRadioCO.hasError.go();
@@ -14,6 +14,8 @@ export default class DSControlledRadioCO extends PageObject {
14
14
 
15
15
  static applyAriaDisabled = new Urlbuilder(PATH_E2E_RADIO, 'apply-aria-disabled-test');
16
16
 
17
+ static wrapLabel = new Urlbuilder(PATH_E2E_RADIO, 'wrap-label');
18
+
17
19
  static async getRadio() {
18
20
  return $('[data-testid="ds-radio"]');
19
21
  }
@@ -0,0 +1,22 @@
1
+ import { axeCoreCheck } from '../../../helpers';
2
+ import DSControlledRadioCO from '../DSControlledRadioCO';
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-15631 - DSControlledRadio - readOnly - AxeCore Test', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSControlledRadioCO.readOnly.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+ it('01: should display radio with readOnly and pass axe-core scann', async () => {
16
+ const radio = await DSControlledRadioCO.getRadioByIndex(1);
17
+ await radio.click();
18
+ const result = await axeCoreCheck();
19
+ expect(result.length).toBe(0);
20
+ });
21
+ });
22
+ }
@@ -0,0 +1,24 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSControlledRadioCO from '../DSControlledRadioCO';
3
+
4
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
5
+ describe('PUI-15632 - [DSControlledRadio] readOnly prop - visual Test', () => {
6
+ before('loading page', async () => {
7
+ const errorOnGo = await DSControlledRadioCO.readOnly.go();
8
+ if (errorOnGo) throw errorOnGo;
9
+ });
10
+ it('01: the first readOnly radio should be focused', async () => {
11
+ await browser.eyesOpen();
12
+ const radio = await DSControlledRadioCO.getRadioByIndex(0);
13
+ await radio.click();
14
+ const snapshot = await browser.eyesCheckSnapshot(DSControlledRadioCO.snapshotPath('radio-readOnly-click'));
15
+ await expect(snapshot).toEqual(0);
16
+ });
17
+ it('02: the second readOnly radio should be focused', async () => {
18
+ await browser.eyesOpen();
19
+ await browser.keys(Key.ArrowDown);
20
+ const snapshot = await browser.eyesCheckSnapshot(DSControlledRadioCO.snapshotPath('radio-readOnly-kb-nav'));
21
+ await expect(snapshot).toEqual(0);
22
+ });
23
+ });
24
+ }
@@ -0,0 +1,15 @@
1
+ import DSControlledRadioCO from '../DSControlledRadioCO';
2
+
3
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
4
+ describe('PUI-15710 - [DSControlledRadio] wrapLabel prop - visual Test', () => {
5
+ before('loading page', async () => {
6
+ const errorOnGo = await DSControlledRadioCO.wrapLabel.go();
7
+ if (errorOnGo) throw errorOnGo;
8
+ });
9
+ it('01: the first label should be wrapped', async () => {
10
+ await browser.eyesOpen();
11
+ const snapshot = await browser.eyesCheckSnapshot(DSControlledRadioCO.snapshotPath('radio-wrap-label'));
12
+ await expect(snapshot).toEqual(0);
13
+ });
14
+ });
15
+ }
@@ -28,6 +28,8 @@ export default class DSInputTextCO extends PageObject {
28
28
 
29
29
  static readOnly = new Urlbuilder(PATH_E2E_CONTROLLEDINPUT, 'read-only-test');
30
30
 
31
+ static applyAriaDisabledOnChange = new Urlbuilder(PATH_E2E_CONTROLLEDINPUT, 'apply-aria-disabled-change');
32
+
31
33
  static async getAutocompleteMenuList() {
32
34
  return $('[data-testid="autocomplete-menu-list"]');
33
35
  }
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable max-lines */
2
2
  import DSInputTextCO from '../DSInputTextCO';
3
+ import { type } from '../../../helpers';
3
4
 
4
5
  if (
5
6
  (!browser.capabilities['ice:options'].isPhone &&
@@ -20,4 +21,22 @@ if (
20
21
  await expect(caretValue).toBe('rgba(0,0,0,0)');
21
22
  });
22
23
  });
24
+ describe('PUI-15686 - [InputText] applyAriaDisabled - onChange - func test', () => {
25
+ before('loading page', async () => {
26
+ const errorOnGo = await DSInputTextCO.applyAriaDisabledOnChange.go();
27
+ if (errorOnGo) throw errorOnGo;
28
+ });
29
+ it('01: first aria-disabled Input should not allow to type', async () => {
30
+ const input1 = await DSInputTextCO.getInputTextByIndex(0);
31
+ await input1.click();
32
+ await type('This is a test');
33
+ await expect(input1).toHaveValue('');
34
+ });
35
+ it('02: second aria-disabled Input should not change the value', async () => {
36
+ const input1 = await DSInputTextCO.getInputTextByIndex(1);
37
+ await input1.click();
38
+ await type('This is a test');
39
+ await expect(input1).toHaveValue('Some Value');
40
+ });
41
+ });
23
42
  }
@@ -36,7 +36,7 @@ export default class DataTableCO extends PageObject {
36
36
 
37
37
  static filterableWithFilterBar = new Urlbuilder(PATH_E2E_DATATABLE, 'filtered-column-with-filter-bar');
38
38
 
39
- static masterDatailMultiLevel = new Urlbuilder(PATH_DATA_TABLE_ADVANCED, 'master-detail-with-subrows-with-details');
39
+ static masterDatailMultiLevel = new Urlbuilder(PATH_E2E_DATATABLE, 'master-detail-multi-level-test');
40
40
 
41
41
  static exportCsv = new Urlbuilder(PATH_DATA_TABLE_ADVANCED, 'export-csv');
42
42
 
@@ -44,6 +44,8 @@ export default class DataTableCO extends PageObject {
44
44
 
45
45
  static paginatedWithDetail = new Urlbuilder(PATH_DATA_TABLE, 'paginated-table-with-details');
46
46
 
47
+ static paginatedTable = new Urlbuilder(PATH_E2E_DATATABLE, 'paginated-table-test');
48
+
47
49
  static performance = new Urlbuilder(PATH_DATA_TABLE_ADVANCED, 'performance');
48
50
 
49
51
  static emptyState = new Urlbuilder(PATH_DATA_TABLE, 'empty-state');
@@ -144,6 +146,8 @@ export default class DataTableCO extends PageObject {
144
146
 
145
147
  static sortWithHeaderGroups = new Urlbuilder(PATH_E2E_DATATABLE, 'pui-9362-sort-with-header-groups');
146
148
 
149
+ static multiPerfoHitTest = new Urlbuilder(PATH_E2E_DATATABLE, 'pui-15674-perfo-test');
150
+
147
151
  static selectMultipleSticky = new Urlbuilder(PATH_DATA_TABLE, 'select-multiple-sticky');
148
152
 
149
153
  static perPageScrolling = new Urlbuilder(PATH_E2E_DATATABLE, 'pui-9545-per-page-scrolling');
@@ -37,6 +37,8 @@ export default class HeaderCO extends PageObject {
37
37
 
38
38
  static getHeaderWrapperByIndex = async (index = 0) => $$('[data-testid="ds-datatable-header-cell-wrapper"]')[index];
39
39
 
40
+ static getHeadersWrapper = async () => $('[data-testid="ds-datatable-head-wrapper"]');
41
+
40
42
  static getResizeHandler = async (index) => $$('[data-testid="column"],[aria-label="Resize column"]')[index];
41
43
 
42
44
  static getFilterBtnByIndex = async (index) => $$('[data-testid="data-table-filter-menu-button"] button')[index];
@@ -5,6 +5,10 @@ import { getElementByIndex } from '../helpers';
5
5
  export default class PaginationNavCO extends PageObject {
6
6
  static getPaginationNav = () => $('[data-testid="data-table-pagination-container"]');
7
7
 
8
+ static getPaginator = () => $('[data-testid="ds-pagination-paginator"]');
9
+
10
+ static getSeparatorByIndex = (index = 0) => $$('[data-testid="ds-pagination-separator"]')[index];
11
+
8
12
  static getMenusTrigger = async () => $$('[data-testid="dropdown-menu-trigger-wrapper"]');
9
13
 
10
14
  static getElemsPerPageMenu = async () => getElementByIndex(this.getMenusTrigger, 0);
@@ -4,6 +4,7 @@ import { Key } from 'webdriverio';
4
4
  import DSDataTableCO from '../DSDataTableCO';
5
5
  import { FilterBarCO, FiltersCO, RowCO } from '../components';
6
6
  import { type } from '../../helpers';
7
+ import DSComboboxCO from '../../ds-controlled-form/ds-combobox/DSComboboxCO';
7
8
 
8
9
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
9
10
  describe('PUI-9203 - DataTable, Filter, Creatable single select filter', () => {
@@ -18,10 +19,9 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
18
19
  await expect(inputSingleSelect).toBeFocused();
19
20
  });
20
21
  it('02: start typing a valid value and filter options', async () => {
21
- await FiltersCO.openFilterPopperByColumnName('name', 0);
22
22
  await type('J');
23
- const option1 = await FiltersCO.getFilterSingleSelectMenuItem(0);
24
- const option2 = await FiltersCO.getFilterSingleSelectMenuItem(1);
23
+ const option1 = await DSComboboxCO.getOptionByIndex(0);
24
+ const option2 = await DSComboboxCO.getOptionByIndex(1);
25
25
  await option1.waitForDisplayed();
26
26
  await option2.waitForDisplayed();
27
27
  await expect(option1).toHaveTextContaining(['Add:', 'J']);
@@ -29,7 +29,7 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
29
29
  });
30
30
  it('03: should create a new option', async () => {
31
31
  await type('OHN');
32
- await browser.keys(Key.ArrowDown);
32
+ // await browser.keys(Key.ArrowDown);
33
33
  await browser.keys(Key.Enter);
34
34
  const pill = await FilterBarCO.getPillByText('JOHN');
35
35
  await expect(pill).toBeDisplayedInViewport();
@@ -39,7 +39,6 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
39
39
  await pillCloseBtn.click();
40
40
  await FiltersCO.openFilterPopperByColumnName('name', 0);
41
41
  await type('John');
42
- await browser.keys(Key.ArrowDown);
43
42
  await browser.keys(Key.Enter);
44
43
  const results = await RowCO.getRows();
45
44
  const filteredNames = await DSDataTableCO.getAllColumnResults(results, 1);
@@ -59,10 +58,9 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
59
58
  await expect(inputSingleSelect).toBeFocused();
60
59
  });
61
60
  it('02: start typing a valid value and filter options', async () => {
62
- await FiltersCO.openFilterPopperByColumnName('position', 0);
63
61
  await type('Re');
64
- const option1 = await FiltersCO.getFilterMultiSelectMenuItem(0);
65
- const option2 = await FiltersCO.getFilterMultiSelectMenuItem(1);
62
+ const option1 = await DSComboboxCO.getOptionByIndex(0);
63
+ const option2 = await DSComboboxCO.getOptionByIndex(1);
66
64
  await option1.waitForDisplayed();
67
65
  await option2.waitForDisplayed();
68
66
  await expect(option1).toHaveTextContaining(['Add:', 'Re']);
@@ -70,13 +68,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
70
68
  });
71
69
  it('03: should create a new option', async () => {
72
70
  await type('act');
73
- await browser.keys(Key.ArrowDown);
74
71
  await browser.keys(Key.Enter);
75
72
  const pill = await FilterBarCO.getPillByText('React');
76
- const menuItems = await FiltersCO.getFilterMultiSelectMenuItems();
77
- const textFirstItem = await menuItems[0];
73
+ const menuItems = await DSComboboxCO.getOptionByIndex(0);
78
74
  await expect(pill).toBeDisplayedInViewport();
79
- await expect(textFirstItem).toHaveTextContaining('React');
75
+ await expect(menuItems).toHaveTextContaining('React');
80
76
  });
81
77
  it('04: type a valid value', async () => {
82
78
  await type('React dev');
@@ -4,6 +4,7 @@ import { Key } from 'webdriverio';
4
4
  import DSDataTableCO from '../DSDataTableCO';
5
5
  import { FiltersCO } from '../components';
6
6
  import { type } from '../../helpers';
7
+ import DSComboboxCO from '../../ds-controlled-form/ds-combobox/DSComboboxCO';
7
8
 
8
9
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
9
10
  describe('PUI-9206 - DataTable, Creatable single select filter - focus after clear input', () => {
@@ -16,8 +17,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
16
17
  await browser.eyesOpen();
17
18
  await FiltersCO.openFilterPopperByColumnName('name', 0);
18
19
  await type('J');
19
- const option1 = await FiltersCO.getFilterSingleSelectMenuItem(0);
20
- const option2 = await FiltersCO.getFilterSingleSelectMenuItem(1);
20
+ const option1 = await DSComboboxCO.getOptionByIndex(0);
21
+ const option2 = await DSComboboxCO.getOptionByIndex(1);
21
22
  await option1.waitForDisplayed();
22
23
  await option2.waitForDisplayed();
23
24
  const snapshot = await browser.eyesCheckSnapshot(
@@ -42,8 +43,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
42
43
  await browser.eyesOpen();
43
44
  await FiltersCO.openFilterPopperByColumnName('position', 0);
44
45
  await type('Re');
45
- const option1 = await FiltersCO.getFilterMultiSelectMenuItem(0);
46
- const option2 = await FiltersCO.getFilterMultiSelectMenuItem(1);
46
+ const option1 = await DSComboboxCO.getOptionByIndex(0);
47
+ const option2 = await DSComboboxCO.getOptionByIndex(1);
47
48
  await option1.waitForDisplayed();
48
49
  await option2.waitForDisplayed();
49
50
  const snapshot = await browser.eyesCheckSnapshot(
@@ -2,6 +2,7 @@
2
2
  /* eslint-disable max-lines */
3
3
  import DSDataTableCO from '../DSDataTableCO';
4
4
  import { FilterBarCO, FiltersCO } from '../components';
5
+ import DSComboboxCO from '../../ds-controlled-form/ds-combobox/DSComboboxCO';
5
6
 
6
7
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
8
  describe('PUI-11118 - DataTable: Filter:: empty value - single & multi select - visual', () => {
@@ -13,15 +14,15 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
13
14
  it('01: should display empty option on single select - visual', async () => {
14
15
  await browser.eyesOpen();
15
16
  await FiltersCO.openFilterPopperByColumnName('name');
16
- const emptyOption = await FiltersCO.getFilterSingleSelectMenuItem(2);
17
+ const emptyOption = await DSComboboxCO.getOptionByIndex(2);
17
18
  await emptyOption.waitForDisplayed();
18
19
  const snapshot = await browser.eyesCheckSnapshot(DSDataTableCO.snapshotPath('single-select-open-empty-option'));
19
20
  await expect(snapshot).toEqual(0);
20
21
  });
21
22
  it('02: should display empty option selected on single select - visual', async () => {
22
23
  await browser.eyesOpen();
23
- await FiltersCO.openFilterPopperByColumnName('name');
24
- const emptyOption = await FiltersCO.getFilterSingleSelectMenuItem(2);
24
+ const emptyOption = await DSComboboxCO.getOptionByIndex(2);
25
+ await emptyOption.waitForDisplayed();
25
26
  await emptyOption.click();
26
27
  const pillEmptyVal = await FilterBarCO.findPill('Name', '(Empty)');
27
28
  await pillEmptyVal.waitForDisplayed();
@@ -33,15 +34,15 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
33
34
  it('03: should display empty option on multi select - visual', async () => {
34
35
  await browser.eyesOpen();
35
36
  await FiltersCO.openFilterPopperByColumnName('position');
36
- const emptyOption = await FiltersCO.getFilterMultiSelectMenuItem(5);
37
+ const emptyOption = await DSComboboxCO.getOptionByIndex(5);
37
38
  await emptyOption.waitForDisplayed();
38
39
  const snapshot = await browser.eyesCheckSnapshot(DSDataTableCO.snapshotPath('multi-select-open-empty-option'));
39
40
  await expect(snapshot).toEqual(0);
40
41
  });
41
42
  it('04: should display empty option selected on multi select - visual', async () => {
42
43
  await browser.eyesOpen();
43
- await FiltersCO.openFilterPopperByColumnName('position');
44
- const emptyOption = await FiltersCO.getFilterMultiSelectMenuItem(5);
44
+ const emptyOption = await DSComboboxCO.getOptionByIndex(5);
45
+ await emptyOption.waitForDisplayed();
45
46
  await emptyOption.click();
46
47
  const pillEmptyVal = await FilterBarCO.findPill('Position', '(Empty)');
47
48
  await pillEmptyVal.waitForDisplayed();
@@ -62,8 +63,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
62
63
  });
63
64
  it('06: should display empty option selected on multi select creatable - visual', async () => {
64
65
  await browser.eyesOpen();
65
- await FiltersCO.openFilterPopperByColumnName('country');
66
- const emptyOption = await FiltersCO.getFilterMultiSelectMenuItem(2);
66
+ const emptyOption = await DSComboboxCO.getOptionByIndex(2);
67
+ await emptyOption.waitForDisplayed();
67
68
  await emptyOption.click();
68
69
  const pillEmptyVal = await FilterBarCO.findPill('Country', '(Empty)');
69
70
  await pillEmptyVal.waitForDisplayed();
@@ -6,6 +6,7 @@ import { Key } from 'webdriverio';
6
6
  import DSDataTableCO from '../DSDataTableCO';
7
7
  import { FiltersCO, FilterBarCO } from '../components';
8
8
  import { type } from '../../helpers';
9
+ import DSComboboxCO from '../../ds-controlled-form/ds-combobox/DSComboboxCO';
9
10
 
10
11
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
11
12
  describe('PUI-6964 - DataTable, Filter, Date range - Visual Test', () => {
@@ -169,9 +170,9 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
169
170
  it('01: filterbar should be displayed correctly', async () => {
170
171
  await browser.eyesOpen();
171
172
  await FiltersCO.openFilterPopperByColumnName('id');
172
- await (await FiltersCO.getFilterSingleSelectMenuItem(0)).click();
173
+ await (await await DSComboboxCO.getOptionByIndex(0)).click();
173
174
  await FiltersCO.openFilterPopperByColumnName('name');
174
- await (await FiltersCO.getFilterSingleSelectMenuItem(0)).click();
175
+ await (await await DSComboboxCO.getOptionByIndex(0)).click();
175
176
  await FiltersCO.openFilterPopperByColumnName('position');
176
177
  await (await FiltersCO.getFilterMultiSelectMenuItem(0)).click();
177
178
  await (await FiltersCO.getFilterMultiSelectMenuItem(1)).click();
@@ -173,4 +173,27 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
173
173
  await expect(elemsPerPage).toBeFocused();
174
174
  });
175
175
  });
176
+ describe('PUI-15714 - DataTable, Pagination Table, Custom IDs - Func', async () => {
177
+ before('loading page', async () => {
178
+ const errorOnGo = await DSDataTableCO.paginatedTable.go();
179
+ if (errorOnGo) throw errorOnGo;
180
+ await DSDataTableCO.waitForDataTable();
181
+ });
182
+ it('01: should have pagination (and headers wrapper) with custom ids', async () => {
183
+ const container = await PaginationNavCO.getPaginationNav();
184
+ const elemsPerPage = await PaginationNavCO.getElemsPerPageBtn();
185
+ const prevBtn = await PaginationNavCO.getPrevPageBt();
186
+ const nextBtn = await PaginationNavCO.getNextPageBt();
187
+ const separator = await PaginationNavCO.getSeparatorByIndex();
188
+ const paginator = await PaginationNavCO.getPaginator();
189
+ const headersContainer = await HeaderCO.getHeadersWrapper();
190
+ await expect(headersContainer).toHaveAttribute('id', 'im header wrapper');
191
+ await expect(container).toHaveAttribute('id', 'im pag container');
192
+ await expect(elemsPerPage).toHaveAttribute('id', 'im perpage selector');
193
+ await expect(prevBtn).toHaveAttribute('id', 'im prev btn');
194
+ await expect(nextBtn).toHaveAttribute('id', 'im next btn');
195
+ await expect(separator).toHaveAttribute('id', 'im separator');
196
+ await expect(paginator).toHaveAttribute('id', 'im paginator');
197
+ });
198
+ });
176
199
  }
@@ -123,4 +123,51 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
123
123
  await expect(checkBoxRow5).toBe('false');
124
124
  });
125
125
  });
126
+
127
+ describe('PUI-15743 - DataTable, Row selection with shift + space - Performance', () => {
128
+ before('loading page', async () => {
129
+ const errorOnGo = await DSDataTableCO.multiPerfoHitTest.go();
130
+ if (errorOnGo) throw errorOnGo;
131
+ await DSDataTableCO.waitForDataTable();
132
+ });
133
+ it('01: should select all the rows in the range except the ones that are disabled', async () => {
134
+ await tabStops(10);
135
+ await browser.keys(Key.Space);
136
+ await browser.pause(200);
137
+ await browser.keys([Key.Shift, Key.ArrowDown]);
138
+ await browser.keys([Key.Shift, Key.ArrowDown]);
139
+ await browser.keys([Key.Shift, Key.ArrowDown]);
140
+ await browser.keys([Key.Shift, Key.ArrowDown]);
141
+ await browser.keys([Key.Shift, Key.Space]);
142
+ const checkBoxRow2 = await (await RowCO.getRowCheckBoxByIndex(1)).getAttribute('aria-checked');
143
+ const checkBoxRow3 = await (await RowCO.getRowCheckBoxByIndex(2)).getAttribute('aria-checked');
144
+ const checkBoxRow4 = await (await RowCO.getRowCheckBoxByIndex(3)).getAttribute('aria-checked');
145
+ const checkBoxRow5 = await (await RowCO.getRowCheckBoxByIndex(4)).getAttribute('aria-checked');
146
+ const checkBoxRow6 = await (await RowCO.getRowCheckBoxByIndex(5)).getAttribute('aria-checked');
147
+ await expect(checkBoxRow2).toBe('true');
148
+ await expect(checkBoxRow3).toBe('true');
149
+ await expect(checkBoxRow4).toBe('false');
150
+ await expect(checkBoxRow5).toBe('true');
151
+ await expect(checkBoxRow6).toBe('true');
152
+ });
153
+ it('02: should unselect all the rows in the range', async () => {
154
+ await browser.keys(Key.Space);
155
+ await browser.pause(200);
156
+ await browser.keys([Key.Shift, Key.ArrowUp]);
157
+ await browser.keys([Key.Shift, Key.ArrowUp]);
158
+ await browser.keys([Key.Shift, Key.ArrowUp]);
159
+ await browser.keys([Key.Shift, Key.ArrowUp]);
160
+ await browser.keys([Key.Shift, Key.Space]);
161
+ const checkBoxRow2 = await (await RowCO.getRowCheckBoxByIndex(1)).getAttribute('aria-checked');
162
+ const checkBoxRow3 = await (await RowCO.getRowCheckBoxByIndex(2)).getAttribute('aria-checked');
163
+ const checkBoxRow4 = await (await RowCO.getRowCheckBoxByIndex(3)).getAttribute('aria-checked');
164
+ const checkBoxRow5 = await (await RowCO.getRowCheckBoxByIndex(4)).getAttribute('aria-checked');
165
+ const checkBoxRow6 = await (await RowCO.getRowCheckBoxByIndex(4)).getAttribute('aria-checked');
166
+ await expect(checkBoxRow2).toBe('false');
167
+ await expect(checkBoxRow3).toBe('false');
168
+ await expect(checkBoxRow4).toBe('false');
169
+ await expect(checkBoxRow5).toBe('false');
170
+ await expect(checkBoxRow6).toBe('false');
171
+ });
172
+ });
126
173
  }
@@ -8,6 +8,8 @@ export default class DSFloatingContextCO extends PageObject {
8
8
 
9
9
  static customOffsetURL = new Urlbuilder(PATH_E2E_FLOATING_CONTEXT, 'custom-offsets-test');
10
10
 
11
+ static slotsURL = new Urlbuilder(PATH_E2E_FLOATING_CONTEXT, 'slots-test');
12
+
11
13
  static async getFloatingContextWrapper() {
12
14
  return $('[data-testid="ds-floating-wrapper-root"]');
13
15
  }
@@ -16,6 +18,18 @@ export default class DSFloatingContextCO extends PageObject {
16
18
  return $('[data-testid="ds-floatingwrapper-content"]');
17
19
  }
18
20
 
21
+ static async getFloatingContextArrowSlot() {
22
+ return $('[data-dimsum-slot="dsFloatingwrapperArrow"]');
23
+ }
24
+
25
+ static async getFloatingContextContentSlot() {
26
+ return $('[data-dimsum-slot="dsFloatingwrapperContent"]');
27
+ }
28
+
29
+ static async getFloatingContextRootSlot() {
30
+ return $('[data-dimsum-slot="dsFloatingwrapperRoot"]');
31
+ }
32
+
19
33
  static snapshotPath(example = 'basic') {
20
34
  return PageObject.getSnapshotPathBuilder('DSFloatingContext', example, 'ds-floating-context');
21
35
  }
@@ -0,0 +1,23 @@
1
+ /* eslint-disable max-lines */
2
+ import DSFloatingContextCO from '../DSFloatingContextCO';
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-15675 - DSFloatingContextCO:: slots - axe-core test', () => {
12
+ before('loading page', async () => {
13
+ const errorOnGo = await DSFloatingContextCO.slotsURL.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ });
16
+ it('01: should display a custom Floating Context and pass axe-core', async () => {
17
+ const tooltip = await DSFloatingContextCO.getFloatingContextContentSlot();
18
+ await tooltip.waitForDisplayed();
19
+ const result = await axeCoreCheck();
20
+ expect(result.length).toBe(0);
21
+ });
22
+ });
23
+ }
@@ -0,0 +1,41 @@
1
+ import DSFloatingContextCO from '../DSFloatingContextCO';
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-15676 - DSFloatingContextCO:: slots - globalAttributes test', () => {
10
+ before('loading page', async () => {
11
+ const errorOnGo = await DSFloatingContextCO.slotsURL.go();
12
+ if (errorOnGo) throw errorOnGo;
13
+ });
14
+ it('01: should have custom data-*', async () => {
15
+ const contentSlot = await DSFloatingContextCO.getFloatingContextContentSlot();
16
+ const rootSlot = await DSFloatingContextCO.getFloatingContextRootSlot();
17
+
18
+ await expect(contentSlot).toHaveAttribute('data-testid', 'floating-content-custom-data-testid');
19
+ await expect(rootSlot).toHaveAttribute('data-testid', 'floating-root-custom-data-testid');
20
+ });
21
+ it('02: should have custom aria-*', async () => {
22
+ // const arrowSlot = DSFloatingContextCO.getFloatingContextArrowSlot();
23
+ const contentSlot = await DSFloatingContextCO.getFloatingContextContentSlot();
24
+ const rootSlot = await DSFloatingContextCO.getFloatingContextRootSlot();
25
+
26
+ // await expect(arrowSlot).toHaveAttribute('aria-label', 'arrow-custom-aria-label');
27
+ await expect(contentSlot).toHaveAttribute('aria-label', 'content-custom-aria-label');
28
+ await expect(rootSlot).toHaveAttribute('aria-label', 'root-custom-aria-label');
29
+ });
30
+ it('03: should have custom global attributes', async () => {
31
+ const contentSlot = await DSFloatingContextCO.getFloatingContextContentSlot();
32
+ const rootSlot = await DSFloatingContextCO.getFloatingContextRootSlot();
33
+ const zIndexRoot = await rootSlot.getCSSProperty('z-index');
34
+
35
+ await expect(contentSlot).toHaveAttribute('id', 'floating-content-id');
36
+ await expect(rootSlot).toHaveAttribute('id', 'floating-root-id');
37
+ await expect(rootSlot).toHaveAttribute('role', 'tooltip');
38
+ await expect(zIndexRoot.value).toEqual(5000);
39
+ });
40
+ });
41
+ }
@@ -0,0 +1,18 @@
1
+ /* eslint-disable wdio/no-pause */
2
+ import DSFloatingContextCO from '../DSFloatingContextCO';
3
+
4
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
5
+ describe('PUI-15677 - DSFloatingContext:: slots - visual test', () => {
6
+ before('loading page', async () => {
7
+ const errorOnGo = await DSFloatingContextCO.slotsURL.go();
8
+ if (errorOnGo) throw errorOnGo;
9
+ });
10
+ it('01: should display a custom Floating Context', async () => {
11
+ await browser.eyesOpen();
12
+ const tooltip = await DSFloatingContextCO.getFloatingContextRootSlot();
13
+ await tooltip.waitForDisplayed();
14
+ const snapshot = await browser.eyesCheckSnapshot(DSFloatingContextCO.snapshotPath('floating-context-slots'));
15
+ await expect(snapshot).toEqual(0);
16
+ });
17
+ });
18
+ }
@@ -10,6 +10,8 @@ export default class DSComboboxMultiCO extends PageObject {
10
10
 
11
11
  static hundredAndOneOptions = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'hundred-and-one-options-test');
12
12
 
13
+ static readOnlyWithMenuOpenable = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'read-only-with-menu-openable-test');
14
+
13
15
  // COMBOBOX - INPUT
14
16
  static async getCombobox() {
15
17
  return $('[data-testid="combobox-container"]');
@@ -10,13 +10,13 @@ if (
10
10
  ) {
11
11
  describe('PUI-15028 - ComboboxMulti:: readOnly - axe-core test', () => {
12
12
  before('loading page', async () => {
13
- const errorOnGo = await DSComboboxMultiCO.readOnly.go();
13
+ const errorOnGo = await DSComboboxMultiCO.readOnlyWithMenuOpenable.go();
14
14
  if (errorOnGo) throw errorOnGo;
15
15
  });
16
16
  it('01: should display a combobox multi with readOnly and pass axe-core scan', async () => {
17
17
  const combobox = await DSComboboxMultiCO.getCombobox();
18
18
  await combobox.click();
19
- const result = await axeCoreCheck();
19
+ const result = await axeCoreCheck({ extraDisabledRules: ['scrollable-region-focusable'] });
20
20
  await expect(result.length).toBe(0);
21
21
  });
22
22
  });