dimsum-e2e-tests 3.80.0-next.4 → 3.80.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.
- package/CHANGELOG.md +164 -0
- package/DSStorybook/baseline.js +0 -186
- package/ds-accordion/DSAccordion.visual.spec.js +0 -14
- package/ds-accordion/DSAccordionCO.js +0 -2
- package/ds-apppicker/aria-disabled/DSAppPicker.aria-disabled.visual.spec.js +14 -1
- package/ds-apppicker/basic/DSAppPicker.basic.visual.spec.js +12 -7
- package/ds-banner/DSBanner.text-resize.visual.spec.js +2 -0
- package/ds-banner/DSBanner.text-wrapping.visual.spec.js +3 -6
- package/ds-banner/DSBanner.visual.spec.js +7 -8
- package/ds-banner/DSBannerCO.js +189 -4
- package/ds-banner/aria-and-role/DSBanner.aria-and-role.func.spec.js +113 -2
- package/ds-banner/ids/DSBanner.ids.func.spec.js +66 -0
- package/ds-banner/live-region-lang-dir/DSBanner.live-region-lang-dir.func.spec.js +54 -0
- package/ds-banner/slide-animation/DSBanner.slide-animation.func.spec.js +105 -0
- package/ds-banner/slots/DSBanner.slots.axe-core.func.spec.js +24 -0
- package/ds-banner/slots/DSBanner.slots.func.spec.js +13 -0
- package/ds-banner/slots/DSBanner.slots.visual.spec.js +3 -2
- package/ds-banner/title-element/DSBanner.title-element.func.spec.js +29 -0
- package/ds-chip/DSChip.axe-core.func.spec.js +0 -17
- package/ds-chip/DSChip.visual.spec.js +0 -22
- package/ds-chip/DSChipCO.js +0 -6
- package/ds-fast-list/DSFastListCO.js +37 -0
- package/ds-fast-list/basic/DSFastList.basic.axe-core.func.spec.js +28 -0
- package/ds-fast-list/basic/DSFastList.basic.visual.spec.js +23 -0
- package/ds-fast-list/scroll-to-index/DSFastList.scroll-to-index.func.spec.js +45 -0
- package/ds-indeterminate-progress-indicator/DSIndeterminateProgressIndicatorCO.js +4 -0
- package/ds-indeterminate-progress-indicator/accessible-name/DSIndeterminateProgressIndicator.accessible-name.func.spec.js +51 -0
- package/ds-leftnavigation/LeftNavigation.fullFeatures.axe-core.func.spec.js +37 -0
- package/ds-leftnavigation/LeftNavigation.isSkeleton.axe-core.func.spec.js +23 -0
- package/ds-leftnavigation/LeftNavigation.keepingItems.axe-core.func.spec.js +34 -0
- package/ds-leftnavigation/LeftNavigation.loadingIndicator.axe-core.func.spec.js +41 -0
- package/ds-leftnavigation/LeftNavigation.notificationBadge.axe-core.func.spec.js +21 -0
- package/ds-leftnavigation/LeftNavigation.searchBar.axe-core.func.spec.js +26 -0
- package/ds-leftnavigation/LeftNavigation.showCase.axe-core.func.spec.js +23 -0
- package/ds-leftnavigation/LeftNavigation.tooltip.axe-core.func.spec.js +28 -0
- package/ds-leftnavigation/LeftNavigation.wrappedText.axe-core.func.spec.js +27 -0
- package/ds-modal-slide/inside-dialog/ModalSlide.insideDialog.func.spec.js +45 -0
- package/ds-panel-header/DSPanelHeader.func.spec.js +24 -0
- package/ds-panel-header/DSPanelHeaderCO.js +17 -0
- package/ds-pills-v2/DSPillsV2CO.js +53 -1
- package/ds-pills-v2/pitfalls/DSPills.inputPill.func.spec.js +26 -0
- package/ds-pills-v2/pitfalls/DSPills.inputWithFormItemBlockURL.axe-core.func.spec.js +38 -0
- package/ds-pills-v2/pitfalls/DSPills.inputWithFormItemBlockURL.func.spec.js +72 -0
- package/ds-progress-indicator/DSProgressIndicator.axe-core.func.spec.js +8 -5
- package/ds-progress-indicator/DSProgressIndicator.func.spec.js +31 -4
- package/ds-progress-indicator/DSProgressIndicator.visual.spec.js +14 -6
- package/ds-progress-indicator/DSProgressIndicatorCO.js +87 -9
- package/ds-progress-indicator/aria-contract/DSProgressIndicator.aria-contract.func.spec.js +104 -0
- package/ds-progress-indicator/slots/DSProgressIndicator.slots.axe-core.func.spec.js +31 -0
- package/ds-progress-indicator/slots/DSProgressIndicator.slots.func.spec.js +87 -0
- package/ds-progress-indicator/slots/DSProgressIndicator.slots.visual.spec.js +27 -0
- package/ds-progress-indicator/variant/DSProgressIndicator.single-bar-variant.func.spec.js +44 -0
- package/ds-progress-indicator/variant/DSProgressIndicator.single-bar-variant.visual.spec.js +19 -0
- package/ds-ribbon/DSRibbonCO.js +21 -0
- package/ds-ribbon/keyboard-accessible-row/DSRibbon.keyboard-accessible-row.visual.spec.js +40 -0
- package/ds-ribbon/wrap-columns/DSRibbon.wrap-columns.visual.spec.js +18 -0
- package/ds-shuttle-v2/load-more/DSShuttleV2.load-more.keyboard.func.spec.js +46 -17
- package/ds-slider-v2/DSSliderV2.axe-core.func.spec.js +21 -0
- package/ds-slider-v2/DSSliderV2.visual.spec.js +19 -1
- package/ds-slider-v2/DSSliderV2CO.js +6 -1
- package/ds-slider-v2/has-error/DSSliderV2.has-error.visual.spec.js +44 -0
- package/ds-slider-v2/interaction-states/DSSliderV2.interaction-states.visual.spec.js +53 -0
- package/ds-virtuallist/DSVirtualList.visual.spec.js +4 -5
- package/ds-virtuallist/DSVirtualListCO.js +28 -9
- package/ds-virtuallist/basic/DSVirtualList.basic.axe-core.func.spec.js +28 -0
- package/ds-virtuallist/scroll-to-index/DSVirtualList.scroll-to-index.func.spec.js +45 -0
- package/package.json +149 -149
- package/paths.js +3 -49
- package/ds-leftnavigation/LeftNavigation.axe-core.func.spec.js +0 -172
- package/ds-mobile/Accordion/DSAccordion.visual.spec.js +0 -33
- package/ds-mobile/Accordion/DSAccordionCO.js +0 -37
- package/ds-mobile/CategoryBox/CategoryBox.visual.spec.js +0 -18
- package/ds-mobile/CategoryBox/CategoryBoxCO.js +0 -17
- package/ds-mobile/CollectionBox/CollectionBox.visual.spec.js +0 -16
- package/ds-mobile/CollectionBox/CollectionBoxCO.js +0 -15
- package/ds-mobile/GlobalHeader/DSGlobalHeader.visual.spec.js +0 -55
- package/ds-mobile/GlobalHeader/DSGlobalHeaderCO.js +0 -36
- package/ds-mobile/GroupBox/GroupBox.visual.spec.js +0 -15
- package/ds-mobile/GroupBox/GroupBoxCO.js +0 -15
- package/ds-mobile/InfiniteLoader/InfiniteLoader.func.spec.js +0 -90
- package/ds-mobile/InfiniteLoader/InfiniteLoaderCO.js +0 -29
- package/ds-mobile/MobileActionToolbar/MobileActionToolbar.visual.spec.js +0 -39
- package/ds-mobile/MobileActionToolbar/MobileActionToolbarCO.js +0 -19
- package/ds-mobile/MobileBanner/MobileBanner.visual.spec.js +0 -23
- package/ds-mobile/MobileBanner/MobileBannerCO.js +0 -23
- package/ds-mobile/MobileCard/Card.func.spec.js +0 -38
- package/ds-mobile/MobileCard/Card.visual.spec.js +0 -103
- package/ds-mobile/MobileCard/MobileCardCO.js +0 -42
- package/ds-mobile/MobileContextMenu/MobileContextMenu.func.spec.js +0 -88
- package/ds-mobile/MobileContextMenu/MobileContextMenu.visual.spec.js +0 -31
- package/ds-mobile/MobileContextMenu/MobileContextMenuCO.js +0 -72
- package/ds-mobile/MobileDatePicker/MobileDatePicker.func.spec.js +0 -15
- package/ds-mobile/MobileDatePicker/MobileDatePicker.visual.spec.js +0 -15
- package/ds-mobile/MobileDatePicker/MobileDatePickerCO.js +0 -35
- package/ds-mobile/MobileDropdownMenu/MobileDropdownMenu.func.spec.js +0 -38
- package/ds-mobile/MobileDropdownMenu/MobileDropdownMenu.visual.spec.js +0 -16
- package/ds-mobile/MobileDropdownMenu/MobileDropdownMenuCO.js +0 -37
- package/ds-mobile/MobileEmptyState/MobileEmptyState.visual.spec.js +0 -15
- package/ds-mobile/MobileEmptyState/MobileEmptyStateCO.js +0 -14
- package/ds-mobile/MobileFilterbar/MobileFilterbar.visual.spec.js +0 -39
- package/ds-mobile/MobileFilterbar/MobileFilterbarCO.js +0 -19
- package/ds-mobile/MobileFooter/MobileFooter.func.spec.js +0 -26
- package/ds-mobile/MobileFooter/MobileFooter.visual.spec.js +0 -51
- package/ds-mobile/MobileFooter/MobileFooterCO.js +0 -27
- package/ds-mobile/MobileListItem/MobileListItem.visual.spec.js +0 -56
- package/ds-mobile/MobileListItem/MobileListItemCO.js +0 -19
- package/ds-mobile/MobileLoadingPage/MobileLoadingPage.visual.spec.js +0 -37
- package/ds-mobile/MobileLoadingPage/MobileLoadingPageCO.js +0 -23
- package/ds-mobile/MobilePageHeader/MobilePageHeader.func.spec.js +0 -22
- package/ds-mobile/MobilePageHeader/MobilePageHeader.visual.spec.js +0 -135
- package/ds-mobile/MobilePageHeader/MobilePageHeaderCO.js +0 -67
- package/ds-mobile/MobileSelectList/MobileSelectList.visual.spec.js +0 -56
- package/ds-mobile/MobileSelectList/MobileSelectListCO.js +0 -21
- package/ds-mobile/MobileSeparator/MobileSeparator.visual.spec.js +0 -28
- package/ds-mobile/MobileSeparator/MobileSeparatorCO.js +0 -17
- package/ds-mobile/MobileTimePicker/MobileTimePickerCO.js +0 -41
- package/ds-mobile/Modal/MobileModal.visual.spec.js +0 -56
- package/ds-mobile/Modal/MobileModalCO.js +0 -28
- package/ds-mobile/PageFilter/PageFilter.visual.spec.js +0 -46
- package/ds-mobile/PageFilter/PageFilterCO.js +0 -19
- package/ds-mobile/PageForm/PageForm.visual.spec.js +0 -14
- package/ds-mobile/PageForm/PageFormCO.js +0 -11
- package/ds-mobile/PageList/PageList.visual.spec.js +0 -31
- package/ds-mobile/PageList/PageListCO.js +0 -19
- package/ds-mobile/PageSummary/PageSummary.visual.spec.js +0 -20
- package/ds-mobile/PageSummary/PageSummaryCO.js +0 -11
- package/ds-mobile/SwipeToRefresh/SwipeToRefresh.func.spec.js +0 -26
- package/ds-mobile/SwipeToRefresh/SwipeToRefreshCO.js +0 -20
- package/ds-mobile/Tabs/MobileTabs.visual.spec.js +0 -91
- package/ds-mobile/Tabs/TabsCO.js +0 -37
- package/ds-mobile/Tooltip/MobileTooltip.func.spec.js +0 -17
- package/ds-mobile/Tooltip/MobileTooltip.visual.spec.js +0 -16
- package/ds-mobile/Tooltip/TooltipCO.js +0 -23
- package/ds-mobile/helpers.js +0 -7
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import DSProgressIndicatorCO from '../DSProgressIndicatorCO';
|
|
2
|
+
import { axeCoreCheck } from '../../helpers';
|
|
3
|
+
|
|
4
|
+
// SlotsTest is the only ProgressIndicator story that overrides color/backgroundColor, so it is the
|
|
5
|
+
// one place where the test code itself can introduce a contrast regression. This run is what makes
|
|
6
|
+
// the WCAG 2 AA pairs in the story load-bearing rather than advisory. It also guards the
|
|
7
|
+
// consumer-supplied slot aria-label against colliding with the component's own naming.
|
|
8
|
+
//
|
|
9
|
+
// Chrome only: axe-core results do not vary by engine. The `|| 'Chrome'` branch is mandatory,
|
|
10
|
+
// BrowserStack reports the capitalised name and a lowercase-only guard registers zero tests.
|
|
11
|
+
if (
|
|
12
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
13
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
14
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
15
|
+
browser.capabilities.browserName === 'Chrome'
|
|
16
|
+
) {
|
|
17
|
+
describe('PUI-19212 - DSProgressIndicator:: slot theming - Axe-Core', () => {
|
|
18
|
+
before('loading page', async () => {
|
|
19
|
+
const errorOnGo = await DSProgressIndicatorCO.slotsURL.go();
|
|
20
|
+
if (errorOnGo) throw errorOnGo;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('01: should have no accessibility violations with custom slot theming', async () => {
|
|
24
|
+
const root = await DSProgressIndicatorCO.getSlot('dsProgressindicatorRoot', 'segmented-slots-case');
|
|
25
|
+
await root.waitForDisplayed();
|
|
26
|
+
|
|
27
|
+
const result = await axeCoreCheck();
|
|
28
|
+
expect(result.length).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import DSProgressIndicatorCO from '../DSProgressIndicatorCO';
|
|
2
|
+
|
|
3
|
+
// Slot contract coverage for the compliance migration in PUI-18856 / PUI-18941. The package dropped
|
|
4
|
+
// ds-classnames/aggregatedClasses for the native slot system, so each visual element must now be
|
|
5
|
+
// addressable through data-dimsum-slot and must accept consumer slot props.
|
|
6
|
+
//
|
|
7
|
+
// The consumer's `data-testid` REPLACES the component default, which is why this spec addresses the
|
|
8
|
+
// elements through data-dimsum-slot and then asserts the overridden testid, rather than the other
|
|
9
|
+
// way round.
|
|
10
|
+
//
|
|
11
|
+
// Slot attribute pass-through is engine-independent, so this runs Chrome only. The `|| 'Chrome'`
|
|
12
|
+
// branch is mandatory: BrowserStack reports the capitalised name and a lowercase-only guard would
|
|
13
|
+
// register zero tests while still exiting 0.
|
|
14
|
+
if (
|
|
15
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
16
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
17
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
18
|
+
browser.capabilities.browserName === 'Chrome'
|
|
19
|
+
) {
|
|
20
|
+
describe('PUI-19210 - DSProgressIndicator:: slot contract and slot prop forwarding - Func', () => {
|
|
21
|
+
before('loading page', async () => {
|
|
22
|
+
const errorOnGo = await DSProgressIndicatorCO.slotsURL.go();
|
|
23
|
+
if (errorOnGo) throw errorOnGo;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('01: should expose the five slots on both the single and the segmented indicator', async () => {
|
|
27
|
+
const expectFiveSlots = async (caseId) => {
|
|
28
|
+
const [root, title, counter, progressBar, progress] = await Promise.all([
|
|
29
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorRoot', caseId),
|
|
30
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorTitle', caseId),
|
|
31
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorCounter', caseId),
|
|
32
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorProgressBar', caseId),
|
|
33
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorProgress', caseId),
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
await root.waitForDisplayed();
|
|
37
|
+
await expect(root).toHaveAttribute('data-testid', 'custom-root-data');
|
|
38
|
+
await expect(title).toHaveAttribute('data-testid', 'custom-title-data');
|
|
39
|
+
await expect(counter).toHaveAttribute('data-testid', 'custom-counter-data');
|
|
40
|
+
await expect(progressBar).toHaveAttribute('data-testid', 'custom-progress-bar-data');
|
|
41
|
+
await expect(progress).toHaveAttribute('data-testid', 'custom-progress-data');
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
await expectFiveSlots('single-slots-case');
|
|
45
|
+
await expectFiveSlots('segmented-slots-case');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('02: should forward consumer slot props to every slot and to each segment', async () => {
|
|
49
|
+
const [title, counter, progress] = await Promise.all([
|
|
50
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorTitle', 'single-slots-case'),
|
|
51
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorCounter', 'single-slots-case'),
|
|
52
|
+
DSProgressIndicatorCO.getSlot('dsProgressindicatorProgress', 'single-slots-case'),
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
await expect(title).toHaveAttribute('lang', 'en');
|
|
56
|
+
await expect(counter).toHaveAttribute('title', 'custom counter title');
|
|
57
|
+
|
|
58
|
+
// The progress slot carries role="progressbar", so a slot-level aria-label is legal there and
|
|
59
|
+
// is forwarded. It does not become the accessible name though: the component also emits its
|
|
60
|
+
// own aria-labelledby pointing at the title, and aria-labelledby outranks aria-label. Chrome's
|
|
61
|
+
// accessibility tree names these bars after their title, not "custom progress aria".
|
|
62
|
+
//
|
|
63
|
+
// That is the intended outcome, not a gap. Keeping the name tied to the visible title is the
|
|
64
|
+
// WCAG 2.5.3 Label in Name principle, and localisation is handled by passing a translated
|
|
65
|
+
// `title` rather than by overriding the label. The slot-level aria-label only takes effect on
|
|
66
|
+
// a titleless indicator, where the component would otherwise fall back to "progress bar".
|
|
67
|
+
// Asserting both attributes here pins the forwarding contract without implying the override
|
|
68
|
+
// wins the name.
|
|
69
|
+
await expect(progress).toHaveAttribute('role', 'progressbar');
|
|
70
|
+
await expect(progress).toHaveAttribute('aria-label', 'custom progress aria');
|
|
71
|
+
await expect(progress).toHaveAttribute('aria-labelledby');
|
|
72
|
+
|
|
73
|
+
// Slot props must reach every segment, not just the first one. The segments are addressed by
|
|
74
|
+
// index rather than with .map(): WebdriverIO's element array overrides .map() to return a
|
|
75
|
+
// Promise, so Promise.all(segments.map(...)) throws "object is not iterable".
|
|
76
|
+
const segments = await DSProgressIndicatorCO.getSlots('dsProgressindicatorProgress', 'segmented-slots-case');
|
|
77
|
+
await expect(segments).toBeElementsArrayOfSize(3);
|
|
78
|
+
|
|
79
|
+
await expect(segments[0]).toHaveAttribute('data-testid', 'custom-progress-data');
|
|
80
|
+
await expect(segments[0]).toHaveAttribute('aria-label', 'custom progress aria');
|
|
81
|
+
await expect(segments[1]).toHaveAttribute('data-testid', 'custom-progress-data');
|
|
82
|
+
await expect(segments[1]).toHaveAttribute('aria-label', 'custom progress aria');
|
|
83
|
+
await expect(segments[2]).toHaveAttribute('data-testid', 'custom-progress-data');
|
|
84
|
+
await expect(segments[2]).toHaveAttribute('aria-label', 'custom progress aria');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import DSProgressIndicatorCO from '../DSProgressIndicatorCO';
|
|
2
|
+
|
|
3
|
+
// Visual half of the PUI-18856 slot migration: proves the styleOverrides payload actually reaches
|
|
4
|
+
// each slot after the move off ds-classnames. The functional spec covers the attribute contract, so
|
|
5
|
+
// this only needs the rendered appearance.
|
|
6
|
+
//
|
|
7
|
+
// This snapshot also guards the cascade fix for the `progress-bar` slot: its styleOverride used to lose to
|
|
8
|
+
// the retained SCSS rule `.em-ds-determinate-progress-indicator .em-ds-progress-bar` (two classes beat the
|
|
9
|
+
// single styled-components class) and the track stayed grey. The package now re-emits every slot override
|
|
10
|
+
// that a legacy descendant rule could beat under `&&&`, so all five slots take their overrides here. jsdom
|
|
11
|
+
// does not honour specificity, so this real-browser snapshot is the only place the cascade itself is proven.
|
|
12
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
13
|
+
describe('PUI-19211 - DSProgressIndicator:: slot theming - Visual', () => {
|
|
14
|
+
before('loading page', async () => {
|
|
15
|
+
const errorOnGo = await DSProgressIndicatorCO.slotsURL.go();
|
|
16
|
+
if (errorOnGo) throw errorOnGo;
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('01: should display the single and segmented indicators with slot theming applied', async () => {
|
|
20
|
+
const root = await DSProgressIndicatorCO.getSlot('dsProgressindicatorRoot', 'segmented-slots-case');
|
|
21
|
+
await root.waitForDisplayed();
|
|
22
|
+
|
|
23
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
24
|
+
await expect(snapshot).toEqual(0);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import DSProgressIndicatorCO from '../DSProgressIndicatorCO';
|
|
2
|
+
|
|
3
|
+
// Tests for the fix introduced in PUI-18677: `variant` used to be ignored in single-bar mode, so every
|
|
4
|
+
// single bar rendered the default fill.
|
|
5
|
+
//
|
|
6
|
+
// Theme-agnostic on purpose: no colour value is pinned. Each variant only has to paint a fill that differs
|
|
7
|
+
// from the default one; the exact palette is guarded by the visual spec.
|
|
8
|
+
//
|
|
9
|
+
// Chrome only: a computed style of a static story does not vary by engine. The `|| 'Chrome'` branch is
|
|
10
|
+
// mandatory, BrowserStack reports the capitalised name and a lowercase-only guard registers zero tests.
|
|
11
|
+
if (
|
|
12
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
13
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
14
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
15
|
+
browser.capabilities.browserName === 'Chrome'
|
|
16
|
+
) {
|
|
17
|
+
describe('PUI-19235 - DSProgressIndicator:: single-bar variant fill colour - Func', () => {
|
|
18
|
+
before('loading page', async () => {
|
|
19
|
+
const errorOnGo = await DSProgressIndicatorCO.singleBarVariantURL.go();
|
|
20
|
+
if (errorOnGo) throw errorOnGo;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('01: should paint each single-bar variant fill differently from the default', async () => {
|
|
24
|
+
const fillColour = async (caseId) => {
|
|
25
|
+
const bar = await DSProgressIndicatorCO.getProgress(caseId);
|
|
26
|
+
await bar.waitForDisplayed();
|
|
27
|
+
return (await bar.getCSSProperty('background-color')).parsed.hex;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const defaultColour = await fillColour('default-case');
|
|
31
|
+
const success = await fillColour('success-case');
|
|
32
|
+
const warning = await fillColour('warning-case');
|
|
33
|
+
const info = await fillColour('info-case');
|
|
34
|
+
const error = await fillColour('error-case');
|
|
35
|
+
|
|
36
|
+
await expect(success).not.toEqual(defaultColour);
|
|
37
|
+
await expect(warning).not.toEqual(defaultColour);
|
|
38
|
+
await expect(info).not.toEqual(defaultColour);
|
|
39
|
+
await expect(error).not.toEqual(defaultColour);
|
|
40
|
+
// The variants must also be told apart from each other, not just from the default.
|
|
41
|
+
await expect(new Set([defaultColour, success, warning, info, error]).size).toBe(5);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import DSProgressIndicatorCO from '../DSProgressIndicatorCO';
|
|
2
|
+
|
|
3
|
+
// Tests for the fix introduced in PUI-18677: the single-bar `variant` now reaches the fill. The functional
|
|
4
|
+
// spec only proves the colours differ; this baseline records the actual palette per variant.
|
|
5
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
6
|
+
describe('PUI-19236 - DSProgressIndicator:: single-bar variant fill colour - Visual', () => {
|
|
7
|
+
before('loading page', async () => {
|
|
8
|
+
const errorOnGo = await DSProgressIndicatorCO.singleBarVariantURL.go();
|
|
9
|
+
if (errorOnGo) throw errorOnGo;
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('01: should display one single-bar indicator per variant', async () => {
|
|
13
|
+
await (await DSProgressIndicatorCO.getProgress('error-case')).waitForDisplayed();
|
|
14
|
+
|
|
15
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
16
|
+
await expect(snapshot).toEqual(0);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
package/ds-ribbon/DSRibbonCO.js
CHANGED
|
@@ -12,6 +12,10 @@ export default class DSRibbonCO extends PageObject {
|
|
|
12
12
|
|
|
13
13
|
static themingURL = new Urlbuilder(PATH_E2E_RIBBON, 'theming-test');
|
|
14
14
|
|
|
15
|
+
static wrapColumnsURL = new Urlbuilder(PATH_E2E_RIBBON, 'wrap-columns-test');
|
|
16
|
+
|
|
17
|
+
static keyboardAccessibleRowURL = new Urlbuilder(PATH_E2E_RIBBON, 'keyboard-accessible-row-test');
|
|
18
|
+
|
|
15
19
|
static async getRibbon() {
|
|
16
20
|
return $('[data-testid="button-wrapper"]');
|
|
17
21
|
}
|
|
@@ -91,6 +95,23 @@ export default class DSRibbonCO extends PageObject {
|
|
|
91
95
|
return $('[data-testid="ribbon-card-theming"]');
|
|
92
96
|
}
|
|
93
97
|
|
|
98
|
+
// Wrap Columns / Keyboard Accessible Row selectors
|
|
99
|
+
static async getRowInContainer(containerTestId) {
|
|
100
|
+
return $(`[data-testid="${containerTestId}"] [data-dimsum-slot="dsRibbonRibbonRow"]`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static async getWrapColumnsRow() {
|
|
104
|
+
return DSRibbonCO.getRowInContainer('ribbon-wrap-columns-container');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static async getFocusableRow() {
|
|
108
|
+
return DSRibbonCO.getRowInContainer('ribbon-focusable-row-container');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static async getExpandProcessedBtn() {
|
|
112
|
+
return $('[data-testid="expand-processed-btn"]');
|
|
113
|
+
}
|
|
114
|
+
|
|
94
115
|
// Snapshots
|
|
95
116
|
static snapshotPath(example = 'basic') {
|
|
96
117
|
return PageObject.getSnapshotPathBuilder('Ribbon', example, 'ds-modal');
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSRibbonCO from '../DSRibbonCO';
|
|
3
|
+
|
|
4
|
+
// Kept at module scope so the waitUntil below stays within the max-nested-callbacks limit.
|
|
5
|
+
const readScrollLeft = (el) => el.scrollLeft;
|
|
6
|
+
|
|
7
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
8
|
+
// Tests for the fix introduced in PUI-19188 (scrolling row had no tabindex and could not be reached by keyboard)
|
|
9
|
+
describe('PUI-19230 - DSRibbon:: scrolling row keyboard access - Visual', () => {
|
|
10
|
+
before('loading page', async () => {
|
|
11
|
+
const errorOnGo = await DSRibbonCO.keyboardAccessibleRowURL.go();
|
|
12
|
+
if (errorOnGo) throw errorOnGo;
|
|
13
|
+
const row = await DSRibbonCO.getFocusableRow();
|
|
14
|
+
await row.waitForDisplayed();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('01: should display the focus indicator on the scrolling row', async () => {
|
|
18
|
+
await browser.keys(Key.Tab);
|
|
19
|
+
const row = await DSRibbonCO.getFocusableRow();
|
|
20
|
+
await expect(row).toBeFocused();
|
|
21
|
+
// The row advertises "use the arrow keys to reach the remaining columns", so drive that before
|
|
22
|
+
// the snapshot: arrow keys keep focus on the row, so the Tab in 02 still reaches the button.
|
|
23
|
+
const scrollLeftBefore = await browser.execute(readScrollLeft, row);
|
|
24
|
+
await browser.keys(Key.ArrowRight);
|
|
25
|
+
await browser.waitUntil(async () => (await browser.execute(readScrollLeft, row)) > scrollLeftBefore, {
|
|
26
|
+
timeoutMsg: 'expected ArrowRight to scroll the focused row towards the off-screen columns',
|
|
27
|
+
});
|
|
28
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
29
|
+
await expect(snapshot).toEqual(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('02: should display the off-screen button scrolled into view with focus', async () => {
|
|
33
|
+
await browser.keys(Key.Tab);
|
|
34
|
+
const btn = await DSRibbonCO.getExpandProcessedBtn();
|
|
35
|
+
await expect(btn).toBeFocused();
|
|
36
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
37
|
+
await expect(snapshot).toEqual(0);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import DSRibbonCO from '../DSRibbonCO';
|
|
2
|
+
|
|
3
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
4
|
+
// Tests for the fix introduced in PUI-19188 (row scrolled at narrow widths, off-screen columns unreachable)
|
|
5
|
+
describe('PUI-19229 - DSRibbon:: wrapColumns row wrapping - Visual', () => {
|
|
6
|
+
before('loading page', async () => {
|
|
7
|
+
const errorOnGo = await DSRibbonCO.wrapColumnsURL.go();
|
|
8
|
+
if (errorOnGo) throw errorOnGo;
|
|
9
|
+
const row = await DSRibbonCO.getWrapColumnsRow();
|
|
10
|
+
await row.waitForDisplayed();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('01: should display the default scrolling row and the wrapped row', async () => {
|
|
14
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
15
|
+
await expect(snapshot).toEqual(0);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -3,8 +3,23 @@
|
|
|
3
3
|
import { Key } from 'webdriverio';
|
|
4
4
|
import DSShuttleV2CO from '../DSShuttleV2CO';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Tab forward until `element` holds focus, then assert it does. Chromium, Gecko and WebKit do not
|
|
8
|
+
* agree on how many stops sit between the two panels, so a fixed Tab count activates the wrong
|
|
9
|
+
* control on some engines. Bounded so a missing stop fails with this assertion instead of looping.
|
|
10
|
+
*/
|
|
11
|
+
const tabUntilFocused = async (element, maxTabs = 10) => {
|
|
12
|
+
for (let i = 0; i < maxTabs; i += 1) {
|
|
13
|
+
// eslint-disable-next-line no-await-in-loop
|
|
14
|
+
if (await element.isFocused()) break;
|
|
15
|
+
// eslint-disable-next-line no-await-in-loop
|
|
16
|
+
await browser.keys(Key.Tab);
|
|
17
|
+
}
|
|
18
|
+
await expect(element).toBeFocused();
|
|
19
|
+
};
|
|
20
|
+
|
|
6
21
|
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
7
|
-
describe('PUI-9799 - Shuttle V2, TabStops with BAB and LoadMore -Func.', () => {
|
|
22
|
+
describe('PUI-9799 - Shuttle V2, TabStops with BAB and LoadMore - Keyboard Func.', () => {
|
|
8
23
|
before(async () => {
|
|
9
24
|
const errorOnGo = await DSShuttleV2CO.loadMoreURL.go();
|
|
10
25
|
if (errorOnGo) throw errorOnGo;
|
|
@@ -19,43 +34,57 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
19
34
|
await expect(BAB).toBeDisplayed();
|
|
20
35
|
await expect(sourcePanelCheckbox).toBeFocused();
|
|
21
36
|
});
|
|
22
|
-
it('
|
|
37
|
+
it('02: should tab and focus the source panel', async () => {
|
|
23
38
|
await browser.keys(Key.Tab);
|
|
24
39
|
const sourcePanel = await DSShuttleV2CO.getListWrapperMid(0);
|
|
25
40
|
await expect(sourcePanel).toBeFocused();
|
|
26
41
|
});
|
|
27
|
-
it('
|
|
42
|
+
it('03: should tab and focus the BAB', async () => {
|
|
28
43
|
await browser.keys(Key.Tab);
|
|
29
44
|
const BAB = await DSShuttleV2CO.getMoveMultipleButton(0);
|
|
30
45
|
await expect(BAB).toBeFocused();
|
|
31
46
|
});
|
|
32
|
-
it('
|
|
47
|
+
it('04: should tab and focus the loadmore', async () => {
|
|
33
48
|
await browser.keys(Key.Tab);
|
|
34
49
|
const loadMore = await DSShuttleV2CO.getListBottomLoadMoreBtn(0);
|
|
35
50
|
await expect(loadMore).toBeFocused();
|
|
36
51
|
});
|
|
37
|
-
it('
|
|
52
|
+
it('05: should tab and focus the global checkbox from destination panel', async () => {
|
|
38
53
|
await browser.keys(Key.Tab);
|
|
39
54
|
const destinationPanelCheckbox = await DSShuttleV2CO.getCheckboxByIndex(1);
|
|
40
55
|
await expect(destinationPanelCheckbox).toBeFocused();
|
|
41
56
|
});
|
|
42
|
-
it('
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
await
|
|
57
|
+
it('06: should move all the items to destination panel', async () => {
|
|
58
|
+
// Tab counts are not portable: the stops between the two panels differ per engine, and a
|
|
59
|
+
// hard-coded count lands Return on the wrong control in Safari. Walk until the target has
|
|
60
|
+
// focus instead, which asserts the same stops on every browser.
|
|
61
|
+
await tabUntilFocused(await DSShuttleV2CO.getCheckboxByIndex(0));
|
|
62
|
+
await browser.keys(Key.Return); // select every source item
|
|
63
|
+
await tabUntilFocused(await DSShuttleV2CO.getMoveMultipleButton());
|
|
64
|
+
await browser.keys(Key.Return); // move them to the destination
|
|
65
|
+
await browser.waitUntil(async () => (await DSShuttleV2CO.getItemsFromSource()).length === 0, {
|
|
66
|
+
timeoutMsg: 'expected the source panel to be emptied into the destination',
|
|
67
|
+
});
|
|
47
68
|
const emptyListWrapper = await DSShuttleV2CO.getEmptyListWrapper();
|
|
48
69
|
await expect(emptyListWrapper).toHaveText(expect.stringContaining('There are no items to display'));
|
|
49
70
|
});
|
|
50
|
-
it('
|
|
51
|
-
await
|
|
52
|
-
await browser.keys(Key.Return);
|
|
53
|
-
|
|
54
|
-
await browser.
|
|
55
|
-
|
|
71
|
+
it('07: should load the first page back into the emptied destination panel', async () => {
|
|
72
|
+
await tabUntilFocused(await DSShuttleV2CO.getCheckboxByIndex(1));
|
|
73
|
+
await browser.keys(Key.Return); // select every destination item
|
|
74
|
+
await tabUntilFocused(await DSShuttleV2CO.getMoveMultipleButton());
|
|
75
|
+
await browser.keys(Key.Return); // move them out of the destination
|
|
76
|
+
await browser.waitUntil(async () => (await DSShuttleV2CO.getItemsFromDestination()).length === 0, {
|
|
77
|
+
timeoutMsg: 'expected the destination panel to be emptied back into the source',
|
|
78
|
+
});
|
|
79
|
+
await tabUntilFocused(await DSShuttleV2CO.getListBottomLoadMoreBtn(1));
|
|
80
|
+
await browser.keys(Key.Return); // load the first page back in
|
|
81
|
+
// Where focus lands after load more is not asserted: Chromium parks it on the panel body,
|
|
82
|
+
// Firefox and Safari do not, so it is engine behaviour rather than a component contract.
|
|
83
|
+
await browser.waitUntil(async () => (await DSShuttleV2CO.getItemsFromDestination()).length === 3, {
|
|
84
|
+
timeoutMsg: 'expected destination load more to append its first page of 3 items',
|
|
85
|
+
});
|
|
56
86
|
const destinationItems = (await DSShuttleV2CO.getItemsFromDestination()).length;
|
|
57
87
|
await expect(destinationItems).toBe(3);
|
|
58
|
-
await expect(destinationPanel).toBeFocused();
|
|
59
88
|
});
|
|
60
89
|
});
|
|
61
90
|
}
|
|
@@ -118,4 +118,25 @@ if (
|
|
|
118
118
|
expect(result.length).toBe(0);
|
|
119
119
|
});
|
|
120
120
|
});
|
|
121
|
+
|
|
122
|
+
// Tests for the hasError state introduced in PUI-18434 (spec v1.5.0 Error row).
|
|
123
|
+
describe('PUI-19224 - DSSliderV2:: hasError state - Axe-Core', () => {
|
|
124
|
+
before('loading page', async () => {
|
|
125
|
+
const errorOnGo = await DSSliderV2CO.hasErrorURL.go();
|
|
126
|
+
if (errorOnGo) throw errorOnGo;
|
|
127
|
+
});
|
|
128
|
+
it('01: should display idle error sliders and pass axe-core scan', async () => {
|
|
129
|
+
const slider = await DSSliderV2CO.getSliderRootByIndex();
|
|
130
|
+
await slider.waitForDisplayed();
|
|
131
|
+
const result = await axeCoreCheck();
|
|
132
|
+
expect(result.length).toBe(0);
|
|
133
|
+
});
|
|
134
|
+
it('02: should display focused error slider handle and pass axe-core scan', async () => {
|
|
135
|
+
await browser.keys(Key.Tab);
|
|
136
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
137
|
+
await expect(thumb).toBeFocused();
|
|
138
|
+
const result = await axeCoreCheck();
|
|
139
|
+
expect(result.length).toBe(0);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
121
142
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Key } from 'webdriverio';
|
|
2
2
|
import DSSliderV2CO from './DSSliderV2CO';
|
|
3
|
-
import { setTextSize } from '../helpers';
|
|
3
|
+
import { mouseOver, setTextSize } from '../helpers';
|
|
4
4
|
|
|
5
5
|
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
6
6
|
describe('PUI-12332 - SliderV2 - Disabled - Visual Test', () => {
|
|
@@ -15,6 +15,14 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
15
15
|
const snapshot = await browser.eyesCheckSnapshot(DSSliderV2CO.snapshotPath('slider-v2-disabled'));
|
|
16
16
|
await expect(snapshot).toEqual(0);
|
|
17
17
|
});
|
|
18
|
+
it('02: should display disabled single slider handle hovered', async () => {
|
|
19
|
+
// Spec v1.5.0 "Disabled + Hover": only the cursor changes (not-allowed). The snapshot guards that
|
|
20
|
+
// no hover tint or background change reappears on the handle or the track (PUI-18434).
|
|
21
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
22
|
+
await mouseOver(thumb);
|
|
23
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
24
|
+
await expect(snapshot).toEqual(0);
|
|
25
|
+
});
|
|
18
26
|
});
|
|
19
27
|
describe('PUI-14389 - SliderV2 - applyAriaDisabled - Visual Test', () => {
|
|
20
28
|
before('loading page', async () => {
|
|
@@ -36,6 +44,16 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
36
44
|
const snapshot = await browser.eyesCheckSnapshot(DSSliderV2CO.snapshotPath('slider-v2-aria-disabled-kb-nav'));
|
|
37
45
|
await expect(snapshot).toEqual(0);
|
|
38
46
|
});
|
|
47
|
+
it('03: should display aria-disabled single slider handle hovered, not focused', async () => {
|
|
48
|
+
// Spec v1.5.0 "Aria-Disabled + Hover": only the cursor changes. Before PUI-18434 the handle background
|
|
49
|
+
// turned N-050 on hover; the snapshot guards against that regression. 01/02 left a handle focused and
|
|
50
|
+
// the story has three focusable handles, so the focus is released explicitly first.
|
|
51
|
+
await browser.execute(() => document.activeElement && document.activeElement.blur());
|
|
52
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
53
|
+
await mouseOver(thumb);
|
|
54
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
55
|
+
await expect(snapshot).toEqual(0);
|
|
56
|
+
});
|
|
39
57
|
});
|
|
40
58
|
|
|
41
59
|
describe('PUI-12333 - SliderV2 - Custom tick marks values - Visual Test', () => {
|
|
@@ -33,6 +33,10 @@ export default class DSSliderCO extends PageObject {
|
|
|
33
33
|
|
|
34
34
|
static applyAriaDisabledURL = new Urlbuilder(PATH_E2E_SLIDER_V2, 'apply-aria-disabled-test');
|
|
35
35
|
|
|
36
|
+
static hasErrorURL = new Urlbuilder(PATH_E2E_SLIDER_V2, 'has-error-test');
|
|
37
|
+
|
|
38
|
+
static interactionStatesURL = new Urlbuilder(PATH_E2E_SLIDER_V2, 'interaction-states-test');
|
|
39
|
+
|
|
36
40
|
// Snapshots
|
|
37
41
|
static snapshotPath(example = 'basic') {
|
|
38
42
|
return PageObject.getSnapshotPathBuilder('Slider', example);
|
|
@@ -129,7 +133,8 @@ export default class DSSliderCO extends PageObject {
|
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
static async getSliderTickMarkValueSlot(index = 0) {
|
|
132
|
-
|
|
136
|
+
// Nested slot since 3.80.0-next: the slot name lives on data-dimsum-parent-slot (see PUI-18434)
|
|
137
|
+
return $$('[data-dimsum-parent-slot="dsSliderv2TickMarkValue"]')[index];
|
|
133
138
|
}
|
|
134
139
|
|
|
135
140
|
static async getSliderRangeWrapperSlot(index = 0) {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import DSSliderV2CO from '../DSSliderV2CO';
|
|
2
|
+
import { mouseOver, tabStops } from '../../helpers';
|
|
3
|
+
|
|
4
|
+
// Where the pointer rests when a snapshot must NOT include a hover state.
|
|
5
|
+
const PARKED_X = 500;
|
|
6
|
+
const PARKED_Y = 400;
|
|
7
|
+
|
|
8
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
9
|
+
// Tests for the hasError state introduced in PUI-18434 (spec v1.5.0 Error row): active track E-900,
|
|
10
|
+
// inactive track E-200, handle border 2px solid E-900, handle background N-000.
|
|
11
|
+
describe('PUI-19223 - DSSliderV2:: hasError state - Visual', () => {
|
|
12
|
+
before('loading page', async () => {
|
|
13
|
+
const errorOnGo = await DSSliderV2CO.hasErrorURL.go();
|
|
14
|
+
if (errorOnGo) throw errorOnGo;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('01: should display idle error single and range sliders, mouse parked', async () => {
|
|
18
|
+
const slider = await DSSliderV2CO.getSliderRootByIndex(0);
|
|
19
|
+
await slider.waitForDisplayed();
|
|
20
|
+
await mouseOver(null, PARKED_X, PARKED_Y);
|
|
21
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
22
|
+
await expect(snapshot).toEqual(0);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('02: should display error single slider handle hovered', async () => {
|
|
26
|
+
// Spec v1.5.0 defines no Error + Hover row. Current behavior: the error tokens stay as they are.
|
|
27
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
28
|
+
await mouseOver(thumb);
|
|
29
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
30
|
+
await expect(snapshot).toEqual(0);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('03: should display error single slider handle focused, not hovered', async () => {
|
|
34
|
+
// Spec v1.5.0 defines no Error + Focus row. Current behavior: the handle border switches to the
|
|
35
|
+
// focus token (B-800) while both track segments keep the error tokens.
|
|
36
|
+
await mouseOver(null, PARKED_X, PARKED_Y);
|
|
37
|
+
await tabStops(1);
|
|
38
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
39
|
+
await expect(thumb).toBeFocused();
|
|
40
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
41
|
+
await expect(snapshot).toEqual(0);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import DSSliderV2CO from '../DSSliderV2CO';
|
|
2
|
+
import { mouseOver, tabStops } from '../../helpers';
|
|
3
|
+
|
|
4
|
+
// Where the pointer rests when a snapshot must NOT include a hover state.
|
|
5
|
+
const PARKED_X = 500;
|
|
6
|
+
const PARKED_Y = 400;
|
|
7
|
+
|
|
8
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
9
|
+
// Tests for the spec v1.5.0 alignment introduced in PUI-18434: hover and focus tint the handle border
|
|
10
|
+
// AND the active track segment together (idle B-600 -> hover B-700 -> focus B-800), focus renders no
|
|
11
|
+
// outline. The story starts mid-range so the active segment is long enough for the tint to be visible.
|
|
12
|
+
describe('PUI-19222 - DSSliderV2:: handle and track hover and focus states - Visual', () => {
|
|
13
|
+
before('loading page', async () => {
|
|
14
|
+
const errorOnGo = await DSSliderV2CO.interactionStatesURL.go();
|
|
15
|
+
if (errorOnGo) throw errorOnGo;
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('01: should display idle single and range sliders, mouse parked', async () => {
|
|
19
|
+
const slider = await DSSliderV2CO.getSliderRootByIndex(0);
|
|
20
|
+
await slider.waitForDisplayed();
|
|
21
|
+
await mouseOver(null, PARKED_X, PARKED_Y);
|
|
22
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
23
|
+
await expect(snapshot).toEqual(0);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('02: should display single slider handle hovered', async () => {
|
|
27
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
28
|
+
await mouseOver(thumb);
|
|
29
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
30
|
+
await expect(snapshot).toEqual(0);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('03: should display range slider min handle hovered', async () => {
|
|
34
|
+
// The handle and the track are shared between single and range mode, so the hover tint must also
|
|
35
|
+
// apply to the range slider (PUI-18434 scope note).
|
|
36
|
+
const thumb = await DSSliderV2CO.getSliderThumb(1);
|
|
37
|
+
await mouseOver(thumb);
|
|
38
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
39
|
+
await expect(snapshot).toEqual(0);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Focus is reached through Tab on purpose. PUI-19226: in range mode a mouse click on a handle does not
|
|
43
|
+
// focus it, so the focus tokens can only be captured via keyboard until that defect is fixed.
|
|
44
|
+
it('04: should display single slider handle focused, not hovered', async () => {
|
|
45
|
+
await mouseOver(null, PARKED_X, PARKED_Y);
|
|
46
|
+
await tabStops(1);
|
|
47
|
+
const thumb = await DSSliderV2CO.getSliderThumb(0);
|
|
48
|
+
await expect(thumb).toBeFocused();
|
|
49
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
50
|
+
await expect(snapshot).toEqual(0);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -10,13 +10,13 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
10
10
|
const addChildrenBtn = await DSVirtualListCO.getAdd1Btn();
|
|
11
11
|
await addChildrenBtn.click();
|
|
12
12
|
await addChildrenBtn.click();
|
|
13
|
-
const snapshot = await browser.
|
|
13
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
14
14
|
await expect(snapshot).toEqual(0);
|
|
15
15
|
});
|
|
16
16
|
it('should add content to a children and display properly', async () => {
|
|
17
17
|
const addContentBtn = await DSVirtualListCO.getChangeTimeBtn();
|
|
18
18
|
await addContentBtn.click();
|
|
19
|
-
const snapshot = await browser.
|
|
19
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
20
20
|
await expect(snapshot).toEqual(0);
|
|
21
21
|
});
|
|
22
22
|
it('should add a children and content to that children and display properly', async () => {
|
|
@@ -24,7 +24,7 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
24
24
|
await addChildrenBtn.click();
|
|
25
25
|
const addContentBtn = await DSVirtualListCO.getChangeTimeBtn();
|
|
26
26
|
await addContentBtn.click();
|
|
27
|
-
const snapshot = await browser.
|
|
27
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
28
28
|
await expect(snapshot).toEqual(0);
|
|
29
29
|
});
|
|
30
30
|
});
|
|
@@ -34,10 +34,9 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
34
34
|
if (errorOnGo) throw errorOnGo;
|
|
35
35
|
});
|
|
36
36
|
it('01: should display a virtual list with customization correctly', async () => {
|
|
37
|
-
await browser.eyesOpen();
|
|
38
37
|
const virtualListContainer = await DSVirtualListCO.getVirtualListContainer();
|
|
39
38
|
await virtualListContainer.waitForDisplayed();
|
|
40
|
-
const snapshot = await browser.
|
|
39
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
41
40
|
await expect(snapshot).toEqual(0);
|
|
42
41
|
});
|
|
43
42
|
});
|