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
@@ -0,0 +1,200 @@
1
+ /* eslint-disable max-lines */
2
+ import { Key } from 'webdriverio';
3
+ import DSAccordionNativeCO from './DSAccordionNativeCO';
4
+
5
+ if (!browser.capabilities['ice:options'].isPhone) {
6
+ describe('PUI-18083 - AccordionNative, basic -func', () => {
7
+ before('loading page', async () => {
8
+ const errorOnGo = await DSAccordionNativeCO.basicURL.go();
9
+ if (errorOnGo) throw errorOnGo;
10
+ });
11
+ it('01: should display the accordion closed', async () => {
12
+ const firstContent = await DSAccordionNativeCO.getContents(1);
13
+ await expect(firstContent).not.toBeDisplayedInViewport();
14
+ });
15
+ it('02: should open the accordion', async () => {
16
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
17
+ const firstContent = await DSAccordionNativeCO.getContents(1);
18
+ await expect(firstContent).toBeDisplayedInViewport();
19
+ });
20
+ it('03: should open the third accordion closing the second', async () => {
21
+ await (await DSAccordionNativeCO.getAccordionHeader(2)).click();
22
+ const firstContent = await DSAccordionNativeCO.getContents(1);
23
+ const secondContent = await DSAccordionNativeCO.getContents(2);
24
+ await expect(firstContent).not.toBeDisplayedInViewport();
25
+ await expect(secondContent).toBeDisplayedInViewport();
26
+ });
27
+ it('04: should close the accordion', async () => {
28
+ await (await DSAccordionNativeCO.getAccordionHeader(2)).click();
29
+ const secondContent = await DSAccordionNativeCO.getContents(2);
30
+ await expect(secondContent).not.toBeDisplayedInViewport();
31
+ });
32
+ });
33
+ }
34
+
35
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
36
+ describe('PUI-18083 - AccordionNative, multiple -func', () => {
37
+ before('loading page', async () => {
38
+ const errorOnGo = await DSAccordionNativeCO.multipleURL.go();
39
+ if (errorOnGo) throw errorOnGo;
40
+ });
41
+ it('01: should display the accordion expanded', async () => {
42
+ await (await DSAccordionNativeCO.getAccordionHeader(0)).click();
43
+ const firstContent = await DSAccordionNativeCO.getContents(0);
44
+ await expect(firstContent).toBeDisplayedInViewport();
45
+ });
46
+ it('02: should open the second accordion without closing the first', async () => {
47
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
48
+ const firstContent = await DSAccordionNativeCO.getContents(0);
49
+ const secondContent = await DSAccordionNativeCO.getContents(1);
50
+ await expect(firstContent).toBeDisplayedInViewport();
51
+ await expect(secondContent).toBeDisplayedInViewport();
52
+ });
53
+ it('03: should close the second accordion', async () => {
54
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
55
+ const firstContent = await DSAccordionNativeCO.getContents(0);
56
+ const secondContent = await DSAccordionNativeCO.getContents(1);
57
+ await expect(firstContent).toBeDisplayedInViewport();
58
+ await expect(secondContent).not.toBeDisplayedInViewport();
59
+ });
60
+ it('04: should close the first accordion', async () => {
61
+ await (await DSAccordionNativeCO.getAccordionHeader(0)).click();
62
+ const firstContent = await DSAccordionNativeCO.getContents(0);
63
+ const secondContent = await DSAccordionNativeCO.getContents(1);
64
+ await expect(firstContent).not.toBeDisplayedInViewport();
65
+ await expect(secondContent).not.toBeDisplayedInViewport();
66
+ });
67
+ });
68
+
69
+ describe('PUI-18083 - AccordionNative, keyboard nav -a11y', () => {
70
+ before('loading page', async () => {
71
+ const errorOnGo = await DSAccordionNativeCO.customActions.go();
72
+ if (errorOnGo) throw errorOnGo;
73
+ });
74
+ it('01: should press tab and focus on first accordion', async () => {
75
+ const firstAccordion = await DSAccordionNativeCO.getAccordionHeader(0);
76
+ await browser.keys(Key.Tab);
77
+ await expect(firstAccordion).toBeFocused();
78
+ });
79
+ // The POC renders the custom action as a SIBLING of <summary>, not inside it,
80
+ // so tabbing from summary lands on the action button next — same observable
81
+ // tab order as the prod accordion, achieved via DOM order instead of slot
82
+ // embedding.
83
+ it('02: should focus the first accordion button after press tab', async () => {
84
+ await browser.keys(Key.Tab);
85
+ const firstButton = await DSAccordionNativeCO.getButtonsByIndex(0);
86
+ await expect(firstButton).toBeFocused();
87
+ });
88
+ it('03: should focus the second accordion and expand it after press tab and space', async () => {
89
+ await browser.keys(Key.Tab);
90
+ await browser.keys(Key.Space);
91
+ const secondAccordion = await DSAccordionNativeCO.getAccordionHeader(1);
92
+ const secondContent = await DSAccordionNativeCO.getContents(1);
93
+ await expect(secondAccordion).toBeFocused();
94
+ await expect(secondContent).toBeDisplayedInViewport();
95
+ });
96
+ it('04: should go back to the button when pressing shift+tab (goes backwards)', async () => {
97
+ await browser.keys([Key.Shift, Key.Tab]);
98
+ const firstButton = await DSAccordionNativeCO.getButtonsByIndex(0);
99
+ await expect(firstButton).toBeFocused();
100
+ });
101
+ });
102
+
103
+ describe('PUI-18083 - AccordionNative, Custom actions with hooks', () => {
104
+ before('loading page', async () => {
105
+ const errorOnGo = await DSAccordionNativeCO.customActionHooks.go();
106
+ if (errorOnGo) throw errorOnGo;
107
+ });
108
+ it('01: should have custom actions rendered with ON text by default', async () => {
109
+ const customAction1text = await (await DSAccordionNativeCO.getButtonsByIndex(0)).getText();
110
+ const customAction2text = await (await DSAccordionNativeCO.getButtonsByIndex(1)).getText();
111
+ const customAction3text = await (await DSAccordionNativeCO.getButtonsByIndex(2)).getText();
112
+ await expect(customAction1text).toEqual('on');
113
+ await expect(customAction2text).toEqual('on');
114
+ await expect(customAction3text).toEqual('on');
115
+ });
116
+ it('02: should re-render the first two custom actions when activating them to have OFF text', async () => {
117
+ const customAction1 = await DSAccordionNativeCO.getButtonsByIndex(0);
118
+ await customAction1.click();
119
+ await browser.keys(Key.Tab);
120
+ await browser.keys(Key.Enter);
121
+ await browser.keys(Key.Tab);
122
+ await browser.keys(Key.Enter);
123
+ const customAction1text = await customAction1.getText();
124
+ const customAction2text = await (await DSAccordionNativeCO.getButtonsByIndex(1)).getText();
125
+ const customAction3text = await (await DSAccordionNativeCO.getButtonsByIndex(2)).getText();
126
+ await expect(customAction1text).toEqual('off');
127
+ await expect(customAction2text).toEqual('off');
128
+ await expect(customAction3text).toEqual('on');
129
+ });
130
+ });
131
+
132
+ describe('PUI-18083 - AccordionNative, conditional render -Func', () => {
133
+ before('loading page', async () => {
134
+ const errorOnGo = await DSAccordionNativeCO.conditionalRender.go();
135
+ if (errorOnGo) throw errorOnGo;
136
+ });
137
+ it('01: should display second accordion when condition is true', async () => {
138
+ const headers = await DSAccordionNativeCO.getAccordionHeaders();
139
+ // BaseRate, BaseRate2, BaseRate3 — index 1 is BaseRate2.
140
+ await headers[1].click();
141
+ const secondContent = await DSAccordionNativeCO.getContents(1);
142
+ await expect(secondContent).toBeDisplayedInViewport();
143
+ });
144
+ it('02: should remove second accordion from DOM after toggle', async () => {
145
+ const toggleBtn = await $('[data-testid="toggle-btn"]');
146
+ await toggleBtn.click();
147
+ // After the toggle, only 2 items remain (BaseRate + BaseRate3). Asserting
148
+ // count is more robust than asserting visibility on a removed node.
149
+ const headers = await DSAccordionNativeCO.getAccordionHeaders();
150
+ await expect(headers.length).toEqual(2);
151
+ });
152
+ });
153
+
154
+ describe('PUI-18083 - AccordionNative, keep content mounted -a11y', () => {
155
+ before('loading page', async () => {
156
+ const errorOnGo = await DSAccordionNativeCO.keepContentURL.go();
157
+ if (errorOnGo) throw errorOnGo;
158
+ });
159
+ it('01: should have accordion closed and content existing in DOM by default', async () => {
160
+ const accordionContent = await $('[data-testid="accordion-native-keep-content"]');
161
+ await expect(accordionContent).toExist();
162
+ await expect(accordionContent).not.toBeDisplayed();
163
+ });
164
+ it('02: should have accordion expanded and content visible', async () => {
165
+ const firstAccordion = await DSAccordionNativeCO.getAccordionHeader(0);
166
+ await firstAccordion.click();
167
+ const accordionContent = await $('[data-testid="accordion-native-keep-content"]');
168
+ await expect(accordionContent).toBeDisplayed();
169
+ });
170
+ it('03: should have accordion closed and content still in DOM', async () => {
171
+ const firstAccordion = await DSAccordionNativeCO.getAccordionHeader(0);
172
+ await firstAccordion.click();
173
+ const accordionContent = await $('[data-testid="accordion-native-keep-content"]');
174
+ await expect(accordionContent).not.toBeDisplayed();
175
+ await expect(accordionContent).toExist();
176
+ });
177
+ });
178
+
179
+ // Native exposes a usable ref on the summary via the `dsAccordionnativeItemSummary` slot
180
+ // (verified: clicking the button focuses item 0's <summary>). Equivalent to the accordion
181
+ // FocusOnItem pattern (`dsAccordionItemHeader={{ innerRef }}`).
182
+ describe('PUI-18083 - AccordionNative, Focus with useRef -a11y', () => {
183
+ before('loading page', async () => {
184
+ const errorOnGo = await DSAccordionNativeCO.focusOnItemURL.go();
185
+ if (errorOnGo) throw errorOnGo;
186
+ });
187
+ it('01: should focus second item manually', async () => {
188
+ const secondAccordion = await DSAccordionNativeCO.getAccordionHeader(1);
189
+ await browser.keys(Key.Tab);
190
+ await browser.keys(Key.Tab);
191
+ await expect(secondAccordion).toBeFocused();
192
+ });
193
+ it('02: should use button to focus the first accordion item via ref', async () => {
194
+ const focusButton = await DSAccordionNativeCO.getButtonsByIndex(0);
195
+ await focusButton.click();
196
+ const firstAccordion = await DSAccordionNativeCO.getAccordionHeader(0);
197
+ await expect(firstAccordion).toBeFocused();
198
+ });
199
+ });
200
+ }
@@ -0,0 +1,158 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSAccordionNativeCO from './DSAccordionNativeCO';
3
+ import { mouseOver } from '../helpers';
4
+
5
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
+ // Percy-aligned with ds-accordion (same describe + it titles) so snapshots compare
7
+ // against the accordion baseline. Story content is equivalent. See POC_FINDINGS.md.
8
+ describe('PUI-6111 - Accordion visual tests, basic', () => {
9
+ before('loading page', async () => {
10
+ const errorOnGo = await DSAccordionNativeCO.basicURL.go();
11
+ if (errorOnGo) throw errorOnGo;
12
+ });
13
+ it('01: should display all closed', async () => {
14
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).waitForDisplayed();
15
+ const snapshot = await browser.checkSnapshot(DSAccordionNativeCO.snapshotPath('accordion-native-closed'));
16
+ await expect(snapshot).toEqual(0);
17
+ });
18
+ it('02: should display open first one', async () => {
19
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).waitForDisplayed();
20
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
21
+ const snapshot = await browser.checkSnapshot(DSAccordionNativeCO.snapshotPath('accordion-native-one-open'));
22
+ await expect(snapshot).toEqual(0);
23
+ });
24
+ it('03: should display focus on the second, hover on third', async () => {
25
+ await mouseOver(await DSAccordionNativeCO.getAccordionHeader(2));
26
+ const snapshot = await browser.checkSnapshot(
27
+ DSAccordionNativeCO.snapshotPath('accordion-native-interacted-states'),
28
+ );
29
+ await expect(snapshot).toEqual(0);
30
+ });
31
+ });
32
+
33
+ // Percy-aligned with ds-accordion: the native HeaderControlExamples story now renders the same
34
+ // 3 sections incl. the MiniToolbar (DDmenu), so this snapshot compares against the accordion
35
+ // baseline and surfaces the real layout deltas. See POC_FINDINGS.md.
36
+ describe('PUI-7979 - Accordion, header props -visual', () => {
37
+ before('loading page', async () => {
38
+ const errorOnGo = await DSAccordionNativeCO.headerControls.go();
39
+ if (errorOnGo) throw errorOnGo;
40
+ });
41
+ it('01: should display accordion expanded with header props', async () => {
42
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).waitForDisplayed();
43
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
44
+ const content = await DSAccordionNativeCO.getContents(1);
45
+ await content.waitForDisplayed();
46
+ const snapshot = await browser.checkSnapshot(DSAccordionNativeCO.snapshotPath('accordion-native-header-props'));
47
+ await expect(snapshot).toEqual(0);
48
+ });
49
+ it('02: should display accordion with open toolbar', async () => {
50
+ await (await DSAccordionNativeCO.getToolbarByIndex(1)).click();
51
+ const snapshot = await browser.checkSnapshot(DSAccordionNativeCO.snapshotPath('accordion-native-toolbar-props'));
52
+ await expect(snapshot).toEqual(0);
53
+ });
54
+ });
55
+
56
+ // Percy-aligned with ds-accordion. Story content is equivalent. See POC_FINDINGS.md.
57
+ describe('PUI-7772 - Accordion, custom actions -visual', () => {
58
+ before('loading page', async () => {
59
+ const errorOnGo = await DSAccordionNativeCO.customActions.go();
60
+ if (errorOnGo) throw errorOnGo;
61
+ });
62
+ it('01: should display accordion with custom actions collapsed', async () => {
63
+ const snapshot = await browser.checkSnapshot(
64
+ DSAccordionNativeCO.snapshotPath('accordion-native-customactions-col'),
65
+ );
66
+ await expect(snapshot).toEqual(0);
67
+ });
68
+ it('02: should display accordion with custom actions expanded', async () => {
69
+ await (await DSAccordionNativeCO.getAccordionHeader(0)).waitForDisplayed();
70
+ await (await DSAccordionNativeCO.getAccordionHeader(0)).click();
71
+ const snapshot = await browser.checkSnapshot(
72
+ DSAccordionNativeCO.snapshotPath('accordion-native-customactions-exp'),
73
+ );
74
+ await expect(snapshot).toEqual(0);
75
+ });
76
+ });
77
+
78
+ // Percy-aligned with ds-accordion. Story content is identical. See POC_FINDINGS.md.
79
+ describe('PUI-7982 - Accordion, multiple -visual', () => {
80
+ before('loading page', async () => {
81
+ const errorOnGo = await DSAccordionNativeCO.multipleURL.go();
82
+ if (errorOnGo) throw errorOnGo;
83
+ });
84
+ it('01: should corectly display two expanded accordions', async () => {
85
+ await (await DSAccordionNativeCO.getAccordionHeader(0)).click();
86
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
87
+ const firstContent = await DSAccordionNativeCO.getContents(0);
88
+ const secondContent = await DSAccordionNativeCO.getContents(1);
89
+ await firstContent.waitForDisplayed();
90
+ await secondContent.waitForDisplayed();
91
+ const snapshot = await browser.checkSnapshot(DSAccordionNativeCO.snapshotPath('accordion-native-two-expanded'));
92
+ await expect(snapshot).toEqual(0);
93
+ });
94
+ });
95
+
96
+ // Percy-aligned with ds-accordion: both stories now render the same deterministic tall content
97
+ // (40 plain rows), so this snapshot compares against the accordion baseline. The accordion story
98
+ // previously used the legacy ds-legacy-datagrids; replaced for determinism + parity. See QA_NOTES.
99
+ describe('PUI-8321 - Accordion, global height -visual', () => {
100
+ before('loading page', async () => {
101
+ const errorOnGo = await DSAccordionNativeCO.globalHeight.go();
102
+ if (errorOnGo) throw errorOnGo;
103
+ });
104
+ it('01: should display accordion with global height, not trimmed', async () => {
105
+ const addRow = await $('[data-testid="add-row"]');
106
+ await addRow.click();
107
+ await addRow.click();
108
+ await addRow.click();
109
+ const content = await DSAccordionNativeCO.getContents(0);
110
+ await content.waitForDisplayed();
111
+ const snapshot = await browser.checkSnapshot(DSAccordionNativeCO.snapshotPath('accordion-native-globalheight'));
112
+ await expect(snapshot).toEqual(0);
113
+ });
114
+ });
115
+
116
+ // Percy-aligned with ds-accordion. Interactions restored to match accordion (Tab x2 to focus the
117
+ // input, then open the date picker) so the captured states match. See POC_FINDINGS.md.
118
+ describe('PUI-9964 - Accordion, Actionable within -visual', () => {
119
+ before('loading page', async () => {
120
+ const errorOnGo = await DSAccordionNativeCO.datepickerInside.go();
121
+ if (errorOnGo) throw errorOnGo;
122
+ });
123
+ it('01: should input focused within accordion', async () => {
124
+ await browser.keys(Key.Tab);
125
+ await browser.keys(Key.Tab);
126
+ const snapshot = await browser.checkSnapshot(
127
+ DSAccordionNativeCO.snapshotPath('accordion-native-datepicker-inside'),
128
+ );
129
+ await expect(snapshot).toEqual(0);
130
+ });
131
+ it('02: should opened datepicker', async () => {
132
+ const datepicker = await DSAccordionNativeCO.getDatepickerBtn();
133
+ await datepicker.click();
134
+ const snapshot = await browser.checkSnapshot(
135
+ DSAccordionNativeCO.snapshotPath('accordion-native-datepicker-open'),
136
+ );
137
+ await expect(snapshot).toEqual(0);
138
+ });
139
+ });
140
+ }
141
+
142
+ if (browser.capabilities['ice:options'].isPhone) {
143
+ // Not Percy-aligned: accordion swaps to DSMobileAccordion on phone; native renders itself.
144
+ // Different components. Kept under PUI-18083. See POC_FINDINGS.md.
145
+ describe('PUI-18083 - AccordionNative, desktop to mobile -visual', () => {
146
+ before('loading page', async () => {
147
+ const errorOnGo = await DSAccordionNativeCO.toMobileURL.go();
148
+ if (errorOnGo) throw errorOnGo;
149
+ });
150
+ it('01: should expand one accordion and hover the other', async () => {
151
+ await (await DSAccordionNativeCO.getAccordionHeader(1)).click();
152
+ const snapshot = await browser.checkSnapshot(
153
+ DSAccordionNativeCO.snapshotPath('accordion-native-tomobile-interacted'),
154
+ );
155
+ await expect(snapshot).toEqual(0);
156
+ });
157
+ });
158
+ }
@@ -0,0 +1,161 @@
1
+ /* eslint-disable import/no-relative-packages */
2
+ import { ACCORDION_NATIVE_DATA_TESTID } from '@elliemae/ds-accordion-native';
3
+ import { PATH_E2E_ACCORDION_NATIVE } from '../paths';
4
+ import { PageObject, Urlbuilder, getElementByIndex } from '../helpers';
5
+
6
+ export default class DSAccordionNativeCO extends PageObject {
7
+ // Desktop URLs
8
+ static basicURL = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'basic-test');
9
+
10
+ static multipleURL = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'multiple-test');
11
+
12
+ static controlled = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'controlled-test');
13
+
14
+ static disabled = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'disabled-test');
15
+
16
+ static applyAriaDisabled = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'apply-aria-disabled-test');
17
+
18
+ static subtitle = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'with-secondary-title-test');
19
+
20
+ static headerControls = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'header-control-examples-test');
21
+
22
+ static customActions = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'render-custom-actions-test');
23
+
24
+ static scrollableContent = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'scrollable-content-test');
25
+
26
+ static wrapLabel = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'wrap-label');
27
+
28
+ static toMobileURL = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'desktop-to-mobile-test');
29
+
30
+ static slotsURL = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'slots-test');
31
+
32
+ static customActionHooks = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'custom-actions-with-hooks');
33
+
34
+ static datepickerInside = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'actionable-within');
35
+
36
+ static conditionalRender = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'pui-11406-null-check');
37
+
38
+ static inputInside = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'pui-9261-input-inside');
39
+
40
+ static xstyledContent = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'xstyledprops-in-content');
41
+
42
+ static tooltip = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'tooltip');
43
+
44
+ static globalHeight = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'global-height');
45
+
46
+ static keepContentURL = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'keep-content-mounted');
47
+
48
+ static focusOnItemURL = new Urlbuilder(PATH_E2E_ACCORDION_NATIVE, 'focus-on-item-test');
49
+
50
+ // Snapshots
51
+ static snapshotPath(example = 'basic') {
52
+ return PageObject.getSnapshotPathBuilder('AccordionNative', example, 'ds-accordion-native');
53
+ }
54
+
55
+ // Core selectors
56
+ static async getWrapper() {
57
+ return $(`[data-testid="${ACCORDION_NATIVE_DATA_TESTID.ROOT}"]`);
58
+ }
59
+
60
+ // The POC's "click target" is <summary>; this is what gets focused / pressed /
61
+ // hovered in tests — equivalent to the prod accordion's "accordion header".
62
+ static async getAccordionHeaders() {
63
+ return $$(`[data-testid="${ACCORDION_NATIVE_DATA_TESTID.ITEM_SUMMARY}"]`);
64
+ }
65
+
66
+ static async getAccordionHeader(index) {
67
+ return (await this.getAccordionHeaders())[index];
68
+ }
69
+
70
+ static async getAccordionItems() {
71
+ return $$(`[data-testid="${ACCORDION_NATIVE_DATA_TESTID.ITEM_CONTAINER}"]`);
72
+ }
73
+
74
+ static async getAccordionItem(index) {
75
+ return (await this.getAccordionItems())[index];
76
+ }
77
+
78
+ // The POC keeps content inside <details>; visibility is driven by the native
79
+ // open state. `[open]` exists on the <details> element when the item is
80
+ // expanded — so we use that as the content-displayed signal.
81
+ static async getContents(index) {
82
+ const items = await this.getAccordionItems();
83
+ const item = items[index];
84
+ return item?.$(`[data-testid="${ACCORDION_NATIVE_DATA_TESTID.ITEM_CONTENT_CONTAINER}"]`);
85
+ }
86
+
87
+ static async getDetailsByIndex(index) {
88
+ const items = await this.getAccordionItems();
89
+ const item = items[index];
90
+ return item?.$(`[data-testid="${ACCORDION_NATIVE_DATA_TESTID.ITEM_DETAILS}"]`);
91
+ }
92
+
93
+ static async getHeadings() {
94
+ return $$(`[data-testid="${ACCORDION_NATIVE_DATA_TESTID.ITEM_HEADING}"]`);
95
+ }
96
+
97
+ static async getHeadingByIndex(index) {
98
+ return (await this.getHeadings())[index];
99
+ }
100
+
101
+ static async getButtons() {
102
+ return $$('[data-testid="ds-button"]');
103
+ }
104
+
105
+ static getButtonsByIndex = async (index) => getElementByIndex(this.getButtons, index);
106
+
107
+ static async getToolbarTriggers() {
108
+ return $$('[data-testid="ds-mini-toolbar__elipsis"]');
109
+ }
110
+
111
+ static getToolbarByIndex = async (index) => getElementByIndex(this.getToolbarTriggers, index);
112
+
113
+ static async getDatepickerBtn() {
114
+ return $('[data-testid="ds-controlled-date-time-picker-calendar-timewheel-trigger-icon"]');
115
+ }
116
+
117
+ // Slots (data-dimsum-slot attributes)
118
+ static async getAccordionContainerSlotByIndex(index = 0) {
119
+ return $$('[data-dimsum-slot="dsAccordionnativeRoot"]')[index];
120
+ }
121
+
122
+ static async getAccordionItemContainerSlotByIndex(index = 0) {
123
+ return $$('[data-dimsum-slot="dsAccordionnativeItemContainer"]')[index];
124
+ }
125
+
126
+ static async getAccordionItemDetailsSlotByIndex(index = 0) {
127
+ return $$('[data-dimsum-slot="dsAccordionnativeItemDetails"]')[index];
128
+ }
129
+
130
+ static async getAccordionItemSummarySlotByIndex(index = 0) {
131
+ return $$('[data-dimsum-slot="dsAccordionnativeItemSummary"]')[index];
132
+ }
133
+
134
+ static async getAccordionItemHeadingSlotByIndex(index = 0) {
135
+ return $$('[data-dimsum-slot="dsAccordionnativeItemHeading"]')[index];
136
+ }
137
+
138
+ static async getAccordionItemChevronSlotByIndex(index = 0) {
139
+ return $$('[data-dimsum-slot="dsAccordionnativeItemChevron"]')[index];
140
+ }
141
+
142
+ static async getAccordionItemTitlesContainerSlotByIndex(index = 0) {
143
+ return $$('[data-dimsum-slot="dsAccordionnativeItemTitlesContainer"]')[index];
144
+ }
145
+
146
+ static async getAccordionItemPrimaryTitleSlotByIndex(index = 0) {
147
+ return $$('[data-dimsum-slot="dsAccordionnativeItemPrimaryTitle"]')[index];
148
+ }
149
+
150
+ static async getAccordionItemSecondaryTitleSlotByIndex(index = 0) {
151
+ return $$('[data-dimsum-slot="dsAccordionnativeItemSecondaryTitle"]')[index];
152
+ }
153
+
154
+ static async getAccordionItemCustomActionsContainerSlotByIndex(index = 0) {
155
+ return $$('[data-dimsum-slot="dsAccordionnativeItemCustomActionsContainer"]')[index];
156
+ }
157
+
158
+ static async getAccordionItemContentContainerSlotByIndex(index = 0) {
159
+ return $$('[data-dimsum-slot="dsAccordionnativeItemContentContainer"]')[index];
160
+ }
161
+ }
@@ -0,0 +1,88 @@
1
+ # QA Notes — Native Accordion E2E parity (PUI-18083)
2
+
3
+ Quick map for reviewing results: which scenarios stayed **the same** (compared against accordion),
4
+ which were **modified** (present but NOT comparable), and which are **not covered** (gap, no test).
5
+
6
+ > **Key reading — what `PUI-18083` means in these specs:**
7
+ > In the **visual** specs, `PUI-18083` does NOT mean "untouched". It means the scenario was left
8
+ > **on purpose** under the native PUI because the story **renders something different** from the
9
+ > accordion one, so **Percy does NOT compare it** against accordion (it has its own native
10
+ > baseline). The ones tagged with an accordion PUI (`PUI-6111`, `PUI-7772`, …) **are** compared.
11
+ > In the **functional / axe** specs, all of them are under `PUI-18083` by design: they produce no
12
+ > snapshots and were never part of the Percy comparison.
13
+
14
+ ## Master table — VISUAL (what Percy compares)
15
+
16
+ | Scenario (story) | PUI in the test | Percy compares vs accordion? | State | Why |
17
+ | ------------------------------------------------------------- | --------------- | ---------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
18
+ | **basic** | `PUI-6111` | ✅ Yes | Same | Equivalent story |
19
+ | **custom actions** (RenderCustomActions) | `PUI-7772` | ✅ Yes | Same | Equivalent story |
20
+ | **multiple** | `PUI-7982` | ✅ Yes | Same | Identical story |
21
+ | **aria-disabled** (ApplyAriaDisabled) | `PUI-14324` | ✅ Yes | Same | Identical story |
22
+ | **scrollable-content** | `PUI-17174` | ✅ Yes | Same | Equivalent story — but the expected diff is **NOT cosmetic**: the native slot does not apply style-props → no scroll. Defect **[PUI-18640](https://jira.elliemae.io/browse/PUI-18640)** |
23
+ | **wrapLabel** | `PUI-17178` | ✅ Yes | Same | Equivalent story |
24
+ | **actionable-within** (01 input focused + 02 open datepicker) | `PUI-9964` | ✅ Yes | Same\* | \*`Tab`×2 restored for 01; 02 opens the same `DSControlledDateTimePicker` calendar (`getDatepickerBtn` CO method added). Diff reveals whether focus reaches the input (custom actions are siblings of `<summary>`) |
25
+ | **header props** (HeaderControlExamples) | `PUI-7979` | ✅ Yes | Same | The MiniToolbar (DDmenu) section was added to the native story so it matches accordion (3 sections); the diff now surfaces the real layout deltas |
26
+ | **global height** | `PUI-8321` | ✅ Yes | Same | Both stories: item 0 opened via `activeValue={0}` + an "Add row" button (legacy `ds-legacy-datagrids` removed). The **visual test clicks "Add row" ×3 then snapshots** → verifies the panel grows to fit and looks right (not trimmed) after adding rows |
27
+ | **slots** | `PUI-15348` | ✅ Yes | Same | Native consumes the same `styleOverrides` colors (verified in the DOM); the diff reflects the slot-tree mapping (native `summary/heading/chevron` vs accordion `header/header-container/addon`), not broken theming |
28
+ | **header props 02** (open toolbar) | `PUI-7979` | ✅ Yes | Same | Implemented in native: MiniToolbar section added + `getToolbarByIndex` CO method; the open-dropdown state compares against accordion |
29
+ | **actionable-within 02** (open datepicker) | `PUI-9964` | ✅ Yes | Same | Implemented: native renders the same `DSControlledDateTimePicker`; added `getDatepickerBtn` CO method + the 02 it |
30
+ | **desktop-to-mobile** | `PUI-18083` | ❌ No | Modified | Accordion swaps to `DSMobileAccordion`; native renders itself (different component) |
31
+ | **tooltip** | — | ⬜ Not present | Not covered | Native has no truncation tooltip; default is now wrap. Defect **[PUI-18641](https://jira.elliemae.io/browse/PUI-18641)** |
32
+ | **long content** | — | ⬜ Not present | Not covered | Accordion's PUI-9965 reuses the **Tooltip** story (hover long titles → truncation tooltip). Native has no tooltip → gap. See **[PUI-18641](https://jira.elliemae.io/browse/PUI-18641)** |
33
+
34
+ **How to read the Percy report:** every **✅ row** pairs against an accordion baseline (same snapshot
35
+ name). The only **❌ row** left is **desktop-to-mobile** (`PUI-18083`) — it generates a separate
36
+ native snapshot (different component), so if you see it "without baseline" or as new, that's expected;
37
+ don't compare it. The **⬜** rows generate nothing.
38
+
39
+ ## Table — FUNCTIONAL / AXE (native regression, NOT Percy)
40
+
41
+ All under `PUI-18083` by design: they produce no snapshots and are not compared visually. They are
42
+ the regression that proves functionality survives. Here "modified" = the dev **adapted** it to the
43
+ native DOM (correct), not that it is broken.
44
+
45
+ | Scenario | In native? | Note |
46
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
47
+ | basic, multiple, keyboard-nav, custom-actions-hooks, conditional-render, keep-content, disabled, header-controls, role-heading, slots, aria-disabled, **header-structure**, **controlled**, **input-inside** | ✅ Covered | Several **adapted** to the native DOM (`role=heading`→`<h3>`, id→index, `CellCO`→`data-testid`) — expected to **pass**. `header-structure` mirrors accordion PUI-18621; `controlled` + `input-inside` are new coverage added to **both** suites |
48
+ | **tooltip** (func + axe) | ⬜ Removed | Native has no tooltip — see [PUI-18641](https://jira.elliemae.io/browse/PUI-18641) |
49
+ | **useRef focus** (func + axe) | ✅ Covered | **Verified working in the browser**: passing `dsAccordionnativeItemSummary={{ innerRef }}` forwards a usable ref to the `<summary>` (clicking the button focuses item 0). Native story + func/axe restored. NB: the _item-level_ `innerRef` prop is not exposed, but the **summary slot** path works (native slots use `ds-system styled()` — same machinery as accordion's `dsAccordionItemHeader` innerRef) |
50
+ | **toolbar** (axe header-controls 02) | ✅ Covered | Added: MiniToolbar (DDmenu) in the story + `getToolbarByIndex` CO method; the axe 02 opens the dropdown and scans |
51
+
52
+ ## Story coverage parity (vs ds-accordion e2e)
53
+
54
+ All **21** `stories/ds-accordion/e2e` stories have a native counterpart — **no presence gap**. Test
55
+ coverage now matches the accordion suite, with these notes:
56
+
57
+ - **Added for parity:** native **`header-structure`** func (mirrors accordion PUI-18621); **`controlled`**
58
+ and **`input-inside`** func specs in **both** suites. **GlobalHeight** now has an "Add row" button and its
59
+ **visual test clicks it ×3 then snapshots** — the dynamic-growth/looks-right check lives in the visual
60
+ test (not a separate func test), since "global height" is fundamentally a visual concern.
61
+ - **Default-open nuance (documented, not a defect):** `ds-accordion` opens item 0 by default in the
62
+ GlobalHeight story while `ds-accordion-native` opens nothing when uncontrolled (`initialActive = null`).
63
+ Native **does support open-by-default** via `activeValue` (or the item `open` prop) — it just doesn't
64
+ auto-open the first item implicitly. The GlobalHeight stories now set `activeValue={0}` in both, so
65
+ this is moot for the test; a migrating consumer relying on the implicit auto-open would add `activeValue`.
66
+ - **Accordion `controlled` + `input-inside` describes use `PUI-XXXXX` placeholders** → they need new
67
+ JIRA test tickets. (Also fixed the accordion CO `inputInside` URL — it had a wrong-case story id.)
68
+ - **Still gaps (blocked on defects):** `tooltip` / `long-content` ([PUI-18641](https://jira.elliemae.io/browse/PUI-18641), no native tooltip);
69
+ `XstyledpropsInContent` ([PUI-18640](https://jira.elliemae.io/browse/PUI-18640) — content slot drops the `p` padding prop too).
70
+
71
+ ## Defects / parity findings
72
+
73
+ | Ticket | Component | Summary | Status |
74
+ | ------------------------------------------------------ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
75
+ | [PUI-18640](https://jira.elliemae.io/browse/PUI-18640) | ds-accordion-native | The `dsAccordionnativeItemContentContainer` slot **does not apply style-props** — `maxHeight`/`overflow` (scrollable-content) **and** padding `p` (XstyledpropsInContent) — the way `ds-accordion` does. Same story → accordion clips/scrolls/pads, native does not. **Breaking change** for consumers that style the content via the slot. Relates to PUI-18083. | Open |
76
+ | [PUI-18641](https://jira.elliemae.io/browse/PUI-18641) | ds-accordion-native | Default title behavior changed from **truncate-with-tooltip** (accordion) to **wrap** (native). With `wrapLabel={false}` the title truncates with an ellipsis but **still shows no tooltip on hover** → the full text cannot be read. No story demonstrates truncate+tooltip. **Backwards-incompatible** default + readability gap. Relates to PUI-18083. | Open |
77
+ | [PUI-18642](https://jira.elliemae.io/browse/PUI-18642) | ds-accordion-native | Arrow Icon visual spec violations (Accordion Draft v1.5.0): **(1)** region width is not the spec'd **20px**; **(2)** when the title wraps the Arrow Icon is **center-aligned instead of top-aligned** (spec: "Fixed Top-aligned — Region A"). Relates to PUI-18083. | Open |
78
+
79
+ > Why PUI-18640 is not a story bug: the native E2E story is a **faithful copy** of the accordion one
80
+ > (same `maxHeight: 100, overflow: 'auto'` passed as bare keys). In accordion it works because the
81
+ > slot interprets style-props; in native it does not. DOM evidence: accordion `max-height: 100px`
82
+ > (via the generated class) / native `max-height: none`. The native `examples/ScrollableContent`
83
+ > uses `style:{}` as a workaround.
84
+
85
+ ---
86
+
87
+ _Full detail (A/B/C/D divergence audit, Percy mechanism, and run commands) in
88
+ [`stories/ds-accordion-native/POC_FINDINGS.md`](../../stories/ds-accordion-native/POC_FINDINGS.md)._
@@ -0,0 +1,25 @@
1
+ /* eslint-disable max-lines */
2
+ import { Key } from 'webdriverio';
3
+ import DSAccordionNativeCO from '../DSAccordionNativeCO';
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-18083 - AccordionNative:: ApplyAriaDisabled prop - axe-core', () => {
13
+ before('loading page', async () => {
14
+ const errorOnGo = await DSAccordionNativeCO.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 DSAccordionNativeCO.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
+ }