UNPKG

e2ed

Version:

E2E testing framework over Playwright

90 lines (89 loc) 3.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.oneTryOfRequest = void 0; const internal_1 = require("../../constants/internal"); const internal_2 = require("../../generators/internal"); const apiStatistics_1 = require("../apiStatistics"); const clone_1 = require("../clone"); const error_1 = require("../error"); const getDurationWithUnits_1 = require("../getDurationWithUnits"); const log_1 = require("../log"); const parse_1 = require("../parse"); const getQuery_1 = require("./getQuery"); /** * One try of request. * @internal */ const oneTryOfRequest = ({ isResponseBodyInJsonFormat, libRequest, logParams, options, requestBody, requestBodyAsString, timeout, urlObject, }) => new Promise((resolve, reject) => { const fullOptions = { ...options, requestHeaders: (0, clone_1.cloneWithoutUndefinedProperties)({ 'x-e2ed-request-id': (0, internal_2.getRandomId)(), ...options.requestHeaders, }), }; const fullLogParams = { ...logParams, ...fullOptions }; const { requestHeaders, ...fullOptionsWithoutHeaders } = fullOptions; const fullOptionsWithHeaders = { ...fullOptionsWithoutHeaders, headers: requestHeaders }; (0, log_1.log)(`Will be send a request to ${logParams.url}`, fullLogParams, 8 /* LogEventType.InternalUtil */); let endTimeout; const utcTimeInMs = Date.now(); const req = libRequest(urlObject, fullOptionsWithHeaders, (res) => { res.setEncoding('utf8'); const chunks = []; res.on('data', (chunk) => { chunks.push(chunk); }); res.on('end', () => { const completionTimeInMs = Date.now(); const responseBodyAsString = chunks.join(''); const statusCode = (res.statusCode ?? internal_1.BAD_REQUEST_STATUS_CODE); try { const responseBody = isResponseBodyInJsonFormat ? (0, parse_1.parseMaybeEmptyValueAsJson)(responseBodyAsString) : responseBodyAsString; const url = (res.url !== undefined && res.url !== '' ? res.url : urlObject.href); const request = { method: options.method, query: (0, getQuery_1.getQuery)(urlObject.search), requestBody, requestHeaders, url, utcTimeInMs, }; const duration = (0, getDurationWithUnits_1.getDurationWithUnits)(completionTimeInMs - request.utcTimeInMs); const response = { completionTimeInMs, duration, request, responseBody, responseHeaders: res.headers, statusCode, }; (0, apiStatistics_1.addResponseToApiStatistics)(response); clearTimeout(endTimeout); resolve({ fullLogParams, response }); } catch (cause) { clearTimeout(endTimeout); reject(new error_1.E2edError(`The response data string to request ${logParams.url} is not valid JSON: ${responseBodyAsString}`, { ...fullLogParams, cause, statusCode })); } }); }); endTimeout = setTimeout(() => { const timeoutWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(timeout); req.destroy(); req.emit('error', new error_1.E2edError(`The request to ${logParams.url} is timed out in ${timeoutWithUnits}`, { ...fullLogParams, cause: undefined, })); }, timeout); req.on('error', (cause) => { clearTimeout(endTimeout); reject(new error_1.E2edError(`Error on request to ${logParams.url}`, { ...fullLogParams, cause })); }); req.write(requestBodyAsString); req.end(); }); exports.oneTryOfRequest = oneTryOfRequest;