Skip to content

Commit

Permalink
chore: Fixes flakiness in dropdown width test
Browse files Browse the repository at this point in the history
  • Loading branch information
pan-kot committed Oct 16, 2024
1 parent 780d6b5 commit fe0fa55
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 8 deletions.
16 changes: 16 additions & 0 deletions pages/common/flush-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

export interface WindowWithFlushResponse extends Window {
__pendingCallbacks: Array<() => void>;
__flushServerResponse: () => void;
}
declare const window: WindowWithFlushResponse;

window.__pendingCallbacks = [];
window.__flushServerResponse = () => {
for (const cb of window.__pendingCallbacks) {
cb();
}
window.__pendingCallbacks = [];
};
13 changes: 11 additions & 2 deletions pages/dropdown/width.page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import Select, { SelectProps } from '~components/select';
import SpaceBetween from '~components/space-between';

import AppContext, { AppContextType } from '../app/app-context';
import { WindowWithFlushResponse } from '../common/flush-response';

declare const window: WindowWithFlushResponse;

type DemoContext = React.Context<
AppContextType<{
Expand All @@ -18,6 +21,7 @@ type DemoContext = React.Context<
virtualScroll: boolean;
expandToViewport: boolean;
containerWidth: string;
manualServerMock: boolean;
}>
>;

Expand Down Expand Up @@ -207,12 +211,17 @@ function CustomSelect({ expandToViewport, loading, onOpen, onClose, virtualScrol

export default function () {
const { urlParams } = useContext(AppContext as DemoContext);
const { asyncLoading, component, triggerWidth, virtualScroll, expandToViewport, containerWidth } = urlParams;
const { asyncLoading, component, triggerWidth, virtualScroll, expandToViewport, containerWidth, manualServerMock } =
urlParams;
const [loading, setLoading] = useState(asyncLoading);
const onOpen = () => {
if (asyncLoading) {
setLoading(true);
setTimeout(() => setLoading(false), 500);
if (manualServerMock) {
window.__pendingCallbacks.push(() => setLoading(false));
} else {
setTimeout(() => setLoading(false), 500);
}
}
};
const onClose = () => setLoading(asyncLoading);
Expand Down
14 changes: 14 additions & 0 deletions src/__integ__/page-objects/async-response-page.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { BasePageObject } from '@cloudscape-design/browser-test-tools/page-objects';

interface ExtendedWindow extends Window {
__flushServerResponse: () => void;
}
declare const window: ExtendedWindow;

export class AsyncResponsePage extends BasePageObject {
flushResponse() {
return this.browser.execute(() => window.__flushServerResponse());
}
}
11 changes: 5 additions & 6 deletions src/internal/components/dropdown/__integ__/width.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { BasePageObject } from '@cloudscape-design/browser-test-tools/page-objects';
import useBrowser from '@cloudscape-design/browser-test-tools/use-browser';

import createWrapper from '../../../../../lib/components/test-utils/selectors';
import { AsyncResponsePage } from '../../../../__integ__/page-objects/async-response-page';

type ComponentId = 'autosuggest' | 'multiselect' | 'select';

export class DropdownPageObject extends BasePageObject {
export class DropdownPageObject extends AsyncResponsePage {
getWrapperAndTrigger(componentId: ComponentId) {
const wrapper = createWrapper();
let componentWrapper;
Expand Down Expand Up @@ -55,7 +55,7 @@ function setupTest(
) {
return useBrowser({ width: pageWidth, height: 1000 }, async browser => {
await browser.url(
`#/light/dropdown/width?component=${componentId}&expandToViewport=${expandToViewport}&triggerWidth=${triggerWidth}px&asyncLoading=${asyncLoading}`
`#/light/dropdown/width?component=${componentId}&expandToViewport=${expandToViewport}&triggerWidth=${triggerWidth}px&asyncLoading=${asyncLoading}&manualServerMock=${asyncLoading}`
);
const page = new DropdownPageObject(browser);
await page.waitForVisible(page.getWrapperAndTrigger(componentId).wrapper.toSelector());
Expand Down Expand Up @@ -148,9 +148,8 @@ describe('Dropdown width', () => {
});
expect(dropdownBox.left + dropdownBox.width).toBeLessThanOrEqual(pageWidth);
await expect(page.getText(dropdownSelector)).resolves.toContain('Loading');
await page.waitUntil(async () => (await page.getText(dropdownSelector)).includes('A very'), {
timeout: 1000,
});
await page.flushResponse();

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 1: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with autosuggest

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 2: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with autosuggest

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 3: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with autosuggest

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check failure on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with autosuggest

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 1: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with multiselect

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 2: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with multiselect

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 3: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with multiselect

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check failure on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with multiselect

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 1: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with select

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 2: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with select

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check warning on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

RETRY 3: Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with select

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check failure on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: false › with select

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check failure on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: true › with autosuggest

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check failure on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: true › with multiselect

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13

Check failure on line 151 in src/internal/components/dropdown/__integ__/width.test.ts

View workflow job for this annotation

GitHub Actions / dry-run / Components integration tests shard (3)

Dropdown width › keeps not overflowing the viewport after re-rendering wider › expandToViewport: true › with select

javascript error: javascript error: window.__flushServerResponse is not a function (Session info: chrome=129.0.6668.89) at getErrorFromResponseBody (node_modules/webdriver/build/utils.js:198:12) at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:166:60) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at Browser.wrapCommandFn (node_modules/@wdio/utils/build/shim.js:136:29) at src/internal/components/dropdown/__integ__/width.test.ts:151:9 at src/internal/components/dropdown/__integ__/width.test.ts:62:5 at node_modules/@cloudscape-design/browser-test-tools/use-browser.js:36:13
await expect(page.getText(dropdownSelector)).resolves.toContain('A very');
const newBox = await page.getBoundingBox(dropdownSelector);
expect(newBox.left + newBox.width).toBeLessThanOrEqual(pageWidth);
}
Expand Down

0 comments on commit fe0fa55

Please sign in to comment.