Skip to content

Commit 4c5eebf

Browse files
Add support for detailed Spotify Web API error message and reason (#294)
* Add support for detailed Spotify Web API error message and reason * Remove debug print
1 parent 89e5a90 commit 4c5eebf

File tree

4 files changed

+62
-2
lines changed

4 files changed

+62
-2
lines changed

__tests__/http-manager.js

+30
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var Request = require('../src/base-request');
22
var superagent = require('superagent');
3+
var WebApiError = require('../src/webapi-error');
34

45
describe('Make requests', () => {
56
afterEach(() => {
@@ -61,6 +62,35 @@ describe('Make requests', () => {
6162
done();
6263
});
6364
});
65+
66+
test('Should process an error GET request with an error reason when detailed Web API error object is in response', done => {
67+
superagent.__setMockError({
68+
message: 'Generic Error Message',
69+
response: {
70+
body: {
71+
error: {
72+
message: 'Detailed Web API Error message',
73+
status: 400,
74+
reason: 'You messed up!'
75+
}
76+
}
77+
}
78+
});
79+
80+
var HttpManager = require('../src/http-manager');
81+
var request = Request.builder()
82+
.withHost('such.api.wow')
83+
.withPort(1337)
84+
.withScheme('http')
85+
.build();
86+
87+
HttpManager.get(request, function(errorObject) {
88+
expect(errorObject).toBeInstanceOf(Error);
89+
expect(errorObject.message).toBe('Detailed Web API Error message');
90+
expect(errorObject.reason).toBe('You messed up!');
91+
done();
92+
});
93+
});
6494
});
6595

6696
test('Should make a successful POST request', done => {

__tests__/webapi-error.js

+11
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,15 @@ describe('Create Web Api Error', () => {
66
expect(error.message).toBe('Something has gone terribly wrong!');
77
expect(error.statusCode).toBe(500);
88
});
9+
10+
test('should create error with message, status code and reason if reason is provided', () => {
11+
var error = new WebApiError(
12+
'Something has gone terribly wrong!',
13+
500,
14+
'You messed up!'
15+
);
16+
expect(error.message).toBe('Something has gone terribly wrong!');
17+
expect(error.reason).toBe('You messed up!');
18+
expect(error.statusCode).toBe(500);
19+
});
920
});

src/http-manager.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,23 @@ var _getErrorObject = function(defaultMessage, err) {
3333
var errorObject;
3434
if (typeof err.error === 'object' && typeof err.error.message === 'string') {
3535
// Web API Error format
36-
errorObject = new WebApiError(err.error.message, err.error.status);
36+
var webApiErrorObject = err.error.response && err.error.response.body;
37+
// Use detailed Web API error object only if message and status exist
38+
// reason can be undefined, we still benefit from a more detailed error message
39+
if (
40+
webApiErrorObject &&
41+
webApiErrorObject.error &&
42+
webApiErrorObject.error.message &&
43+
webApiErrorObject.error.status
44+
) {
45+
errorObject = new WebApiError(
46+
webApiErrorObject.error.message,
47+
webApiErrorObject.error.status,
48+
webApiErrorObject.error.reason
49+
);
50+
} else {
51+
errorObject = new WebApiError(err.error.message, err.error.status);
52+
}
3753
} else if (typeof err.error === 'string') {
3854
// Authorization Error format
3955
/* jshint ignore:start */

src/webapi-error.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
'use strict';
22

3-
function WebapiError(message, statusCode) {
3+
function WebapiError(message, statusCode, reason) {
44
this.name = 'WebapiError';
55
this.message = message || '';
66
this.statusCode = statusCode;
7+
if (reason) {
8+
this.reason = reason;
9+
}
710
}
811

912
WebapiError.prototype = Error.prototype;

0 commit comments

Comments
 (0)