all files / blackbird/modules/utils/ callApp.js

100% Statements 12/12
100% Branches 8/8
100% Functions 2/2
100% Lines 12/12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50                                                  82×     82×   82×   78× 78×   81×           82×      
/* eslint no-confusing-arrow: off */
const Connection = require("../Connection");
const Promise = require("bluebird");
const R = require("ramda");
 
/**
 * Creates a new Connection using the given options and sends
 * the request to the given app. Returns a promise for the connection
 * object when the response is received.
 *
 * Options may be any of the Connection options, plus the following:
 *
 * - binary     By default the response content is buffered and stored
 *              in the responseText property of the connection. Set this
 *              option true to disable this behavior.
 * - maxLength  The maximum length of the response content to accept.
 *              This option has no effect when "binary" is true. By
 *              default there is no maximum length.
 * - encoding   The encoding to use to decode the response body. This
 *              option has no effect when "binary" is true. By default
 *              the encoding is whatever was specified in the Content-Type
 *              header of the response.
 *
 * If a modifier function is provided, it will have a chance to modify
 * the Connection object immediately before the request is made.
 */
const binary = R.lensPath(["binary"]),
    maxLength = R.lensPath(["maxLength"]),
    encoding = R.lensPath(["encoding"]);
module.exports = function callApp(app, options, mod) {
    const c = new Connection(options || {}),
        modifier = mod || R.identity;
 
    return Promise.resolve(modifier(c))
        .then(function (maybeConn) {
            const conn = R.is(Connection, maybeConn) ? maybeConn : c,
                setResponseText = (content) => {
                    conn.responseText = content;
                    return conn;
                },
                checkBinary = () => R.view(binary, options) ?
                    conn :
                    conn.response
                        .stringifyContent(R.view(maxLength, options), R.view(encoding, options))
                        .then(setResponseText);
 
            return conn.run(app).then(checkBinary);
        });
};