Skip to content

Commit 4903cda

Browse files
NarrowsProjectsGuustMetz
andauthored
Fix/fix tests that fail probabilistically (#2118)
* Make pressElement more robust by using waitForFunction * Make validateData wait for specific table columns * Fix export tests --------- Co-authored-by: GuustMetz <guust.metz@cern.ch>
1 parent 3a4525d commit 4903cda

5 files changed

Lines changed: 48 additions & 15 deletions

File tree

test/public/defaults.js

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -275,12 +275,26 @@ exports.waitForNavigation = waitForNavigation;
275275
* @returns {Promise} Whether the element was clickable or not.
276276
*/
277277
module.exports.pressElement = async (page, selector, jsClick = false) => {
278-
const elementHandler = await page.waitForSelector(selector);
278+
await page.waitForFunction(
279+
(sel, isJsClick) => {
280+
const element = document.querySelector(sel);
281+
282+
if (!element) {
283+
return false;
284+
}
285+
// Moving the click to outside the function causes it to fail for unknown reasons
286+
if (isJsClick) {
287+
element.click();
288+
}
279289

280-
if (jsClick) {
281-
await elementHandler.evaluate((element) => element.click());
282-
} else {
283-
await elementHandler.click(selector);
290+
return true;
291+
},
292+
{},
293+
selector, jsClick
294+
);
295+
296+
if (!jsClick) {
297+
await page.click(selector);
284298
}
285299
};
286300

@@ -855,10 +869,10 @@ module.exports.testTableSortingByColumn = async (page, columnId) => {
855869
* @return {Promise<void>} resolve once data was successfully validated
856870
*/
857871
module.exports.validateTableData = async (page, validators) => {
858-
await page.waitForSelector('table tbody');
859872
for (const [columnId, validator] of validators) {
873+
await page.waitForSelector(`table tbody .column-${columnId}`);
874+
860875
const columnData = await getColumnCellsInnerTexts(page, columnId);
861-
expect(columnData, `Too few values for column ${columnId} or there is no such column`).to.be.length.greaterThan(0);
862876
expect(
863877
columnData.every((cellData) => validator(cellData)),
864878
`Invalid data in column ${columnId}: (${columnData})`,
@@ -977,3 +991,14 @@ module.exports.resetFilters = async (page) => {
977991
{ timeout: 5000 },
978992
);
979993
};
994+
995+
/**
996+
* Fuction that waits for a button to become active
997+
* @param {puppeteer.page} page page handler
998+
* @param {string} selector Css selector for the button.
999+
*/
1000+
module.exports.waitForButtonToBecomeActive = async (page, selector) => await page.waitForFunction((sel) => {
1001+
const button = document.querySelector(sel);
1002+
return button && !button.disabled;
1003+
}, {}, selector);
1004+

test/public/runs/overview.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const {
4040
getColumnCellsInnerTexts,
4141
resetFilters,
4242
openFilteringPanel,
43+
waitForButtonToBecomeActive,
4344
} = require('../defaults.js');
4445
const { RUN_QUALITIES, RunQualities } = require('../../../lib/domain/enums/RunQualities.js');
4546
const { resetDatabaseContent } = require('../../utilities/resetDatabaseContent.js');
@@ -885,6 +886,7 @@ module.exports = () => {
885886
let exportModal = await page.$('#export-data-modal');
886887
expect(exportModal).to.be.null;
887888

889+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
888890
await page.$eval(EXPORT_RUNS_TRIGGER_SELECTOR, (button) => button.click());
889891
await page.waitForSelector('#export-data-modal', { timeout: 5000 });
890892
exportModal = await page.$('#export-data-modal');
@@ -893,6 +895,7 @@ module.exports = () => {
893895
});
894896

895897
it('should successfully display information when export will be truncated', async () => {
898+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
896899
await pressElement(page, EXPORT_RUNS_TRIGGER_SELECTOR, true);
897900

898901
const truncatedExportWarning = await page.waitForSelector('#export-data-modal #truncated-export-warning');
@@ -912,6 +915,7 @@ module.exports = () => {
912915
});
913916

914917
it('should successfully export filtered runs', async () => {
918+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
915919
const targetFileName = 'data.json';
916920

917921
// First export

test/public/runs/runsPerDataPass.overview.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,8 @@ module.exports = () => {
665665
// Press again actions dropdown to re-trigger render
666666
await pressElement(page, '#actions-dropdown-button .popover-trigger', true);
667667
setConfirmationDialogToBeAccepted(page);
668-
await pressElement(page, `${popoverSelector} button:nth-child(4)`, true);
669668
const oldTable = await page.waitForSelector('table').then((table) => table.evaluate((t) => t.innerHTML));
669+
await pressElement(page, `${popoverSelector} button:nth-child(4)`, true);
670670
await pressElement(page, '#actions-dropdown-button .popover-trigger', true);
671671
await waitForTableLength(page, 3, undefined, oldTable);
672672
// Processing of data might take a bit of time, but then expect QC flag button to be there

test/public/runs/runsPerLhcPeriod.overview.test.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const {
3232
expectColumnValues,
3333
openFilteringPanel,
3434
resetFilters,
35+
waitForButtonToBecomeActive
3536
} = require('../defaults.js');
3637
const { RUN_QUALITIES, RunQualities } = require('../../../lib/domain/enums/RunQualities.js');
3738
const { resetDatabaseContent } = require('../../utilities/resetDatabaseContent.js');
@@ -75,6 +76,7 @@ module.exports = () => {
7576
after(async () => {
7677
[page, browser] = await defaultAfter(page, browser);
7778
});
79+
const EXPORT_RUNS_TRIGGER_SELECTOR = '#export-data-trigger';
7880

7981
it('loads the page successfully', async () => {
8082
const response = await goToPage(page, 'runs-per-lhc-period', { queryParameters: { lhcPeriodId: 1 } });
@@ -204,7 +206,6 @@ module.exports = () => {
204206
await waitForTableLength(page, 4);
205207
});
206208

207-
const EXPORT_RUNS_TRIGGER_SELECTOR = '#export-data-trigger';
208209

209210
it('should successfully export all runs per lhc Period', async () => {
210211
await page.evaluate(() => {
@@ -213,7 +214,7 @@ module.exports = () => {
213214
});
214215

215216
const targetFileName = 'data.json';
216-
217+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
217218
// First export
218219
await pressElement(page, EXPORT_RUNS_TRIGGER_SELECTOR, true);
219220
await page.waitForSelector('select.form-control', { timeout: 200 });
@@ -286,9 +287,9 @@ module.exports = () => {
286287
await navigateToRunsPerLhcPeriod(page, 1, 4);
287288

288289
const targetFileName = 'data.csv';
289-
290+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
290291
// Export
291-
await pressElement(page, '#export-data-trigger');
292+
await pressElement(page, EXPORT_RUNS_TRIGGER_SELECTOR);
292293
await page.waitForSelector('#export-data-modal');
293294
await page.waitForSelector('#send:disabled');
294295
await page.waitForSelector('.form-control');

test/public/runs/runsPerSimulationPass.overview.test.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const {
3131
testTableSortingByColumn,
3232
waitForTableLength,
3333
expectColumnValues,
34+
waitForButtonToBecomeActive,
3435
} = require('../defaults.js');
3536

3637
const { expect } = chai;
@@ -74,6 +75,8 @@ module.exports = () => {
7475
[page, browser] = await defaultAfter(page, browser);
7576
});
7677

78+
const EXPORT_RUNS_TRIGGER_SELECTOR = '#export-data-trigger';
79+
7780
it('loads the page successfully', async () => {
7881
const response = await goToPage(page, 'runs-per-simulation-pass', { queryParameters: { simulationPassId: 2 } });
7982

@@ -235,11 +238,10 @@ module.exports = () => {
235238

236239
it('should successfully export runs', async () => {
237240
await navigateToRunsPerSimulationPass(page, 1, 2, 3);
238-
const EXPORT_RUNS_TRIGGER_SELECTOR = '#export-data-trigger';
239-
240241
const targetFileName = 'data.json';
241242

242243
// Export
244+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
243245
await pressElement(page, EXPORT_RUNS_TRIGGER_SELECTOR);
244246
await page.waitForSelector('#export-data-modal');
245247
await page.waitForSelector('#send:disabled');
@@ -270,7 +272,8 @@ module.exports = () => {
270272
const targetFileName = 'data.csv';
271273

272274
// Export
273-
await pressElement(page, '#export-data-trigger');
275+
await waitForButtonToBecomeActive(page, EXPORT_RUNS_TRIGGER_SELECTOR);
276+
await pressElement(page, EXPORT_RUNS_TRIGGER_SELECTOR);
274277
await page.waitForSelector('#export-data-modal');
275278
await page.waitForSelector('#send:disabled');
276279
await page.waitForSelector('.form-control');

0 commit comments

Comments
 (0)