salix-front/test/cypress/support/waitUntil.js

60 lines
1.6 KiB
JavaScript

const waitUntil = (subject, checkFunction, originalOptions = {}) => {
if (!(checkFunction instanceof Function)) {
throw new Error(
'`checkFunction` parameter should be a function. Found: ' + checkFunction
);
}
const defaultOptions = {
// base options
interval: 200,
timeout: 5000,
errorMsg: 'Timed out retrying',
// log options
description: 'waitUntil',
log: true,
customMessage: undefined,
logger: Cypress.log,
verbose: false,
customCheckMessage: undefined,
};
const options = { ...defaultOptions, ...originalOptions };
// filter out a falsy passed "customMessage" value
options.customMessage = [options.customMessage, originalOptions].filter(Boolean);
const endTime = Date.now() + options.timeout;
const check = (result) => {
if (result) {
return result;
}
if (Date.now() >= endTime) {
const msg =
options.errorMsg instanceof Function
? options.errorMsg(result, options)
: options.errorMsg;
throw new Error(msg);
}
cy.wait(options.interval, { log: false }).then(() => {
return resolveValue();
});
};
const resolveValue = () => {
const result = checkFunction(subject);
const isAPromise = Boolean(result && result.then);
if (isAPromise) {
return result.then(check);
} else {
return check(result);
}
};
return resolveValue();
};
export default waitUntil;