e2ed
Version:
E2E testing framework over Playwright
90 lines (89 loc) • 3.97 kB
JavaScript
;
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;