1 | require("./common");
|
2 | var _ = 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 | })();
|