UNPKG

e2ed

Version:

E2E testing framework over Playwright

81 lines (80 loc) 3.89 kB
"use strict"; 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 step_1 = require("../../step"); const useContext_1 = require("../../useContext"); const asserts_1 = require("../../utils/asserts"); 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 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. */ exports.waitForResponse = (async (predicate, triggerOrOptions, options) => { (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; const timeoutWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(timeout); if (trigger !== undefined) { (0, fn_1.setCustomInspectOnFunction)(trigger); } let response; await (0, step_1.step)(`Wait for response with timeout ${timeoutWithUnits}`, async () => { const page = (0, useContext_1.getPlaywrightPage)(); const testRunPromise = (0, testRunPromise_1.getTestRunPromise)(); let isTestRunCompleted = false; void testRunPromise.then(() => { isTestRunCompleted = true; }); 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; }); await trigger?.(); response = await promise; if (hasError) { throw finalError; } return { response }; }, { payload: { predicate, timeoutWithUnits, trigger }, skipLogs: finalOptions?.skipLogs ?? false, timeout: timeout + internal_1.ADDITIONAL_STEP_TIMEOUT, type: 7 /* LogEventType.InternalCore */, }); (0, asserts_1.assertValueIsDefined)(response, 'response is defined', { predicate, trigger }); return response; });