60 lines
1.6 KiB
JavaScript
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;
|