Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/scmorrison/handle rejections #42

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions lib/utils/httpRequestor.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,20 +161,21 @@ exports.create = function(requestorConfig) {

var retryWithBackoffHelper = (url, method, methodName, requestOptions, retryOptions, numRetries) => {
return error => {
var backoffMillis = retryOptions.calcRetryBackoff(numRetries, error);
var processedError = handleResponse(error.response);
var backoffMillis = retryOptions.calcRetryBackoff(numRetries, processedError);

var shouldExitRetry =
!shouldRetry(error) ||
!shouldRetry(processedError) ||
backoffMillis < 0 ||
Date.now() + backoffMillis >= retryOptions.endRetryTime;

if (shouldExitRetry) {
logger.logRetryFailure(methodName, requestOptions, numRetries);
return new Promise.reject(error);
return new Promise.reject(processedError);
}

var nextRetry = numRetries + 1;
logger.logRetryAttempt(methodName, requestOptions, error, nextRetry);
logger.logRetryAttempt(methodName, requestOptions, processedError, nextRetry);
return Promise.delay(backoffMillis)
.then(() => retryHelper(url, method, methodName, requestOptions, retryOptions, nextRetry));
};
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/responseHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ module.exports = (response) => {
errorResponse.message = response.data;
}

return new Promise.reject(errorResponse);
return errorResponse;
}

outResponse.content = response.data;
Expand Down
10 changes: 4 additions & 6 deletions test/functional/responseHandler_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,10 @@ describe('Utils Unit Tests', function() {
it('should return a rejected promise if status code is not 200', () => {
mockResponse.status = 500;
mockResponse.data = mockBodyError;
handleResponse(mockResponse)
.catch(function(error) {
error.status.should.equal(500);
error.message.should.equal('EMERGENCY');
error.errorCode.should.equal(911);
});
var errResponse = handleResponse(mockResponse);
errResponse.statusCode.should.equal(500);
errResponse.message.should.equal('EMERGENCY');
errResponse.errorCode.should.equal(911);
});

it('should return parsed JSON body', () => {
Expand Down
36 changes: 13 additions & 23 deletions test/functional/utils/responseHandler_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,14 @@ describe('responseHandler', () => {
data: body
};

return responseHandler(response)
.then(() => {
should.fail('Function should have thrown an error');
})
.catch((error) => {
error.should.have.properties(['statusCode', 'headers', 'errorCode', 'message', 'refId', 'detail']);
error.statusCode.should.equal(response.status);
error.headers.should.equal(response.headers);
error.errorCode.should.equal(body.errorCode);
error.message.should.equal(body.message);
error.refId.should.equal(body.refId);
error.detail.should.equal(body.detail);
});
var responseError = responseHandler(response);
responseError.should.have.properties(['statusCode', 'headers', 'errorCode', 'message', 'refId', 'detail']);
responseError.statusCode.should.equal(response.status);
responseError.headers.should.equal(response.headers);
responseError.errorCode.should.equal(body.errorCode);
responseError.message.should.equal(body.message);
responseError.refId.should.equal(body.refId);
responseError.detail.should.equal(body.detail);
});

it('should return a rejected promise with an error message for non-JSON response', () => {
Expand All @@ -59,16 +54,11 @@ describe('responseHandler', () => {
data: body
};

return responseHandler(response)
.then(() => {
should.fail('Function should have thrown an error');
})
.catch(error => {
error.should.have.properties(['statusCode', 'headers', 'message']);
error.statusCode.should.equal(response.status);
error.headers.should.equal(response.headers);
error.message.should.equal(body);
});
var responseError = responseHandler(response);
responseError.should.have.properties(['statusCode', 'headers', 'message']);
responseError.statusCode.should.equal(response.status);
responseError.headers.should.equal(response.headers);
responseError.message.should.equal(body);
});
});
});
24 changes: 12 additions & 12 deletions test/functional/utils_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,13 +255,13 @@ describe('Utils Unit Tests', function() {
it('request should error as false, using promises', () =>
stubbedRequestor
.get(sampleRequest)
.catch(error => error.error.should.be.true));
.catch(error => error.content.should.be.true));

it('request should error as false, using callbacks', (done) => {
stubbedRequestor
.get(sampleRequest,
(err, data) => {
err.should.be.eql(mockBody);
err.content.should.be.true
done();
});
});
Expand Down Expand Up @@ -312,7 +312,7 @@ describe('Utils Unit Tests', function() {

function givenGetReturnsError() {
requestStub.returns(Promise.resolve([{}, {}]));
handleResponseStub.returns(Promise.reject({errorCode: 4001}));
handleResponseStub.returns({errorCode: 4001});
}

function givenGetReturnsSuccess() {
Expand Down Expand Up @@ -429,13 +429,13 @@ describe('Utils Unit Tests', function() {
it('request should error as false', () =>
stubbedRequestor
.post(sampleRequest)
.catch(error => error.error.should.be.true));
.catch(error => error.content.should.be.true));

it('request should error as false', (done) => {
stubbedRequestor
.post(sampleRequest,
(err, data) => {
err.should.be.eql(mockBody);
err.content.should.be.true
done();
});
});
Expand Down Expand Up @@ -493,7 +493,7 @@ describe('Utils Unit Tests', function() {

function givenPostReturnsError() {
requestStub.returns(Promise.resolve([{}, {}]));
handleResponseStub.returns(Promise.reject({errorCode: 4001}));
handleResponseStub.returns({errorCode: 4001});
}

function givenPostReturnsSuccess() {
Expand Down Expand Up @@ -619,13 +619,13 @@ describe('Utils Unit Tests', function() {
it('request should error as false', () =>
stubbedRequestor
.put(sampleRequest)
.catch(error => error.error.should.be.true));
.catch(error => error.content.should.be.true));

it('request should error as false', (done) => {
stubbedRequestor
.put(sampleRequest,
(err, data) => {
err.should.eql(mockBody);
err.content.should.be.true
done();
});
});
Expand Down Expand Up @@ -683,7 +683,7 @@ describe('Utils Unit Tests', function() {

function givenPutReturnsError() {
requestStub.returns(Promise.resolve([{}, {}]));
handleResponseStub.returns(Promise.reject({errorCode: 4001}));
handleResponseStub.returns({errorCode: 4001});
}

function givenPutReturnsSuccess() {
Expand Down Expand Up @@ -810,13 +810,13 @@ describe('Utils Unit Tests', function() {
it('request should error as false', () =>
stubbedRequestor
.delete(sampleRequest)
.catch(error => error.error.should.be.true));
.catch(error => error.content.should.be.true));

it('request should error as false', (done) => {
stubbedRequestor
.delete(sampleRequest,
(err, data) => {
err.should.eql(mockBody);
err.content.should.be.true;
done();
});
});
Expand Down Expand Up @@ -869,7 +869,7 @@ describe('Utils Unit Tests', function() {

function givenDeleteReturnsError() {
requestStub.returns(Promise.resolve([{}, {}]));
handleResponseStub.returns(Promise.reject({errorCode: 4001}));
handleResponseStub.returns({errorCode: 4001});
}

function givenDeleteReturnsSuccess() {
Expand Down