UNPKG

doubleagent

Version:

A superagent based async/await friendly testing util

131 lines (130 loc) 4.54 kB
"use strict"; 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;