Commit 459918e8 by Ben Drucker

Handle resource not found errors

parent 2fd40770
......@@ -3,15 +3,14 @@
var assert = require('assert');
var _ = require('lodash');
var Promise = require('bluebird');
var utils = require('./utils');
module.exports = function (client) {
function Company (data) {
_.extend(this, data);
}
Company.prototype.pending = function () {
return !this.id;
};
Company.prototype.pending = utils.pending;
Company.find = Promise.method(function (options) {
assert(options && options.domain, 'A domain must be provided');
......@@ -20,12 +19,14 @@ module.exports = function (client) {
path: '/companies/domain/' + options.domain
}, options))
.bind(this)
.then(function (data) {
return new this(data);
.then(utils.cast)
.catch(utils.isUnknownRecord, function (err) {
throw new this.NotFoundError('Company not found');
});
});
Company.prototype.client = Company.client = client;
Company.NotFoundError = utils.NotFoundError;
return Company;
};
......@@ -3,15 +3,14 @@
var assert = require('assert');
var _ = require('lodash');
var Promise = require('bluebird');
var utils = require('./utils')
module.exports = function (client) {
function Person (data) {
_.extend(this, data);
}
Person.prototype.pending = function () {
return !this.id;
};
Person.prototype.pending = utils.pending;
Person.find = Promise.method(function (options) {
assert(options && options.email, 'An email must be provided');
......@@ -21,12 +20,14 @@ module.exports = function (client) {
query: _.pick(options, 'subscribe', 'company')
}, options))
.bind(this)
.then(function (data) {
return new this(data);
.then(utils.cast)
.catch(utils.isUnknownRecord, function (err) {
throw new this.NotFoundError('Person not found');
});
});
Person.prototype.client = Person.client = client;
Person.NotFoundError = utils.NotFoundError;
return Person;
};
'use strict';
var createError = require('create-error');
exports.cast = function (data) {
return new this(data);
};
exports.pending = function () {
return !this.id;
};
exports.NotFoundError = createError('NotFoundError');
exports.isUnknownRecord = function (err) {
return err.type === 'unknown_record';
};
......@@ -52,6 +52,18 @@ describe('Company', function () {
});
});
it('can handle unknown records', function () {
mock
.get('/v1/companies/domain/nonexistent.co')
.reply(404, {
error: {
type: 'unknown_record'
}
});
return expect(Company.find({domain: 'nonexistent.co'}))
.to.be.rejectedWith(Company.NotFoundError);
});
});
});
'use strict';
var expect = require('chai').expect;
var expect = require('chai').use(require('chai-as-promised')).expect;
var nock = require('nock');
var Person = require('../')('k').Person;
......@@ -66,6 +66,18 @@ describe('Person', function () {
});
});
it('can handle unknown records', function () {
mock
.get('/v1/people/email/bademail@unknown.com')
.reply(404, {
error: {
type: 'unknown_record'
}
});
return expect(Person.find({email: 'bademail@unknown.com'}))
.to.be.rejectedWith(Person.NotFoundError);
});
});
});
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