UNPKG

5.86 kBJavaScriptView Raw
1require("./common");
2var _ = require("underscore"),
3 LastFmRequest = require("../lib/lastfm/lastfm-request"),
4 fakes = require("./fakes");
5
6(function() {
7 describe("a LastFm request")
8
9 var lastfm, connection, url, gently, request;
10
11 before(function() {
12 lastfm = new LastFmNode();
13 connection = new fakes.Client(80, lastfm.host);
14 request = new fakes.ClientRequest();
15 gently = new Gently();
16 });
17
18 it("creates a get request", function() {
19 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
20 assert.equal("GET", options.method);
21 assert.equal(lastfm.host, options.host);
22 return request;
23 });
24 var lastfmRequest = new LastFmRequest(lastfm, "any.method");
25 });
26
27 it("ends the request", function() {
28 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function() {
29 return request;
30 });
31 gently.expect(request, "end");
32 var lastfmRequest = new LastFmRequest(lastfm);
33 });
34
35 it("defaults user agent to lastfm-node", function() {
36 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
37 assert.equal("lastfm-node", options.headers["User-Agent"]);
38 return request;
39 });
40 var lastFmRequest = new LastFmRequest(lastfm, "any.method");
41 });
42
43 it("can specify user agent in lastfm options", function() {
44 var useragent = "custom-user-agent";
45 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
46 assert.equal(useragent, options.headers["User-Agent"]);
47 return request;
48 });
49 var lastfm = new LastFmNode({ useragent: useragent });
50 var lastFmRequest = new LastFmRequest(lastfm, "any.method");
51 });
52
53 it("bubbles up connection errors", function() {
54 var message = "Bubbled error";
55 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
56 return request;
57 });
58 var lastfmRequest = new LastFmRequest(lastfm, "any.method");
59 gently.expect(lastfmRequest, "emit", function(event, error) {
60 assert.equal("error", event);
61 assert.equal(message, error.message);
62 });
63 request.emit("error", new Error(message));
64 });
65})();
66
67(function() {
68 describe("a LastFm request with a body")
69
70 var lastfm, connection, url, gently, request, params;
71
72 before(function() {
73 lastfm = new LastFmNode();
74 connection = new fakes.Client(80, lastfm.host);
75 request = new fakes.ClientRequest();
76 gently = new Gently();
77 params = { foo:"bar" };
78 });
79
80 it("write parameter forces a post request", function() {
81 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
82 assert.equal("POST", options.method);
83 assert.equal(lastfm.url, options.path);
84 assert.equal(lastfm.host, options.host);
85 return request;
86 });
87 params.write = true;
88 var lastFmRequest = new LastFmRequest(lastfm, "any.method", params);
89 });
90
91 it("post requests includes additional headers", function() {
92 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
93 assert.ok(options.headers["Content-Length"]);
94 assert.equal("application/x-www-form-urlencoded", options.headers["Content-Type"]);
95 return request;
96 });
97 params.write = true;
98 var lastFmRequest = new LastFmRequest(lastfm, "any.method", params);
99 });
100
101 it("writes body to request", function() {
102 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function() {
103 return request;
104 });
105 gently.expect(request, "write", function(data) {
106 assert.ok(data);
107 });
108 params.write = true;
109 var lastFmRequest = new LastFmRequest(lastfm, "any.method", params);
110 });
111})();
112
113(function() {
114 var lastfm, connection, url, gently, request, receivedData;
115
116 describe("A Lastfm request which returns data")
117
118 before(function() {
119 lastfm = new LastFmNode();
120 connection = new fakes.Client(80, lastfm.host);
121 request = new fakes.ClientRequest();
122 gently = new Gently();
123 });
124
125 it("emits data as json", function() {
126 whenReceiving("{\"testdata\":\"received\"}");
127 expectRequestToEmit(function(event, data) {
128 assert.equal("success", event);
129 assert.equal("received", data.testdata);
130 });
131 });
132
133 it("emits error if received data cannot be parsed to json", function() {
134 whenReceiving("{\"testdata\"");
135 expectRequestToEmit(function(event, error) {
136 assert.equal("error", event);
137 assert.ok(error);
138 });
139 });
140
141 it("emits error if json response contains a lastfm error", function() {
142 whenReceiving("{\"error\": 2, \"message\": \"service does not exist\"}");
143 expectRequestToEmit(function(event, error) {
144 assert.equal("error", event);
145 assert.equal("service does not exist", error.message);
146 });
147 });
148
149 it("accepts data in chunks", function() {
150 whenReceiving(["{\"testda", "ta\":\"recei", "ved\"}"]);
151 expectRequestToEmit(function(event, data) {
152 assert.equal("success", event);
153 assert.equal("received", data.testdata);
154 });
155 });
156
157 it("does not covert to json if requested is different format", function() {
158 var xml = "<somexml />";
159 lastfm.format = "xml";
160 whenReceiving(xml);
161 expectRequestToEmit(function(event, data) {
162 assert.equal(xml, data);
163 });
164 });
165
166 function whenReceiving(data) {
167 if (data.constructor.name !== 'Array') {
168 data = [data];
169 }
170 receivedData = data;
171 }
172
173 function expectRequestToEmit(expectation) {
174 var response = new fakes.ClientResponse();
175 gently.expect(GENTLY_HIJACK.hijacked.http, "request", function(options, cb) {
176 cb(response);
177 return request;
178 });
179 var lastfmRequest = new LastFmRequest(lastfm);
180 gently.expect(lastfmRequest, "emit", expectation);
181 _(receivedData).each(function(data) {
182 response.emit("data", data);
183 });
184 response.emit("end");
185 }
186})();