doubleagent
Version:
A superagent based async/await friendly testing util
131 lines (130 loc) • 4.54 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
var http = require("http");
var https = require("https");
var request = require("superagent");
var isObject = function (thing) { return typeof thing === 'object' && thing !== null; };
/**
* Binds the app to a http port and returns the
* base url thing
*
* @param {Object} http server
* @return {string} base url
*/
var findAppUrl = function (server) {
if (!server.address())
server.listen(0);
var port = server.address().port;
var protocol = server instanceof https.Server ? 'https' : 'http';
return protocol + "://127.0.0.1:" + port;
};
/**
* Builds the superagent request instance
*
* @param {Object} config contains configuration e.g. serializer
* @param {Object} options for the request method, url, params, headers and files
* @return {Object} superagent request
*/
var buildRequest = function (config, options) {
var serializer = config.serializer;
var method = options.method, url = options.url, params = options.params, headers = options.headers, files = options.files;
var req = request[method](url);
/* eslint-disable no-restricted-syntax,guard-for-in */
if (params) {
if (files) {
for (var param in params) {
req = req.field(param, params[param]);
}
}
else if (method === 'get' || method === 'head') {
var query = serializer && isObject(params) ? serializer(params) : params;
req = req.query(query);
}
else {
req = req.send(params);
}
}
if (files) {
for (var file in files) {
req = req.attach(file, files[file]);
}
}
if (headers) {
for (var key in headers) {
req = req.set(key, headers[key]);
}
}
/* eslint-enable no-restricted-syntax, guard-for-in */
return req;
};
/**
* Makes the call to the app with specified params
*
* @param {Object} httpServer
* @param {Object} config contains configuration e.g. serializer
* @param {Object} options for the request method, path, params, headers and files
* @return {Promise<response>} response the http response
*/
var doubleCall = function (server, config, options) {
var path = options.path, rest = __rest(options, ["path"]);
return new Promise(function (resolve, reject) {
var url = findAppUrl(server);
var req = buildRequest(config, __assign({ url: url + path }, rest));
req.end(function (err, res) {
server.close();
if (err && (!res || err.status !== res.status)) {
reject(err);
}
else {
resolve(res);
}
});
});
};
var agent = function (app, config) {
if (config === void 0) { config = {}; }
var api = {};
var methods = ['get', 'head', 'post', 'put', 'patch', 'delete'];
var server = http.createServer(app);
for (var i = methods.length; i--;) {
api[methods[i]] = (function (method) {
return function (path, params, headers, files) {
var combinedHeaders = __assign(__assign({}, api.defaultHeaders), headers);
return doubleCall(server, config, {
method: method,
path: path,
params: params,
headers: combinedHeaders,
files: files,
});
};
})(methods[i]);
}
api.server = server;
api.app = app;
api.urlFor = function (path) { return findAppUrl(server) + path; };
return api;
};
exports.default = agent;