diff --git a/spec/HTTPRequest.spec.js b/spec/HTTPRequest.spec.js new file mode 100644 index 00000000..bf68fd7c --- /dev/null +++ b/spec/HTTPRequest.spec.js @@ -0,0 +1,154 @@ +var httpRequest = require("../src/httpRequest"), + bodyParser = require('body-parser'), + express = require("express"); + +var port = 13371; +var httpRequestServer = "http://localhost:"+port; + +var app = express(); +app.use(bodyParser.json({ 'type': '*/*' })); +app.get("/hello", function(req, res){ + res.json({response: "OK"}); +}); + +app.get("/404", function(req, res){ + res.status(404); + res.send("NO"); +}); + +app.get("/301", function(req, res){ + res.status(301); + res.location("/hello"); + res.send(); +}); + +app.post('/echo', function(req, res){ + res.json(req.body); +}) + +app.listen(13371); + + +describe("httpRequest", () => { + + it("should do /hello", (done) => { + httpRequest({ + url: httpRequestServer+"/hello" + }).then(function(httpResponse){ + expect(httpResponse.status).toBe(200); + expect(httpResponse.buffer).toEqual(new Buffer('{"response":"OK"}')); + expect(httpResponse.text).toEqual('{"response":"OK"}'); + expect(httpResponse.data.response).toEqual("OK"); + done(); + }, function(){ + fail("should not fail"); + done(); + }) + }); + + it("should do /hello with callback and promises", (done) => { + var calls = 0; + httpRequest({ + url: httpRequestServer+"/hello", + success: function() { calls++; }, + error: function() { calls++; } + }).then(function(httpResponse){ + expect(calls).toBe(1); + expect(httpResponse.status).toBe(200); + expect(httpResponse.buffer).toEqual(new Buffer('{"response":"OK"}')); + expect(httpResponse.text).toEqual('{"response":"OK"}'); + expect(httpResponse.data.response).toEqual("OK"); + done(); + }, function(){ + fail("should not fail"); + done(); + }) + }); + + it("should do not follow redirects by default", (done) => { + + httpRequest({ + url: httpRequestServer+"/301" + }).then(function(httpResponse){ + expect(httpResponse.status).toBe(301); + done(); + }, function(){ + fail("should not fail"); + done(); + }) + }); + + it("should follow redirects when set", (done) => { + + httpRequest({ + url: httpRequestServer+"/301", + followRedirects: true + }).then(function(httpResponse){ + expect(httpResponse.status).toBe(200); + expect(httpResponse.buffer).toEqual(new Buffer('{"response":"OK"}')); + expect(httpResponse.text).toEqual('{"response":"OK"}'); + expect(httpResponse.data.response).toEqual("OK"); + done(); + }, function(){ + fail("should not fail"); + done(); + }) + }); + + it("should fail on 404", (done) => { + var calls = 0; + httpRequest({ + url: httpRequestServer+"/404", + success: function() { + calls++; + fail("should not succeed"); + done(); + }, + error: function(httpResponse) { + calls++; + expect(calls).toBe(1); + expect(httpResponse.status).toBe(404); + expect(httpResponse.buffer).toEqual(new Buffer('NO')); + expect(httpResponse.text).toEqual('NO'); + expect(httpResponse.data).toBe(undefined); + done(); + } + }); + }) + + it("should fail on 404", (done) => { + httpRequest({ + url: httpRequestServer+"/404", + }).then(function(httpResponse){ + fail("should not succeed"); + done(); + }, function(httpResponse){ + expect(httpResponse.status).toBe(404); + expect(httpResponse.buffer).toEqual(new Buffer('NO')); + expect(httpResponse.text).toEqual('NO'); + expect(httpResponse.data).toBe(undefined); + done(); + }) + }) + + it("should post on echo", (done) => { + var calls = 0; + httpRequest({ + method: "POST", + url: httpRequestServer+"/echo", + body: { + foo: "bar" + }, + success: function() { calls++; }, + error: function() { calls++; } + }).then(function(httpResponse){ + expect(calls).toBe(1); + expect(httpResponse.status).toBe(200); + expect(httpResponse.data).toEqual({foo: "bar"}); + done(); + }, function(httpResponse){ + fail("should not fail"); + done(); + }) + }) +}); diff --git a/src/httpRequest.js b/src/httpRequest.js index db696c65..29912f12 100644 --- a/src/httpRequest.js +++ b/src/httpRequest.js @@ -9,13 +9,15 @@ module.exports = function(options) { }; delete options.success; delete options.error; - if (options.uri && !options.url) { - options.uri = options.url; - delete options.url; - } + delete options.uri; // not supported if (typeof options.body === 'object') { options.body = JSON.stringify(options.body); + options.headers = options.headers || {}; + options.headers['Content-Type'] = "application/json"; } + // set follow redirects to false by default + options.followRedirect = options.followRedirects == true ? true : false; + request(options, (error, response, body) => { var httpResponse = {}; httpResponse.status = response.statusCode; @@ -29,12 +31,12 @@ module.exports = function(options) { // Consider <200 && >= 400 as errors if (error || httpResponse.status <200 || httpResponse.status >=400) { if (callbacks.error) { - return callbacks.error(httpResponse); + callbacks.error(httpResponse); } return promise.reject(httpResponse); } else { if (callbacks.success) { - return callbacks.success(httpResponse); + callbacks.success(httpResponse); } return promise.resolve(httpResponse); }