Commit 2fd40770 by Ben Drucker

Handle status codes >= 400

parent 5661195b
......@@ -29,6 +29,7 @@
},
"devDependencies": {
"chai": "1",
"chai-as-promised": "4",
"gulp": "3",
"gulp-istanbul": "0.3",
"gulp-jshint": "1",
......
......@@ -4,6 +4,8 @@ var assert = require('assert');
var util = require('util');
var _ = require('lodash');
var Promise = require('bluebird');
var createError = require('create-error');
var http = require('http');
var needle = Promise.promisifyAll(require('needle'));
var pkg = require('../package.json');
......@@ -61,7 +63,22 @@ ClearbitClient.prototype.request = function (options) {
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;
'use strict';
var expect = require('chai').expect;
var expect = require('chai').use(require('chai-as-promised')).expect;
var nock = require('nock');
var sinon = require('sinon');
var needle = require('needle');
......@@ -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