1 | import { expect } from "chai";
|
2 | import http from "../src/http-server";
|
3 | import nodeHttp from "http";
|
4 | import { HttpError, HttpParseError } from "../src/errors";
|
5 | import nock from "nock";
|
6 |
|
7 | let requestBody;
|
8 | beforeEach(() => { requestBody = undefined; });
|
9 |
|
10 |
|
11 | const stubGET = (path, status, response) => {
|
12 | nock("http://domain.com").get(path).reply(status, response);
|
13 | };
|
14 |
|
15 | const stubPOST = (path, status, response) => {
|
16 | nock("http://domain.com").post(path).reply(status, response);
|
17 | };
|
18 |
|
19 | const stubPUT = (path, status, response) => {
|
20 | nock("http://domain.com").put(path).reply(status, response);
|
21 | };
|
22 |
|
23 | const stubDELETE = (path, status, response) => {
|
24 | nock("http://domain.com").delete(path).reply(status, response);
|
25 | };
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | describe("Http (Server)", () => {
|
32 | it("exposes error classes", () => {
|
33 | expect(http.HttpError).to.equal(HttpError);
|
34 | expect(http.HttpParseError).to.equal(HttpParseError);
|
35 | });
|
36 |
|
37 |
|
38 | describe("get()", () => {
|
39 | it("resolves a promise with a [String] response", (done) => {
|
40 | stubGET("/user", 200, "hello");
|
41 | http.get("http://domain.com/user")
|
42 | .then((result) => {
|
43 | expect(result).to.equal("hello");
|
44 | done();
|
45 | });
|
46 | });
|
47 |
|
48 |
|
49 | it("resolves a promise with a [Number] response", (done) => {
|
50 | stubGET("/user", 200, 123);
|
51 | http.get("http://domain.com/user")
|
52 | .then((result) => {
|
53 | expect(result).to.equal(123);
|
54 | done();
|
55 | });
|
56 | });
|
57 |
|
58 | it("resolves a promise with a [Boolean] response", (done) => {
|
59 | stubGET("/user", 200, true);
|
60 | http.get("http://domain.com/user")
|
61 | .then((result) => {
|
62 | expect(result).to.equal(true);
|
63 | done();
|
64 | });
|
65 | });
|
66 |
|
67 |
|
68 | it("resolves a promise with an [Object] response (JSON)", (done) => {
|
69 | stubGET("/user", 200, { name:"phil" });
|
70 | http.get("http://domain.com/user")
|
71 | .then((result) => {
|
72 | expect(result).to.eql({ name:"phil" });
|
73 | done();
|
74 | });
|
75 | });
|
76 |
|
77 | it("resolves a promise with an [Array] response (JSON)", (done) => {
|
78 | stubGET("/user", 200, [1, 2, 3]);
|
79 | http.get("http://domain.com/user")
|
80 | .then((result) => {
|
81 | expect(result).to.eql([1, 2, 3]);
|
82 | done();
|
83 | });
|
84 | });
|
85 |
|
86 |
|
87 | it("throws an [HttpError] when status code is not 200", (done) => {
|
88 | stubGET("/user", 404, "Failed while making Http request.");
|
89 | http.get("http://domain.com/user")
|
90 | .catch(HttpError, (err) => {
|
91 | expect(err.message).to.equal("Failed while making Http request.");
|
92 | expect(err.status).to.equal(404);
|
93 | done()
|
94 | });
|
95 | });
|
96 |
|
97 | it("throws if the response cannot be parsed as JSON", (done) => {
|
98 | stubGET("/user", 200, "{not-json}");
|
99 | http.get("http://domain.com/user")
|
100 | .catch(HttpParseError, (err) => {
|
101 | expect(err.message).to.equal(`Failed to parse: "{not-json}"`);
|
102 | expect(err.responseText).to.equal("{not-json}");
|
103 | expect(err.parseError.message).to.equal("Unexpected token n");
|
104 | done();
|
105 | });
|
106 | });
|
107 | });
|
108 |
|
109 |
|
110 | describe("post | put | delete", () => {
|
111 | it("sends POSTs", (done) => {
|
112 | stubPOST("/user", 200, { result:true })
|
113 | http.post("http://domain.com/user", 999)
|
114 | .then((result) => {
|
115 | expect(result).to.eql({ result:true });
|
116 | done();
|
117 | });
|
118 | });
|
119 |
|
120 | it("sends PUTs", (done) => {
|
121 | stubPUT("/user", 200, { result:true })
|
122 | http.put("http://domain.com/user", 999)
|
123 | .then((result) => {
|
124 | expect(result).to.eql({ result:true });
|
125 | done();
|
126 | });
|
127 | });
|
128 |
|
129 | it("sends DELETEs", (done) => {
|
130 | stubDELETE("/user", 200, { result:true })
|
131 | http.delete("http://domain.com/user", 999)
|
132 | .then((result) => {
|
133 | expect(result).to.eql({ result:true });
|
134 | done();
|
135 | });
|
136 | });
|
137 | });
|
138 | });
|