e2ed
Version:
E2E testing framework over Playwright
76 lines (75 loc) • 5.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.waitForAllRequestsComplete = void 0;
const testRunPromise_1 = require("../../context/testRunPromise");
const waitForEventsState_1 = require("../../context/waitForEventsState");
const config_1 = require("../../utils/config");
const error_1 = require("../../utils/error");
const fn_1 = require("../../utils/fn");
const getDurationWithUnits_1 = require("../../utils/getDurationWithUnits");
const log_1 = require("../../utils/log");
const object_1 = require("../../utils/object");
const promise_1 = require("../../utils/promise");
const waitForEvents_1 = require("../../utils/waitForEvents");
/**
* Waits for the complete of all requests that satisfy the request predicate.
* If the function runs longer than the specified timeout, it is rejected.
* If there are no new requests for more than `maxIntervalBetweenRequestsInMs` milliseconds,
* the function resolves successfully.
*/
const waitForAllRequestsComplete = async (predicate, { maxIntervalBetweenRequestsInMs, timeout } = {}) => {
const startTimeInMs = Date.now();
(0, fn_1.setCustomInspectOnFunction)(predicate);
const { allRequestsCompletePredicates, hashOfNotCompleteRequests } = (0, waitForEventsState_1.getWaitForEventsState)();
const { waitForAllRequestsComplete: defaultTimeouts } = (0, config_1.getFullPackConfig)();
const resolveTimeout = maxIntervalBetweenRequestsInMs ?? defaultTimeouts.maxIntervalBetweenRequestsInMs;
const maxIntervalBetweenRequests = (0, getDurationWithUnits_1.getDurationWithUnits)(resolveTimeout);
const rejectTimeout = timeout ?? defaultTimeouts.timeout;
const rejectTimeoutWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(rejectTimeout);
(0, log_1.log)(`Set wait for all requests complete with timeout ${rejectTimeoutWithUnits}`, { maxIntervalBetweenRequests, predicate }, 7 /* LogEventType.InternalCore */);
const requestHookContextIds = await (0, waitForEvents_1.getInitialIdsForAllRequestsCompletePredicate)(hashOfNotCompleteRequests, predicate);
const { clearRejectTimeout, promiseWithTimeout, reject, resolve, setRejectTimeoutFunction } = (0, promise_1.getPromiseWithResolveAndReject)(rejectTimeout);
const allRequestsCompletePredicateWithPromise = {
allRequestsCompleteTimeInMs: 0,
clearResolveTimeout: () => { },
predicate,
reject,
requestHookContextIds,
setResolveTimeout: () => { },
};
const testRunPromise = (0, testRunPromise_1.getTestRunPromise)();
void testRunPromise.then(clearRejectTimeout);
setRejectTimeoutFunction(() => {
const { allRequestsCompleteTimeInMs } = allRequestsCompletePredicateWithPromise;
const logParamsAboutTime = allRequestsCompleteTimeInMs === 0
? { allRequestsHaveNeverBeenCompletedYet: true }
: {
timeSinceAllRequestsComplete: (0, getDurationWithUnits_1.getDurationWithUnits)(Date.now() - allRequestsCompleteTimeInMs),
};
const urlsOfNotCompleteRequests = (0, waitForEvents_1.getUrlsByRequestHookContextIds)(requestHookContextIds, hashOfNotCompleteRequests);
const error = new error_1.E2edError(`waitForAllRequestsComplete promise rejected after ${rejectTimeoutWithUnits} timeout`, { ...logParamsAboutTime, predicate, urlsOfNotCompleteRequests });
allRequestsCompletePredicates.delete(allRequestsCompletePredicateWithPromise);
allRequestsCompletePredicateWithPromise.clearResolveTimeout();
reject(error);
});
const setResolveTimeout = () => {
(0, object_1.setReadonlyProperty)(allRequestsCompletePredicateWithPromise, 'allRequestsCompleteTimeInMs', Date.now());
allRequestsCompletePredicateWithPromise.clearResolveTimeout();
const { clearRejectTimeout: clearResolveTimeout, promiseWithTimeout: resolvePromise } = (0, promise_1.getPromiseWithResolveAndReject)(resolveTimeout);
(0, object_1.setReadonlyProperty)(allRequestsCompletePredicateWithPromise, 'clearResolveTimeout', clearResolveTimeout);
void testRunPromise.then(clearResolveTimeout);
resolvePromise.catch(() => {
allRequestsCompletePredicates.delete(allRequestsCompletePredicateWithPromise);
const waitWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(Date.now() - startTimeInMs);
(0, log_1.log)(`Have waited for all requests complete for ${waitWithUnits}`, { maxIntervalBetweenRequests, predicate, timeout: rejectTimeout }, 8 /* LogEventType.InternalUtil */);
resolve();
});
};
(0, object_1.setReadonlyProperty)(allRequestsCompletePredicateWithPromise, 'setResolveTimeout', setResolveTimeout);
allRequestsCompletePredicates.add(allRequestsCompletePredicateWithPromise);
if (requestHookContextIds.size === 0) {
allRequestsCompletePredicateWithPromise.setResolveTimeout();
}
return promiseWithTimeout;
};
exports.waitForAllRequestsComplete = waitForAllRequestsComplete;