e2ed
Version:
E2E testing framework over Playwright
79 lines (78 loc) • 3.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.waitForResponse = void 0;
const node_async_hooks_1 = require("node:async_hooks");
const internal_1 = require("../../constants/internal");
const testRunPromise_1 = require("../../context/testRunPromise");
const useContext_1 = require("../../useContext");
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 playwrightPage_1 = require("../../utils/playwrightPage");
const promise_1 = require("../../utils/promise");
const requestHooks_1 = require("../../utils/requestHooks");
const waitForEvents_1 = require("../../utils/waitForEvents");
/**
* Waits for some response (from browser) filtered by the response predicate.
* If the function runs longer than the specified timeout, it is rejected.
*/
// eslint-disable-next-line max-statements
exports.waitForResponse = (async (predicate, triggerOrOptions, options) => {
const startTimeInMs = Date.now();
(0, fn_1.setCustomInspectOnFunction)(predicate);
const trigger = typeof triggerOrOptions === 'function' ? triggerOrOptions : undefined;
const finalOptions = typeof triggerOrOptions === 'function' ? options : (triggerOrOptions ?? options);
const timeout = finalOptions?.timeout ?? (0, config_1.getFullPackConfig)().waitForResponseTimeout;
if (trigger !== undefined) {
(0, fn_1.setCustomInspectOnFunction)(trigger);
}
const page = (0, useContext_1.getPlaywrightPage)();
const testRunPromise = (0, testRunPromise_1.getTestRunPromise)();
let isTestRunCompleted = false;
void testRunPromise.then(() => {
isTestRunCompleted = true;
});
const timeoutWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(timeout);
const finalPredicate = (0, waitForEvents_1.getWaitForResponsePredicate)(predicate, finalOptions?.includeNavigationRequest ?? false);
let finalError;
let hasError = false;
const promise = (0, promise_1.addTimeoutToPromise)((0, playwrightPage_1.pageWaitForResponse)(page, node_async_hooks_1.AsyncLocalStorage.bind(async (playwrightResponse) => {
try {
const result = await finalPredicate(playwrightResponse);
return result;
}
catch (cause) {
if (!isTestRunCompleted) {
finalError = new error_1.E2edError('waitForResponse predicate threw an exception', {
cause,
timeout,
trigger,
});
hasError = true;
}
return true;
}
}), { timeout: internal_1.MAX_TIMEOUT_IN_MS }), timeout, new error_1.E2edError(`waitForResponse promise rejected after ${timeoutWithUnits} timeout`))
.then((playwrightResponse) => (0, requestHooks_1.getResponseFromPlaywrightResponse)(playwrightResponse))
.catch((error) => {
if (isTestRunCompleted) {
return new Promise(() => { });
}
throw error;
});
if (finalOptions?.skipLogs !== true) {
(0, log_1.log)(`Set wait for response with timeout ${timeoutWithUnits}`, { predicate, trigger }, 7 /* LogEventType.InternalCore */);
}
await trigger?.();
const response = await promise;
if (hasError) {
throw finalError;
}
if (finalOptions?.skipLogs !== true) {
const waitWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(Date.now() - startTimeInMs);
(0, log_1.log)(`Have waited for response for ${waitWithUnits}`, { predicate, response, timeoutWithUnits, trigger }, 7 /* LogEventType.InternalCore */);
}
return response;
});