Commit 2fd40770 by Ben Drucker

Handle status codes >= 400

parent 5661195b
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
}, },
"devDependencies": { "devDependencies": {
"chai": "1", "chai": "1",
"chai-as-promised": "4",
"gulp": "3", "gulp": "3",
"gulp-istanbul": "0.3", "gulp-istanbul": "0.3",
"gulp-jshint": "1", "gulp-jshint": "1",
......
'use strict'; 'use strict';
var assert = require('assert'); var assert = require('assert');
var util = require('util'); var util = require('util');
var _ = require('lodash'); var _ = require('lodash');
var Promise = require('bluebird'); var Promise = require('bluebird');
var needle = Promise.promisifyAll(require('needle')); var createError = require('create-error');
var pkg = require('../package.json'); var http = require('http');
var needle = Promise.promisifyAll(require('needle'));
var pkg = require('../package.json');
function ClearbitClient (config) { function ClearbitClient (config) {
config = config || {}; config = config || {};
...@@ -61,7 +63,22 @@ ClearbitClient.prototype.request = function (options) { ...@@ -61,7 +63,22 @@ ClearbitClient.prototype.request = function (options) {
user_agent: 'ClearbitNode/v' + pkg.version user_agent: 'ClearbitNode/v' + pkg.version
} }
) )
.get(1); .bind(this)
.spread(function (response, body) {
if (response.statusCode >= 400) {
var message = body.error ? body.error.message : http.STATUS_CODES[response.statusCode] || 'Unknown';
throw _.extend(new this.ClearbitError(message), {
type: body.error ? body.error.type : 'unknown',
body: body,
statusCode: response.statusCode
});
}
else {
return body;
}
});
}; };
ClearbitClient.ClearbitError = ClearbitClient.prototype.ClearbitError = createError('ClearbitError');
module.exports = ClearbitClient; module.exports = ClearbitClient;
'use strict'; 'use strict';
var expect = require('chai').expect; var expect = require('chai').use(require('chai-as-promised')).expect;
var nock = require('nock'); var nock = require('nock');
var sinon = require('sinon'); var sinon = require('sinon');
var needle = require('needle'); var needle = require('needle');
...@@ -137,6 +137,56 @@ describe('Client', function () { ...@@ -137,6 +137,56 @@ describe('Client', function () {
}); });
}); });
it('can handle JSON response errors', function () {
mock
.get('/v1/people/email/fakeperson@baddomain.com')
.reply(404, {
error: {
type: 'unknown_record',
message: 'Person not found'
}
});
return expect(client.request({
api: 'person',
path: '/people/email/fakeperson@baddomain.com'
}))
.to.be.rejected
.then(function (err) {
expect(err).to.be.an.instanceOf(Client.ClearbitError);
expect(err.type).to.equal('unknown_record');
expect(err.message).to.equal('Person not found');
expect(err.body).to.deep.equal({
error: {
type: 'unknown_record',
message: 'Person not found'
}
});
expect(err.statusCode).to.equal(404);
});
});
it('can handle generic response errors', function () {
mock
.get('/v1/people/badpath')
.reply(404);
return expect(client.request({
api: 'person',
path: '/people/badpath'
}))
.to.be.rejectedWith('Not Found');
});
it('can handle unknown errors', function () {
mock
.get('/v1')
.reply(600);
return expect(client.request({
api: 'person',
path: ''
}))
.to.be.rejectedWith('Unknown');
});
}); });
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment