dimsum-e2e-tests 1.0.35 → 1.1.0
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 +18 -0
- package/ds-accordion/DSAccordion.axe-core.func.spec.js +18 -19
- package/ds-accordion/DSAccordion.func.spec.js +3 -3
- package/ds-accordion/DSAccordion.visual.spec.js +7 -0
- package/ds-accordion/DSAccordionCO.js +75 -11
- package/ds-accordion/QA_NOTES.md +105 -0
- package/ds-accordion/aria-disabled/DSAccordion.aria-disabled.axe-core.func.spec.js +25 -0
- package/ds-accordion/aria-disabled/DSAccordion.aria-disabled.visual.spec.js +23 -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-accordion/role/DSAccordion.role-heading.func.spec.js +21 -0
- package/ds-accordion/scrollable-content/DSAccordion.scrollable-content.visual.spec.js +42 -0
- package/ds-accordion/slots/DSAccordion.slots.axe-core.func.spec.js +25 -0
- package/ds-accordion/slots/DSAccordion.slots.func.spec.js +67 -0
- package/ds-accordion/slots/DSAccordion.slots.visual.spec.js +18 -0
- package/ds-accordion/wrapLabel/DSAccordion.wrap-label.visual.spec.js +20 -0
- package/ds-autocomplete/DSAutocompleteCO.js +3 -3
- package/ds-button-v3/DSButtonV3.aria-diabled.axe-core.func.spec.js +22 -0
- package/ds-button-v3/DSButtonV3.aria-disabled-attribute.func.spec.js +33 -0
- package/ds-button-v3/DSButtonV3.aria-disabled.visual.spec.js +48 -0
- package/ds-button-v3/DSButtonV3.func.spec.js +27 -0
- package/ds-button-v3/DSButtonV3.type-submit.func.spec.js +28 -0
- package/ds-button-v3/DSButtonV3.visual.spec.js +92 -0
- package/ds-button-v3/DSButtonV3CO.js +60 -0
- package/ds-button-v3/theme-font/DSButtonV3.theme-font.func.spec.js +30 -0
- 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 +57 -2
- 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.func.spec.js +19 -37
- package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.keyboard-nav.func.spec.js +51 -0
- package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.visual.spec.js +14 -16
- 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 +25 -0
- package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.axe-core.aria-disabled.func.spec.js +24 -0
- package/ds-controlled-form/ds-controlled-checkbox/slots/DSControlledCheckbox.slots.func.spec.js +78 -0
- package/ds-controlled-form/ds-controlled-checkbox/theme-font/DSControlledCheckbox.theme-font.func.spec.js +30 -0
- package/ds-controlled-form/ds-controlled-date-time-picker/DSControlledDateTimePickerCO.js +64 -2
- package/ds-controlled-form/ds-controlled-inputgroup/DSControlledInputGroupCO.js +7 -21
- package/ds-controlled-form/ds-controlled-inputgroup/autocomplete/DSControlledInputGroup.autocomplete.axe-core.func.spec.js +5 -6
- package/ds-controlled-form/ds-controlled-inputgroup/basic/DSControlledInputGroup.basic.axe-core.func.spec.js +3 -2
- package/ds-controlled-form/ds-controlled-inputgroup/basic/DSControlledInputGroup.basic.visual.spec.js +3 -2
- package/ds-controlled-form/ds-controlled-inputgroup/form-item-layout/DSControlledInputGroup.form-item-layout.axe-core.func.spec.js +2 -1
- package/ds-controlled-form/ds-controlled-inputgroup/form-item-layout/DSControlledInputGroup.form-item-layout.func.spec.js +3 -2
- package/ds-controlled-form/ds-controlled-inputgroup/protected/DSControlledInputGroup.protected.axe-core.func.spec.js +3 -2
- package/ds-controlled-form/ds-controlled-inputgroup/protected/DSControlledInputGroup.protected.func.spec.js +2 -1
- package/ds-controlled-form/ds-controlled-inputgroup/protected/DSControlledInputGroup.protected.visual.spec.js +3 -2
- package/ds-controlled-form/ds-input-text/DSInputText.clearable.keyboard.func.spec.js +2 -2
- package/ds-controlled-form/ds-input-text/DSInputText.func.spec.js +14 -12
- package/ds-controlled-form/ds-input-text/DSInputTextCO.js +31 -8
- package/ds-controlled-form/ds-input-text/aria-disabled/DSInputText.aria-disabled.axe-core.func.spec.js +23 -0
- package/ds-controlled-form/ds-input-text/aria-disabled/DSInputText.aria-disabled.func.spec.js +42 -0
- package/ds-controlled-form/ds-input-text/aria-disabled/DSInputText.aria-disabled.visual.spec.js +28 -0
- package/ds-controlled-form/ds-input-text/placeholder/DSInputText.placeholder.visual.spec.js +15 -0
- package/ds-controlled-form/ds-input-text/read-only/DSInputText.read-only.axe-core.func.spec.js +23 -0
- package/ds-controlled-form/ds-input-text/read-only/DSInputText.read-only.func.spec.js +23 -0
- package/ds-controlled-form/ds-input-text/read-only/DSInputText.read-only.visual.spec.js +28 -0
- package/ds-controlled-form/ds-input-text/slots/DSInputText.slots.axe-core.func.spec.js +23 -0
- package/ds-controlled-form/ds-input-text/slots/DSInputText.slots.func.spec.js +35 -0
- package/ds-controlled-form/ds-input-text/slots/DSInputText.slots.visual.spec.js +19 -0
- package/ds-controlled-form/react-hook-form/ReactHook.func.spec.js +2 -1
- package/ds-controlled-form/react-hook-form/ReactHook.visual.spec.js +2 -1
- package/ds-controlled-form/react-hook-form/ReactHookCO.js +0 -10
- package/ds-controlled-form/useMask/Number/UseNumberMask.axe-core.func.spec.js +48 -0
- package/ds-controlled-form/useMask/Number/UseNumberMask.func.spec.js +37 -36
- package/ds-controlled-form/useMask/Number/UseNumberMask.visual.spec.js +7 -6
- package/ds-controlled-form/useMask/Phone/UsePhoneMask.func.spec.js +9 -8
- package/ds-controlled-form/useMask/Phone/UsePhoneMask.visual.spec.js +4 -3
- package/ds-controlled-form/useMask/ReackHookFormWithMask/ReactHookFormWithMask.func.spec.js +4 -3
- package/ds-controlled-form/useMask/ReackHookFormWithMask/ReactHookFormWithMask.visual.spec.js +5 -4
- package/ds-controlled-form/useMask/RegExp/UseRegExpMask.func.spec.js +6 -5
- package/ds-controlled-form/useMask/SSN/UseSsnMask.func.spec.js +7 -6
- package/ds-controlled-form/useMask/ZipCode/UseZipCodeMask.func.spec.js +6 -5
- package/ds-controlled-form/useMask/useMaskCO.js +1 -11
- package/ds-data-table-async/components/FiltersCOextra.js +1 -1
- package/ds-data-table-async/components/OnRowClickCO.js +1 -1
- package/ds-data-table-async/pagination/DSDataTable.pagination.func.spec.js +3 -2
- package/ds-dialog/components/DialogFormsCO.js +1 -1
- package/ds-dropdownmenu-v2/DSDDMenuV2.axe-core.func.spec.js +2 -15
- package/ds-dropdownmenu-v2/DSDDMenuV2.visual.spec.js +5 -5
- package/ds-dropdownmenu-v2/DSDDMenuV2CO.js +8 -2
- package/ds-dropdownmenu-v2/aria-disabled/DSDDMenuV2.aria-disabled.visual.spec.js +20 -0
- package/ds-dropdownmenu-v2/basic/DSDDMenuV2.basic.func.spec.js +27 -27
- package/ds-dropdownmenu-v2/mandatory-single/DSDDMenuV2.mandatory-single.func.spec.js +4 -4
- package/ds-dropzone/DSDropzoneCO.js +3 -1
- package/ds-floating-context/DSFloatingContext.visual.spec.js +46 -0
- package/ds-floating-context/DSFloatingContextCO.js +46 -0
- package/ds-floating-context/placement/DSFloatingContext.placement.visual.spec.js +48 -0
- package/ds-floating-context/slots/DSFloatingContext.slots.axe-core.func.spec.js +23 -0
- package/ds-floating-context/slots/DSFloatingContext.slots.func.spec.js +41 -0
- package/ds-floating-context/slots/DSFloatingContext.slots.visual.spec.js +18 -0
- package/ds-form-layout-blocks/form-layout-block-item/DSFormLayoutBlockItemCO.js +3 -3
- package/ds-form-layout-label/DSFormLayoutLabelCO.js +3 -1
- package/ds-hooks/DSHook.usetree.func.spec.js +3 -2
- package/ds-hooks/DSHookCO.js +1 -1
- package/ds-hooks/useFocusTrap/UseFocusTrap.func.spec.js +36 -0
- package/ds-hooks/useFocusTrap/UseFocusTrapCO.js +10 -0
- package/ds-hooks/useKeyboardNavigation/DSHook.useKeyboardNavigation.func.spec.js +145 -0
- package/ds-hooks/useKeyboardNavigation/UseKeyboardNavigationCO.js +33 -0
- package/ds-hooks/useOnBlurOut/UseOnBlurOut.axe-core.func.spec.js +29 -0
- package/ds-hooks/useOnBlurOut/UseOnBlurOut.func.spec.js +83 -0
- package/ds-hooks/useOnBlurOut/UseOnBlurOutCO.js +11 -0
- package/ds-icons/DSIcons.visual.spec.js +45 -0
- package/ds-icons/DSIconsCO.js +30 -0
- package/ds-image/DSImageCO.js +3 -1
- package/ds-indeterminate-progress-indicator/DSIndetermintateProgressIndicator.axe-core.func.spec.js +31 -0
- package/ds-menu-item/DSMenuItems.func.spec.js +16 -16
- package/ds-menu-item/DSMenuItems.visual.spec.js +8 -32
- package/ds-menu-item/DSMenuItemsCO.js +4 -0
- package/ds-menu-item/aria-disabled/DSMenuItems.aria-disabled.axe-core.func.spec.js +35 -0
- package/ds-menu-item/aria-disabled/DSMenuItems.aria-disabled.visual.spec.js +68 -0
- package/ds-menu-item/read-only/DSMenuItems.read-only.axe-core.func.spec.js +35 -0
- package/ds-menu-item/read-only/DSMenuItems.read-only.visual.spec.js +66 -0
- package/ds-number-range-field/NumberRangeFieldCO.js +1 -1
- package/ds-page-number/DSPageNumberCO.js +1 -1
- package/ds-query-builder/DSQueryBuilderCO.js +1 -1
- package/ds-shuttle-v2/DSShuttleV2CO.js +36 -1
- package/ds-shuttle-v2/items/DSShuttleV2.items.func.spec.js +4 -2
- package/ds-svg/DSSvgCO.js +3 -1
- package/ds-system/DSSystem.visual.spec.js +19 -0
- package/ds-system/DSSystemCO.js +15 -0
- package/ds-typography/DSTypography.func.spec.js +5 -5
- package/ds-typography/DSTypography.visual.spec.js +50 -48
- package/ds-typography/DSTypographyCO.js +25 -5
- package/ds-typography/theme-font/DSTypography.theme-font.func.spec.js +30 -0
- package/package.json +121 -119
- package/zzz-eol/ds-date-range-selector/DSDateRangeSelectorCO.js +6 -4
- package/ds-button-v2/DSButtonV2.axe-core.func.spec.js +0 -22
- package/ds-button-v2/DSButtonV2.func.spec.js +0 -139
- package/ds-button-v2/DSButtonV2.visual.spec.js +0 -153
- package/ds-button-v2/DSButtonV2CO.js +0 -43
- package/ds-controlled-form/ds-controlled-checkbox/DSControlledCheckbox.smoke.spec.js +0 -125
- package/ds-indeterminate-progress-indicator/DSIndetermintateProgressIndicator.func.spec.js +0 -17
- /package/ds-typography/{DSTypography.resize.visual.spec.js → DSTypography.resize.skipped.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.1.0](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/compare/v1.0.37...v1.1.0) (2026-10-14)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- ds-legacy-dropdownmenu-v2:: ported at parity from live lossless ([e66d53d](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/commit/e66d53df1a090d286fca6774bd2ed7c63bb11618))
|
|
11
|
+
|
|
12
|
+
## [1.0.37](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/compare/v1.0.35...v1.0.37) (2026-10-14)
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- dimsum:: e2e page objects and story paths aligned to the current Storybook ([#74](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/issues/74)) ([b27626a](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/commit/b27626ac6e2204b72c8a3bbb1980ce577a978416))
|
|
17
|
+
|
|
18
|
+
## [1.0.36](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/compare/v1.0.35...v1.0.36) (2026-10-14)
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
- dimsum:: e2e page objects and story paths aligned to the current Storybook ([0587fe0](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/commit/0587fe0f4ae773d4a385e74d33874a9475a557bd))
|
|
23
|
+
|
|
6
24
|
## [1.0.35](https://github.com/intcx/PLATFORM-UI.dimsum-legacy/compare/v1.0.33...v1.0.35) (2026-10-09)
|
|
7
25
|
|
|
8
26
|
**Note:** Version bump only for package dimsum-e2e-tests
|
|
@@ -10,6 +10,24 @@ if (
|
|
|
10
10
|
browser.capabilities.browserName === 'chrome') ||
|
|
11
11
|
browser.capabilities.browserName === 'Chrome'
|
|
12
12
|
) {
|
|
13
|
+
describe('PUI-10994 - Accordion, header controls & subtitle -AxeCore', () => {
|
|
14
|
+
before('loading page', async () => {
|
|
15
|
+
const errorOnGo = await DSAccordionCO.headerControls.go();
|
|
16
|
+
if (errorOnGo) throw errorOnGo;
|
|
17
|
+
});
|
|
18
|
+
it('01: should display accordion expanded with header props (and subtitle) and pass axecore scan', async () => {
|
|
19
|
+
await (await DSAccordionCO.getAccordionHeader(1)).waitForDisplayed();
|
|
20
|
+
await (await DSAccordionCO.getAccordionHeader(1)).click();
|
|
21
|
+
await (await DSAccordionCO.getContents('1-a')).waitForDisplayed();
|
|
22
|
+
const result = await axeCoreCheck();
|
|
23
|
+
expect(result.length).toBe(0);
|
|
24
|
+
});
|
|
25
|
+
it('02: should display accordion with open toolbar and pass axecore scan', async () => {
|
|
26
|
+
await (await DSAccordionCO.getToolbarByIndex(1)).click();
|
|
27
|
+
const result = await axeCoreCheck();
|
|
28
|
+
expect(result.length).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
13
31
|
describe('PUI-10990 - Accordion, basic -AxeCore', () => {
|
|
14
32
|
before('loading page', async () => {
|
|
15
33
|
const errorOnGo = await DSAccordionCO.basicURL.go();
|
|
@@ -87,25 +105,6 @@ if (
|
|
|
87
105
|
expect(result.length).toBe(0);
|
|
88
106
|
});
|
|
89
107
|
});
|
|
90
|
-
// Unskip after PUI-11922 is fixed
|
|
91
|
-
describe.skip('PUI-10994 - Accordion, header controls & subtitle -AxeCore', () => {
|
|
92
|
-
before('loading page', async () => {
|
|
93
|
-
const errorOnGo = await DSAccordionCO.headerControls.go();
|
|
94
|
-
if (errorOnGo) throw errorOnGo;
|
|
95
|
-
});
|
|
96
|
-
it('01: should display accordion expanded with header props (and subtitle) and pass axecore scan', async () => {
|
|
97
|
-
await (await DSAccordionCO.getAccordionHeader(1)).waitForDisplayed();
|
|
98
|
-
await (await DSAccordionCO.getAccordionHeader(1)).click();
|
|
99
|
-
await (await DSAccordionCO.getContents('1-a')).waitForDisplayed();
|
|
100
|
-
const result = await axeCoreCheck();
|
|
101
|
-
expect(result.length).toBe(0);
|
|
102
|
-
});
|
|
103
|
-
it('02: should display accordion with open toolbar and pass axecore scan', async () => {
|
|
104
|
-
await (await DSAccordionCO.getToolbarByIndex(1)).click();
|
|
105
|
-
const result = await axeCoreCheck();
|
|
106
|
-
expect(result.length).toBe(0);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
108
|
|
|
110
109
|
describe('PUI-10995 - Accordion, Actionable within -AxeCore', () => {
|
|
111
110
|
before('loading page', async () => {
|
|
@@ -164,20 +164,20 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
164
164
|
if (errorOnGo) throw errorOnGo;
|
|
165
165
|
});
|
|
166
166
|
it('01: should have accordion closed and content existing by default', async () => {
|
|
167
|
-
const accordionContent = await CellCO.
|
|
167
|
+
const accordionContent = await CellCO.getCellByIndex(1);
|
|
168
168
|
await expect(accordionContent).not.toBeDisplayed();
|
|
169
169
|
await expect(accordionContent).toExist();
|
|
170
170
|
});
|
|
171
171
|
it('02: should have accordion expanded and content existing', async () => {
|
|
172
172
|
const firstAccordion = await DSAccordionCO.getAccordionHeader(0);
|
|
173
173
|
await firstAccordion.click();
|
|
174
|
-
const accordionContent = await CellCO.
|
|
174
|
+
const accordionContent = await CellCO.getCellByIndex(1);
|
|
175
175
|
await expect(accordionContent).toBeDisplayed();
|
|
176
176
|
});
|
|
177
177
|
it('03: should have accordion closed and content still existing', async () => {
|
|
178
178
|
const firstAccordion = await DSAccordionCO.getAccordionHeader(0);
|
|
179
179
|
await firstAccordion.click();
|
|
180
|
-
const accordionContent = await CellCO.
|
|
180
|
+
const accordionContent = await CellCO.getCellByIndex(1);
|
|
181
181
|
await expect(accordionContent).not.toBeDisplayed();
|
|
182
182
|
await expect(accordionContent).toExist();
|
|
183
183
|
});
|
|
@@ -81,6 +81,12 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
81
81
|
if (errorOnGo) throw errorOnGo;
|
|
82
82
|
});
|
|
83
83
|
it('01: should display accordion with global height, not trimmed', async () => {
|
|
84
|
+
const addRow = await $('[data-testid="add-row"]');
|
|
85
|
+
await addRow.click();
|
|
86
|
+
await addRow.click();
|
|
87
|
+
await addRow.click();
|
|
88
|
+
const content = await DSAccordionCO.getContents(0);
|
|
89
|
+
await content.waitForDisplayed();
|
|
84
90
|
const snapshot = await browser.checkSnapshot(DSAccordionCO.snapshotPath('accordion-globalheight'));
|
|
85
91
|
await expect(snapshot).toEqual(0);
|
|
86
92
|
});
|
|
@@ -144,6 +150,7 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
144
150
|
});
|
|
145
151
|
});
|
|
146
152
|
}
|
|
153
|
+
// legacy-only: ds-mobile is still shipped in legacy (live removed this block with the ds-mobile deprecation)
|
|
147
154
|
if (browser.capabilities['ice:options'].isPhone) {
|
|
148
155
|
describe('PUI-7981 - Accordion, desktop to mobile -visual', () => {
|
|
149
156
|
before('loading page', async () => {
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
/* eslint-disable import/no-relative-packages */
|
|
2
|
-
|
|
2
|
+
// legacy-only: path
|
|
3
|
+
import { PATH_ACCORDION_EXAMPLES, PATH_E2E_ACCORDION, PATH_E2E_ACCORDION_PITFALLS } from '../../environments/storybook/paths';
|
|
3
4
|
import { PageObject, Urlbuilder, getElementByIndex } from '../helpers';
|
|
4
5
|
|
|
5
6
|
export default class DSAccordionCO extends PageObject {
|
|
6
7
|
// Desktop
|
|
7
|
-
static basicURL = new Urlbuilder(
|
|
8
|
+
static basicURL = new Urlbuilder(PATH_E2E_ACCORDION, 'basic');
|
|
8
9
|
|
|
9
|
-
static
|
|
10
|
-
|
|
11
|
-
static multipleURL = new Urlbuilder(PATH_ACCORDION_EXAMPLES, 'multiple');
|
|
10
|
+
static multipleURL = new Urlbuilder(PATH_E2E_ACCORDION, 'multiple');
|
|
12
11
|
|
|
12
|
+
// legacy-only: ds-mobile is still shipped in legacy (live removed this example with the ds-mobile deprecation)
|
|
13
13
|
static toMobileURL = new Urlbuilder(PATH_ACCORDION_EXAMPLES, 'desktop-to-mobile');
|
|
14
14
|
|
|
15
|
-
static customActions = new Urlbuilder(
|
|
16
|
-
|
|
17
|
-
static headerProps = new Urlbuilder(PATH_ACCORDION_EXAMPLES, 'header-props');
|
|
15
|
+
static customActions = new Urlbuilder(PATH_E2E_ACCORDION, 'render-custom-actions');
|
|
18
16
|
|
|
19
17
|
static headerControls = new Urlbuilder(PATH_E2E_ACCORDION, 'header-control-examples-test');
|
|
20
18
|
|
|
@@ -24,10 +22,14 @@ export default class DSAccordionCO extends PageObject {
|
|
|
24
22
|
|
|
25
23
|
static tooltip = new Urlbuilder(PATH_E2E_ACCORDION, 'tooltip');
|
|
26
24
|
|
|
27
|
-
static inputInside = new Urlbuilder(PATH_E2E_ACCORDION, '
|
|
25
|
+
static inputInside = new Urlbuilder(PATH_E2E_ACCORDION, 'pui-9261-input-inside');
|
|
26
|
+
|
|
27
|
+
static controlled = new Urlbuilder(PATH_E2E_ACCORDION, 'controlled-test');
|
|
28
28
|
|
|
29
29
|
static datepickerInside = new Urlbuilder(PATH_E2E_ACCORDION, 'actionable-within');
|
|
30
30
|
|
|
31
|
+
static slotsURL = new Urlbuilder(PATH_E2E_ACCORDION, 'slots-test');
|
|
32
|
+
|
|
31
33
|
static disabled = new Urlbuilder(PATH_E2E_ACCORDION, 'disabled-test');
|
|
32
34
|
|
|
33
35
|
static subtitle = new Urlbuilder(PATH_E2E_ACCORDION, 'with-secondary-title-test');
|
|
@@ -36,9 +38,13 @@ export default class DSAccordionCO extends PageObject {
|
|
|
36
38
|
|
|
37
39
|
static keepContentURL = new Urlbuilder(PATH_E2E_ACCORDION, 'keep-content-mounted');
|
|
38
40
|
|
|
39
|
-
static focusOnItemURL = new Urlbuilder(
|
|
41
|
+
static focusOnItemURL = new Urlbuilder(PATH_E2E_ACCORDION_PITFALLS, 'focus-on-item-test');
|
|
42
|
+
|
|
43
|
+
static applyAriaDisabled = new Urlbuilder(PATH_E2E_ACCORDION, 'apply-aria-disabled-test');
|
|
40
44
|
|
|
41
|
-
static
|
|
45
|
+
static scrollableContent = new Urlbuilder(PATH_E2E_ACCORDION, 'scrollable-content');
|
|
46
|
+
|
|
47
|
+
static wrapLabel = new Urlbuilder(PATH_E2E_ACCORDION, 'wrap-label');
|
|
42
48
|
|
|
43
49
|
// Snapshots
|
|
44
50
|
static snapshotPath(example = 'basic') {
|
|
@@ -97,4 +103,62 @@ export default class DSAccordionCO extends PageObject {
|
|
|
97
103
|
static getButtonsByIndex = async (index) => getElementByIndex(this.getButtons, index);
|
|
98
104
|
|
|
99
105
|
static getToolbarByIndex = async (index) => getElementByIndex(this.getToolbarTriggers, index);
|
|
106
|
+
|
|
107
|
+
static async getToolbarMenuByIndex(index = 0) {
|
|
108
|
+
return $$('[data-testid="ds-menuitem-menu-item-wrapper"]')[index];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static getAccordionItemHeaderContainers = async () => $$('[data-testid="ds-accordion-item-header-container"]');
|
|
112
|
+
|
|
113
|
+
static getAccordionItemHeaderContainerByIndex = async (index) =>
|
|
114
|
+
getElementByIndex(this.getAccordionItemHeaderContainers, index);
|
|
115
|
+
|
|
116
|
+
static getAccordionItemHeaderCustomActionsContainers = async () =>
|
|
117
|
+
$$('[data-testid="ds-accordion-item-header-custom-actions-container"]');
|
|
118
|
+
|
|
119
|
+
static getAccordionItemHeaderCustomActionsContainerByIndex = async (index) =>
|
|
120
|
+
getElementByIndex(this.getAccordionItemHeaderCustomActionsContainers, index);
|
|
121
|
+
|
|
122
|
+
// slots
|
|
123
|
+
|
|
124
|
+
static async getAccordionContainerSlotByIndex(index = 0) {
|
|
125
|
+
return $$('[data-dimsum-slot="dsAccordionRoot"]')[index];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static async getAccordionItemContainerSlotByIndex(index = 0) {
|
|
129
|
+
return $$('[data-dimsum-slot="dsAccordionItemContainer"]')[index];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
static async getAccordionItemHeaderContainerSlotByIndex(index = 0) {
|
|
133
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeaderContainer"]')[index];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static async getAccordionItemHeaderSlotByIndex(index = 0) {
|
|
137
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeader"]')[index];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static async getAccordionItemHeaderAddonSlotByIndex(index = 0) {
|
|
141
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeaderAddon"]')[index];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static async getAccordionItemHeaderTitlesContainerSlotByIndex(index = 0) {
|
|
145
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeaderTitlesContainer"]')[index];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
static async getAccordionItemHeaderPrimaryTitleSlotByIndex(index = 0) {
|
|
149
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeaderPrimaryTitle"]')[index];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
static async getAccordionItemContentContainerSlotByIndex(index = 0) {
|
|
153
|
+
return $$('[data-dimsum-slot="dsAccordionItemContentContainer"]')[index];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
static async getAccordionItemHeaderSecondaryTitleSlotByIndex(index = 0) {
|
|
157
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeaderSecondaryTitle"]')[index];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static async getAccordionItemHeaderTooltipSlotByIndex(index = 0) {
|
|
161
|
+
// not used on example
|
|
162
|
+
return $$('[data-dimsum-slot="dsAccordionItemHeaderTooltip"]')[index];
|
|
163
|
+
}
|
|
100
164
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# QA Notes — ds-accordion E2E
|
|
2
|
+
|
|
3
|
+
Durable QA knowledge for the `accordion` suite. Carried over from the `ds-accordion-native` POC
|
|
4
|
+
notes ([PUI-18083](https://jira.elliemae.io/browse/PUI-18083)) when that parallel suite was removed —
|
|
5
|
+
see "Native migration" below.
|
|
6
|
+
|
|
7
|
+
## Native migration ([PUI-18742](https://jira.elliemae.io/browse/PUI-18742))
|
|
8
|
+
|
|
9
|
+
`ds-accordion` now renders a native `<details>` / `<summary>` disclosure instead of the previous
|
|
10
|
+
WAI-ARIA button pattern. Public API, slot names and `data-testid` values are unchanged; only the DOM
|
|
11
|
+
engine changed. Full contract: [`stories/ds-accordion/docs/NativeDisclosureMigration.md`](../../environments/storybook/stories/ds-accordion/docs/NativeDisclosureMigration.md).
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<div data-testid="ds-accordion_item">
|
|
15
|
+
<details data-testid="ds-accordion-item-details">
|
|
16
|
+
<summary data-testid="ds-accordion_item-header" aria-expanded aria-controls="ds-accordion-content-0">
|
|
17
|
+
<div data-testid="ds-accordion-item-header-container">… chevron + title(s) …</div>
|
|
18
|
+
</summary>
|
|
19
|
+
<div data-testid="ds-accordion_item-content" role="region" aria-labelledby="ds-accordion-header-0">…</div>
|
|
20
|
+
</details>
|
|
21
|
+
<div data-testid="ds-accordion-item-header-custom-actions-container">… custom actions …</div>
|
|
22
|
+
</div>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**What this changes for specs:**
|
|
26
|
+
|
|
27
|
+
- The trigger is a `<summary>`, **not** a `<button>`. `getAccordionHeader(i)` returns the `<summary>`.
|
|
28
|
+
- The heading container lives **inside** the summary (inverse of the pre-migration nesting).
|
|
29
|
+
- `role="heading"` + `aria-level` are **not** emitted by the component. They are opt-in per consumer
|
|
30
|
+
through the `dsAccordionItemHeaderContainer` slot prop. Only stories that set that prop
|
|
31
|
+
(e.g. `WithSecondaryTitleTest`, `AdvancedHeadingStructureCustomization`) expose heading semantics —
|
|
32
|
+
`HeaderControlExamplesTest` does not. Assert the role only on a story that opts in
|
|
33
|
+
(`role/DSAccordion.role-heading.func.spec.js`).
|
|
34
|
+
- Custom actions render as a **sibling of `<details>`**, outside the trigger. Nothing interactive is
|
|
35
|
+
nested inside the `<summary>`.
|
|
36
|
+
- `ds-accordion-item-details` is an additive slot/testid introduced by the migration.
|
|
37
|
+
|
|
38
|
+
The former `ds-accordion-native` E2E suite was deleted here — `ds-accordion` **is** the native engine
|
|
39
|
+
now, so the parity suite had no stories left to point at (`stories/ds-accordion-native` and
|
|
40
|
+
`PATH_E2E_ACCORDION_NATIVE` were removed in PUI-18742).
|
|
41
|
+
|
|
42
|
+
## header-structure func — test 04 flaky "Login not displayed" (cloud)
|
|
43
|
+
|
|
44
|
+
**Status:** spec hardened (spec-only + one additive CO helper). Investigated 2026-07-02 on the native
|
|
45
|
+
suite; the same hardening now lives in `header-structure/DSAccordion.header-structure.func.spec.js`.
|
|
46
|
+
|
|
47
|
+
**Symptom:** in the cloud run (`E2E_BACKEND=cloud`, `BASE_URL`=NEXT/d3, Chrome-only) test
|
|
48
|
+
`04: toolbar trigger in custom actions should open dropdown menu on click` broke with
|
|
49
|
+
`element ("*=Login") still not displayed after 10000ms`. Only that browser runs it (the spec is
|
|
50
|
+
Chrome-guarded), so it surfaces as 1 broken.
|
|
51
|
+
|
|
52
|
+
**Not a defect.** Reproduced against NEXT/d3 at the SDK viewport (1920×1080): the click opens the
|
|
53
|
+
`DSDropdownMenuV2` (`dropdown-menu-listbox` + `ds-floating-wrapper-root` present), `Login` resolves to
|
|
54
|
+
a single visible `<p>`, not clipped by any overflow ancestor and not occluded (`elementFromPoint` at
|
|
55
|
+
its center returns the element), and it stays open at 3s. Selectors, story and package are correct.
|
|
56
|
+
Passed 100% locally, broke 100% in cloud → the delta is real-Chrome + BrowserStack +
|
|
57
|
+
`browser.maximizeWindow()` (cloud-only).
|
|
58
|
+
|
|
59
|
+
**Root cause:** the pattern "one-shot click on a toggle + `waitForDisplayed` on a deep descendant" is
|
|
60
|
+
fragile. If the click doesn't leave the menu open in that driver, the wait sits the full 10s on a menu
|
|
61
|
+
that never opened.
|
|
62
|
+
|
|
63
|
+
**Fix:** wait for the trigger to be clickable, click it, then assert the `DSDropdownMenuV2` item
|
|
64
|
+
wrapper (`getToolbarMenuByIndex` → `ds-menuitem-menu-item-wrapper`) is displayed _before_ checking the
|
|
65
|
+
first option, and tag-qualify the option selector as `p*=Login` (`DSTypography variant="b1"` renders a
|
|
66
|
+
`<p>`). The SDK's retries absorb residual flakiness. Optional broader mitigation: enable
|
|
67
|
+
`config.specFileRetries` in `wdio.config.mjs`.
|
|
68
|
+
|
|
69
|
+
## input-inside func — `data-testid` is on the `<input>`, not a wrapper
|
|
70
|
+
|
|
71
|
+
`DSInputText` forwards `data-testid` through its global attributes straight onto `StyledInput`, i.e.
|
|
72
|
+
the `<input>` element. A descendant selector like `[data-testid="task-name"] input` matches nothing
|
|
73
|
+
and breaks on every browser. Target the testid directly.
|
|
74
|
+
|
|
75
|
+
## Open defects from the native POC — re-verify against ds-accordion
|
|
76
|
+
|
|
77
|
+
These were logged against `ds-accordion-native` while it was a separate POC package. Now that
|
|
78
|
+
`ds-accordion` ships the native engine, **each needs re-verification against `ds-accordion`** before
|
|
79
|
+
being closed or re-pointed — they are listed here so the findings are not lost with the deleted suite,
|
|
80
|
+
not as confirmed `ds-accordion` defects.
|
|
81
|
+
|
|
82
|
+
| Ticket | Summary |
|
|
83
|
+
| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
84
|
+
| [PUI-18640](https://jira.elliemae.io/browse/PUI-18640) | Content-container slot did not apply style-props — `maxHeight`/`overflow` (scrollable-content) and padding `p` (XstyledpropsInContent) — the way pre-migration `ds-accordion` did. Breaking for consumers styling content via the slot. |
|
|
85
|
+
| [PUI-18641](https://jira.elliemae.io/browse/PUI-18641) | Default title behavior changed from truncate-with-tooltip to wrap. With `wrapLabel={false}` the title truncates but shows no tooltip on hover → full text unreadable. Backwards-incompatible default + readability gap. |
|
|
86
|
+
| [PUI-18642](https://jira.elliemae.io/browse/PUI-18642) | Arrow Icon visual spec violations (Accordion Draft v1.5.0): region width is not the spec'd 20px; when the title wraps the icon is center-aligned instead of top-aligned ("Fixed Top-aligned — Region A"). |
|
|
87
|
+
| [PUI-18695](https://jira.elliemae.io/browse/PUI-18695) | _Safari-only:_ Tab does not move focus between accordion headers after a click. Click-focus, focus ring and Enter all work; only Tab traversal is broken. Found by E2E visual PUI-14324 - 02 (Safari). |
|
|
88
|
+
|
|
89
|
+
Related upstream: [WebKit bug #319162](https://bugs.webkit.org/show_bug.cgi?id=319162) — in Safari,
|
|
90
|
+
tabbing away from a `<summary>` that contains nested elements after **mouse** activation does not
|
|
91
|
+
advance focus correctly. Keyboard-only navigation is unaffected. Unresolved upstream.
|
|
92
|
+
|
|
93
|
+
## Known visual baseline note — slots (`PUI-15348 - 01`)
|
|
94
|
+
|
|
95
|
+
Percy flagged a ~0.05% diff: a small lavender box at the left of each "… Secondary" row. Not a
|
|
96
|
+
regression. `StyledHeading` moved from `display: contents` → `display: flex`; an element with
|
|
97
|
+
`display: contents` generates no box and therefore never paints its `background`, so the `SlotsTest`
|
|
98
|
+
story's lavender `item-heading` background was silently dropped before and paints now. Only visible in
|
|
99
|
+
that synthetic story (every slot painted a loud color). Re-approve the baseline if it resurfaces.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
_Historical detail (A/B/C/D divergence audit, Percy mechanism, run commands) lived in
|
|
104
|
+
`stories/ds-accordion-native/POC_FINDINGS.md`, removed in PUI-18742. Recover with
|
|
105
|
+
`git show 3468ca3ccb4^:stories/ds-accordion-native/POC_FINDINGS.md`._
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
|
+
import { Key } from 'webdriverio';
|
|
3
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
4
|
+
import { axeCoreCheck } from '../../helpers';
|
|
5
|
+
|
|
6
|
+
if (
|
|
7
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
8
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
9
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
10
|
+
browser.capabilities.browserName === 'Chrome'
|
|
11
|
+
) {
|
|
12
|
+
describe('PUI-14353 - Accordion:: ApplyAriaDisabled prop - axe-core', () => {
|
|
13
|
+
before('loading page', async () => {
|
|
14
|
+
const errorOnGo = await DSAccordionCO.applyAriaDisabled.go();
|
|
15
|
+
if (errorOnGo) throw errorOnGo;
|
|
16
|
+
});
|
|
17
|
+
it('01: should display accordion with aria-disabled and pass axecore scan', async () => {
|
|
18
|
+
const firstItem = await DSAccordionCO.getAccordionHeader(0);
|
|
19
|
+
await firstItem.waitForDisplayed();
|
|
20
|
+
await browser.keys(Key.Tab);
|
|
21
|
+
const result = await axeCoreCheck();
|
|
22
|
+
expect(result.length).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
3
|
+
|
|
4
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
5
|
+
describe('PUI-14324 - Accordion:: ApplyAriaDisabled prop - visual tests', () => {
|
|
6
|
+
before('loading page', async () => {
|
|
7
|
+
const errorOnGo = await DSAccordionCO.applyAriaDisabled.go();
|
|
8
|
+
if (errorOnGo) throw errorOnGo;
|
|
9
|
+
});
|
|
10
|
+
it('01: first Accordion item should be focused and content not displayed - click', async () => {
|
|
11
|
+
const firstItem = await DSAccordionCO.getAccordionHeader(0);
|
|
12
|
+
await firstItem.click();
|
|
13
|
+
const snapshot = await browser.checkSnapshot(DSAccordionCO.snapshotPath('accordion-aria-disabled-focused-mouse'));
|
|
14
|
+
await expect(snapshot).toEqual(0);
|
|
15
|
+
});
|
|
16
|
+
it('02: second Accordion item should be focused and content not displayed - Tab + Enter', async () => {
|
|
17
|
+
await browser.keys(Key.Tab);
|
|
18
|
+
await browser.keys(Key.Enter);
|
|
19
|
+
const snapshot = await browser.checkSnapshot(DSAccordionCO.snapshotPath('accordion-aria-disabled-focused-keys'));
|
|
20
|
+
await expect(snapshot).toEqual(0);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
2
|
+
|
|
3
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
4
|
+
// New coverage for the ControlledTest story (previously untested).
|
|
5
|
+
describe('PUI-18650 - Accordion, controlled -func', () => {
|
|
6
|
+
before('loading page', async () => {
|
|
7
|
+
const errorOnGo = await DSAccordionCO.controlled.go();
|
|
8
|
+
if (errorOnGo) throw errorOnGo;
|
|
9
|
+
});
|
|
10
|
+
it('01: single-open: opening another item collapses the previously open one', async () => {
|
|
11
|
+
await expect(await DSAccordionCO.getAccordionHeader(0)).toHaveAttribute('aria-expanded', 'true');
|
|
12
|
+
await (await DSAccordionCO.getAccordionHeader(1)).click();
|
|
13
|
+
await expect(await DSAccordionCO.getAccordionHeader(1)).toHaveAttribute('aria-expanded', 'true');
|
|
14
|
+
await expect(await DSAccordionCO.getAccordionHeader(0)).toHaveAttribute('aria-expanded', 'false');
|
|
15
|
+
});
|
|
16
|
+
it('02: multiple-open: opening two items keeps both expanded', async () => {
|
|
17
|
+
await (await DSAccordionCO.getAccordionHeader(3)).click();
|
|
18
|
+
await (await DSAccordionCO.getAccordionHeader(4)).click();
|
|
19
|
+
await expect(await DSAccordionCO.getAccordionHeader(3)).toHaveAttribute('aria-expanded', 'true');
|
|
20
|
+
await expect(await DSAccordionCO.getAccordionHeader(4)).toHaveAttribute('aria-expanded', 'true');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
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
|
+
// Structural coverage for custom actions living OUTSIDE the disclosure trigger.
|
|
10
|
+
// Originally written for PUI-17912 (custom actions moved out of the role="heading" container).
|
|
11
|
+
// PUI-18742 migrated ds-accordion to a native <details>/<summary> disclosure, which supersedes
|
|
12
|
+
// that fix: the <summary> IS the toggle, the heading container now sits INSIDE it, and heading
|
|
13
|
+
// semantics (role="heading" + aria-level) are opt-in per consumer via the
|
|
14
|
+
// dsAccordionItemHeaderContainer slot prop — see role/DSAccordion.role-heading.func.spec.js.
|
|
15
|
+
// The invariant that still matters here: nothing interactive is nested inside the trigger.
|
|
16
|
+
describe('PUI-18621 - DSAccordion:: heading container structure after renderCustomActions fix - func', () => {
|
|
17
|
+
before('loading page', async () => {
|
|
18
|
+
const errorOnGo = await DSAccordionCO.headerControls.go();
|
|
19
|
+
if (errorOnGo) throw errorOnGo;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('01: summary trigger should wrap the heading container and no other interactive elements', async () => {
|
|
23
|
+
const trigger = await DSAccordionCO.getAccordionHeader(0);
|
|
24
|
+
await expect(await trigger.getTagName()).toBe('summary');
|
|
25
|
+
|
|
26
|
+
const headingContainer = await DSAccordionCO.getAccordionItemHeaderContainerByIndex(0);
|
|
27
|
+
await expect(headingContainer).toExist();
|
|
28
|
+
|
|
29
|
+
// The <summary> is the toggle itself, so no nested <button> may live inside it.
|
|
30
|
+
const buttonsInsideTrigger = await trigger.$$('button');
|
|
31
|
+
await expect(buttonsInsideTrigger.length).toBe(0);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('02: custom actions container should exist outside the heading container', async () => {
|
|
35
|
+
const customActionsContainer = await DSAccordionCO.getAccordionItemHeaderCustomActionsContainerByIndex(0);
|
|
36
|
+
await expect(customActionsContainer).toExist();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('03: action buttons in custom actions container should reflect correct enabled/disabled state', async () => {
|
|
40
|
+
const enabledContainer = await DSAccordionCO.getAccordionItemHeaderCustomActionsContainerByIndex(0);
|
|
41
|
+
const enabledButton = await enabledContainer.$('[data-testid="ds-button"]');
|
|
42
|
+
await expect(enabledButton).toBeDisplayed();
|
|
43
|
+
await expect(enabledButton).toBeEnabled();
|
|
44
|
+
|
|
45
|
+
const disabledContainer = await DSAccordionCO.getAccordionItemHeaderCustomActionsContainerByIndex(2);
|
|
46
|
+
const disabledButton = await disabledContainer.$('[data-testid="ds-button"]');
|
|
47
|
+
await expect(disabledButton).toBeDisplayed();
|
|
48
|
+
await expect(disabledButton).not.toBeEnabled();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('04: toolbar trigger in custom actions should open dropdown menu on click', async () => {
|
|
52
|
+
// Hardened after the cloud-only "Login not displayed" flake (see QA_NOTES.md): wait for the
|
|
53
|
+
// trigger to be clickable, then assert the DSDropdownMenuV2 item wrapper is displayed before
|
|
54
|
+
// reaching for the option, so a menu that never opened fails fast instead of burning the
|
|
55
|
+
// 10s waitForDisplayed. `p*=Login` is tag-qualified — DSTypography variant="b1" renders a <p>.
|
|
56
|
+
const toolbar = await DSAccordionCO.getToolbarByIndex(0);
|
|
57
|
+
await toolbar.waitForClickable({ timeout: 10000 });
|
|
58
|
+
await toolbar.click();
|
|
59
|
+
const menu = await DSAccordionCO.getToolbarMenuByIndex(0);
|
|
60
|
+
await expect(menu).toBeDisplayed();
|
|
61
|
+
const firstMenuOption = await $('p*=Login');
|
|
62
|
+
await expect(firstMenuOption).toBeDisplayed();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
2
|
+
|
|
3
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
4
|
+
// New coverage for the PUI9261InputInside story (previously untested).
|
|
5
|
+
describe('PUI-18651 - Accordion, input inside content -func', () => {
|
|
6
|
+
before('loading page', async () => {
|
|
7
|
+
const errorOnGo = await DSAccordionCO.inputInside.go();
|
|
8
|
+
if (errorOnGo) throw errorOnGo;
|
|
9
|
+
});
|
|
10
|
+
it('01: should type into an input rendered inside the open accordion item', async () => {
|
|
11
|
+
// DSInputText forwards `data-testid` through its global attributes onto the <input> itself
|
|
12
|
+
// (StyledInput), not onto the wrapper — so the testid IS the input, never its ancestor.
|
|
13
|
+
const input = await $('[data-testid="task-name"]');
|
|
14
|
+
await input.waitForDisplayed();
|
|
15
|
+
await input.setValue('Test task');
|
|
16
|
+
await expect(input).toHaveValue('Test task');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
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-17165 - Accordion: Role heading', () => {
|
|
11
|
+
before('loading page', async () => {
|
|
12
|
+
const errorOnGo = await DSAccordionCO.subtitle.go();
|
|
13
|
+
if (errorOnGo) throw errorOnGo;
|
|
14
|
+
});
|
|
15
|
+
it('01: should have role heading on accordion item header', async () => {
|
|
16
|
+
const header = await DSAccordionCO.getAccordionItemHeaderContainerByIndex(0);
|
|
17
|
+
await expect(header).toHaveAttribute('role', 'heading');
|
|
18
|
+
await expect(header).toHaveAttribute('aria-level', '2');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* eslint-disable wdio/no-pause */
|
|
2
|
+
import { Key } from 'webdriverio';
|
|
3
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
4
|
+
|
|
5
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
6
|
+
describe('PUI-17174 - Accordion: Scrollable content -Visual', () => {
|
|
7
|
+
before('loading page', async () => {
|
|
8
|
+
const errorOnGo = await DSAccordionCO.scrollableContent.go();
|
|
9
|
+
if (errorOnGo) throw errorOnGo;
|
|
10
|
+
});
|
|
11
|
+
it('01: should display first accordion header focused', async () => {
|
|
12
|
+
await browser.eyesOpen();
|
|
13
|
+
await (await DSAccordionCO.getAccordionHeader(1)).waitForDisplayed();
|
|
14
|
+
await browser.keys(Key.Tab);
|
|
15
|
+
await browser.keys(Key.Return);
|
|
16
|
+
const snapshot = await browser.eyesCheckSnapshot(DSAccordionCO.snapshotPath('accordion-scrollable-default'));
|
|
17
|
+
await expect(snapshot).toEqual(0);
|
|
18
|
+
});
|
|
19
|
+
it('02: should display scrollable content focused', async () => {
|
|
20
|
+
await browser.eyesOpen();
|
|
21
|
+
await browser.keys(Key.ArrowDown);
|
|
22
|
+
await browser.keys(Key.ArrowUp);
|
|
23
|
+
await browser.keys(Key.Tab);
|
|
24
|
+
await (await DSAccordionCO.getAccordionHeader(1)).waitForDisplayed();
|
|
25
|
+
const snapshot = await browser.eyesCheckSnapshot(DSAccordionCO.snapshotPath('accordion-scrollable-top'));
|
|
26
|
+
await expect(snapshot).toEqual(0);
|
|
27
|
+
});
|
|
28
|
+
it('03: should display scrollable content scrolled to the bottom', async () => {
|
|
29
|
+
await browser.eyesOpen();
|
|
30
|
+
await browser.keys(Key.ArrowDown);
|
|
31
|
+
await browser.keys(Key.ArrowDown);
|
|
32
|
+
await browser.keys(Key.ArrowDown);
|
|
33
|
+
await browser.keys(Key.ArrowDown);
|
|
34
|
+
await browser.keys(Key.ArrowDown);
|
|
35
|
+
await browser.keys(Key.ArrowDown);
|
|
36
|
+
await browser.keys(Key.ArrowDown);
|
|
37
|
+
await (await DSAccordionCO.getAccordionHeader(1)).waitForDisplayed();
|
|
38
|
+
const snapshot = await browser.eyesCheckSnapshot(DSAccordionCO.snapshotPath('accordion-scrollable-bottom'));
|
|
39
|
+
await expect(snapshot).toEqual(0);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
|
+
import DSAccordionCO from '../DSAccordionCO';
|
|
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-15347 - Accordion: Slots -AxeCore', () => {
|
|
12
|
+
before('loading page', async () => {
|
|
13
|
+
const errorOnGo = await DSAccordionCO.slotsURL.go();
|
|
14
|
+
if (errorOnGo) throw errorOnGo;
|
|
15
|
+
});
|
|
16
|
+
it('01: should have accordion with custom slots (aria & data) and pass axe-core scan', async () => {
|
|
17
|
+
const header = await DSAccordionCO.getAccordionItemHeaderPrimaryTitleSlotByIndex(0);
|
|
18
|
+
await header.click();
|
|
19
|
+
const content = await DSAccordionCO.getAccordionItemContentContainerSlotByIndex(0);
|
|
20
|
+
await content.waitForDisplayed();
|
|
21
|
+
const result = await axeCoreCheck();
|
|
22
|
+
expect(result.length).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|