feathers-service-tests
Version:
A standardized testing harness for Feathers services
775 lines (670 loc) • 26.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _chai = require('chai');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /* eslint-disable no-unused-expressions */
function common(app, errors) {
var serviceName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'people';
var idProp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'id';
describe('Common tests, ' + serviceName + ' service with' + (' \'' + idProp + '\' id property'), function () {
var _ids = {};
beforeEach(function () {
return app.service(serviceName).create({
name: 'Doug',
age: 32
}).then(function (data) {
return _ids.Doug = data[idProp];
});
});
afterEach(function () {
return app.service(serviceName).remove(_ids.Doug).catch(function () {});
});
it('sets `id` property on the service', function () {
return (0, _chai.expect)(app.service(serviceName).id).to.equal(idProp);
});
it('sets `events` property from options', function () {
return (0, _chai.expect)(app.service(serviceName).events.indexOf('testing')).to.not.equal(-1);
});
describe('extend', function () {
it('extends and uses extended method', function () {
var now = new Date().getTime();
var extended = app.service(serviceName).extend({
create: function create(data) {
data.time = now;
return this._super.apply(this, arguments);
}
});
return extended.create({ name: 'Dave' }).then(function (data) {
return extended.remove(data[idProp]);
}).then(function (data) {
return (0, _chai.expect)(data.time).to.equal(now);
});
});
});
describe('get', function () {
it('returns an instance that exists', function () {
return app.service(serviceName).get(_ids.Doug).then(function (data) {
(0, _chai.expect)(data[idProp].toString()).to.equal(_ids.Doug.toString());
(0, _chai.expect)(data.name).to.equal('Doug');
(0, _chai.expect)(data.age).to.equal(32);
});
});
it('supports $select', function () {
return app.service(serviceName).get(_ids.Doug, {
query: { $select: ['name'] }
}).then(function (data) {
(0, _chai.expect)(data[idProp].toString()).to.equal(_ids.Doug.toString());
(0, _chai.expect)(data.name).to.equal('Doug');
(0, _chai.expect)(data.age).to.not.exist;
});
});
it('returns NotFound error for non-existing id', function () {
return app.service(serviceName).get('568225fbfe21222432e836ff').catch(function (error) {
(0, _chai.expect)(error instanceof errors.NotFound).to.be.ok;
(0, _chai.expect)(error.message).to.equal('No record found for id \'568225fbfe21222432e836ff\'');
});
});
});
describe('remove', function () {
it('deletes an existing instance and returns the deleted instance', function () {
return app.service(serviceName).remove(_ids.Doug).then(function (data) {
(0, _chai.expect)(data).to.be.ok;
(0, _chai.expect)(data.name).to.equal('Doug');
});
});
it('deletes an existing instance supports $select', function () {
return app.service(serviceName).remove(_ids.Doug, {
query: { $select: ['name'] }
}).then(function (data) {
(0, _chai.expect)(data).to.be.ok;
(0, _chai.expect)(data.name).to.equal('Doug');
(0, _chai.expect)(data.age).to.not.exist;
});
});
it('deletes multiple instances', function () {
return app.service(serviceName).create({ name: 'Dave', age: 29, created: true }).then(function () {
return app.service(serviceName).create({
name: 'David',
age: 3,
created: true
});
}).then(function () {
return app.service(serviceName).remove(null, {
query: { created: true }
});
}).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
var names = data.map(function (person) {
return person.name;
});
(0, _chai.expect)(names.indexOf('Dave')).to.be.above(-1);
(0, _chai.expect)(names.indexOf('David')).to.be.above(-1);
});
});
});
describe('find', function () {
beforeEach(function () {
return app.service(serviceName).create({
name: 'Bob',
age: 25
}).then(function (bob) {
_ids.Bob = bob[idProp].toString();
return app.service(serviceName).create({
name: 'Alice',
age: 19
});
}).then(function (alice) {
return _ids.Alice = alice[idProp].toString();
});
});
afterEach(function () {
return app.service(serviceName).remove(_ids.Bob).then(function () {
return app.service(serviceName).remove(_ids.Alice);
});
});
it('returns all items', function () {
return app.service(serviceName).find().then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(3);
});
});
it('filters results by a single parameter', function () {
var params = { query: { name: 'Alice' } };
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(1);
(0, _chai.expect)(data[0].name).to.equal('Alice');
});
});
it('filters results by multiple parameters', function () {
var params = { query: { name: 'Alice', age: 19 } };
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(1);
(0, _chai.expect)(data[0].name).to.equal('Alice');
});
});
describe('special filters', function () {
it('can $sort', function () {
var params = {
query: {
$sort: { name: 1 }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data.length).to.equal(3);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[1].name).to.equal('Bob');
(0, _chai.expect)(data[2].name).to.equal('Doug');
});
});
it('can $sort with strings', function () {
var params = {
query: {
$sort: { name: '1' }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data.length).to.equal(3);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[1].name).to.equal('Bob');
(0, _chai.expect)(data[2].name).to.equal('Doug');
});
});
it('can $limit', function () {
var params = {
query: {
$limit: 2
}
};
return app.service(serviceName).find(params).then(function (data) {
return (0, _chai.expect)(data.length).to.equal(2);
});
});
it('can $limit 0', function () {
var params = {
query: {
$limit: 0
}
};
return app.service(serviceName).find(params).then(function (data) {
return (0, _chai.expect)(data.length).to.equal(0);
});
});
it('can $skip', function () {
var params = {
query: {
$sort: { name: 1 },
$skip: 1
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].name).to.equal('Bob');
(0, _chai.expect)(data[1].name).to.equal('Doug');
});
});
it('can $select', function () {
var params = {
query: {
name: 'Alice',
$select: ['name']
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data.length).to.equal(1);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[0].age).to.be.undefined;
});
});
it('can $or', function () {
var params = {
query: {
$or: [{ name: 'Alice' }, { name: 'Bob' }],
$sort: { name: 1 }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[1].name).to.equal('Bob');
});
});
it.skip('can $not', function () {
var params = {
query: {
age: { $not: 19 },
name: { $not: 'Doug' }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(1);
(0, _chai.expect)(data[0].name).to.equal('Bob');
});
});
it('can $in', function () {
var params = {
query: {
name: {
$in: ['Alice', 'Bob']
},
$sort: { name: 1 }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[1].name).to.equal('Bob');
});
});
it('can $nin', function () {
var params = {
query: {
name: {
$nin: ['Alice', 'Bob']
}
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(1);
(0, _chai.expect)(data[0].name).to.equal('Doug');
});
});
it('can $lt', function () {
var params = {
query: {
age: {
$lt: 30
}
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(2);
});
});
it('can $lte', function () {
var params = {
query: {
age: {
$lte: 25
}
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(2);
});
});
it('can $gt', function () {
var params = {
query: {
age: {
$gt: 30
}
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(1);
});
});
it('can $gte', function () {
var params = {
query: {
age: {
$gte: 25
}
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(2);
});
});
it('can $ne', function () {
var params = {
query: {
age: {
$ne: 25
}
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data).to.be.instanceof(Array);
(0, _chai.expect)(data.length).to.equal(2);
});
});
});
it('can $gt and $lt and $sort', function () {
var params = {
query: {
age: {
$gt: 18,
$lt: 30
},
$sort: { name: 1 }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[1].name).to.equal('Bob');
});
});
it('can handle nested $or queries and $sort', function () {
var params = {
query: {
$or: [{ name: 'Doug' }, {
age: {
$gte: 18,
$lt: 25
}
}],
$sort: { name: 1 }
}
};
return app.service(serviceName).find(params).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].name).to.equal('Alice');
(0, _chai.expect)(data[1].name).to.equal('Doug');
});
});
describe('paginate', function () {
beforeEach(function () {
return app.service(serviceName).paginate = { default: 1, max: 2 };
});
afterEach(function () {
return app.service(serviceName).paginate = {};
});
it('returns paginated object, paginates by default and shows total', function () {
return app.service(serviceName).find({ query: { $sort: { name: -1 } } }).then(function (paginator) {
(0, _chai.expect)(paginator.total).to.equal(3);
(0, _chai.expect)(paginator.limit).to.equal(1);
(0, _chai.expect)(paginator.skip).to.equal(0);
(0, _chai.expect)(paginator.data[0].name).to.equal('Doug');
});
});
it('paginates max and skips', function () {
var params = {
query: {
$skip: 1,
$limit: 4,
$sort: { name: -1 }
}
};
return app.service(serviceName).find(params).then(function (paginator) {
(0, _chai.expect)(paginator.total).to.equal(3);
(0, _chai.expect)(paginator.limit).to.equal(2);
(0, _chai.expect)(paginator.skip).to.equal(1);
(0, _chai.expect)(paginator.data[0].name).to.equal('Bob');
(0, _chai.expect)(paginator.data[1].name).to.equal('Alice');
});
});
it('$limit 0 with pagination', function () {
return app.service(serviceName).find({ query: { $limit: 0 } }).then(function (paginator) {
return (0, _chai.expect)(paginator.data.length).to.equal(0);
});
});
it('allows to override paginate in params', function () {
return app.service(serviceName).find({ paginate: { default: 2 } }).then(function (paginator) {
(0, _chai.expect)(paginator.limit).to.equal(2);
(0, _chai.expect)(paginator.skip).to.equal(0);
return app.service(serviceName).find({ paginate: false }).then(function (results) {
return (0, _chai.expect)(results.length).to.equal(3);
});
});
});
});
});
describe('update', function () {
it('replaces an existing instance, does not modify original data', function () {
var _originalData;
var originalData = (_originalData = {}, _defineProperty(_originalData, idProp, _ids.Doug), _defineProperty(_originalData, 'name', 'Dougler'), _originalData);
var originalCopy = Object.assign({}, originalData);
return app.service(serviceName).update(_ids.Doug, originalData).then(function (data) {
(0, _chai.expect)(originalData).to.deep.equal(originalCopy);
(0, _chai.expect)(data[idProp].toString()).to.equal(_ids.Doug.toString());
(0, _chai.expect)(data.name).to.equal('Dougler');
(0, _chai.expect)(!data.age).to.be.ok;
});
});
it('replaces an existing instance, supports $select', function () {
var _originalData2;
var originalData = (_originalData2 = {}, _defineProperty(_originalData2, idProp, _ids.Doug), _defineProperty(_originalData2, 'name', 'Dougler'), _defineProperty(_originalData2, 'age', 10), _originalData2);
return app.service(serviceName).update(_ids.Doug, originalData, {
query: { $select: ['name'] }
}).then(function (data) {
(0, _chai.expect)(data.name).to.equal('Dougler');
(0, _chai.expect)(data.age).to.not.exist;
});
});
it('returns NotFound error for non-existing id', function () {
return app.service(serviceName).update('568225fbfe21222432e836ff', { name: 'NotFound' }).catch(function (error) {
(0, _chai.expect)(error).to.be.ok;
(0, _chai.expect)(error instanceof errors.NotFound).to.be.ok;
(0, _chai.expect)(error.message).to.equal('No record found for id \'568225fbfe21222432e836ff\'');
});
});
});
describe('patch', function () {
it('updates an existing instance, does not modify original data', function () {
var _originalData3;
var originalData = (_originalData3 = {}, _defineProperty(_originalData3, idProp, _ids.Doug), _defineProperty(_originalData3, 'name', 'PatchDoug'), _originalData3);
var originalCopy = Object.assign({}, originalData);
return app.service(serviceName).patch(_ids.Doug, originalData).then(function (data) {
(0, _chai.expect)(originalData).to.deep.equal(originalCopy);
(0, _chai.expect)(data[idProp].toString()).to.equal(_ids.Doug.toString());
(0, _chai.expect)(data.name).to.equal('PatchDoug');
(0, _chai.expect)(data.age).to.equal(32);
});
});
it('updates an existing instance, supports $select', function () {
var _originalData4;
var originalData = (_originalData4 = {}, _defineProperty(_originalData4, idProp, _ids.Doug), _defineProperty(_originalData4, 'name', 'PatchDoug'), _originalData4);
return app.service(serviceName).patch(_ids.Doug, originalData, {
query: { $select: ['name'] }
}).then(function (data) {
(0, _chai.expect)(data.name).to.equal('PatchDoug');
(0, _chai.expect)(data.age).to.not.exist;
});
});
it('patches multiple instances', function () {
var service = app.service(serviceName);
var params = {
query: { created: true }
};
return service.create({
name: 'Dave',
age: 29,
created: true
}).then(function () {
return service.create({
name: 'David',
age: 3,
created: true
});
}).then(function () {
return service.patch(null, {
age: 2
}, params);
}).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].age).to.equal(2);
(0, _chai.expect)(data[1].age).to.equal(2);
}).then(function () {
return service.remove(null, params);
});
});
it('patches multiple instances and returns the actually changed items', function () {
var service = app.service(serviceName);
var params = {
query: { age: { $lt: 10 } }
};
return service.create({
name: 'Dave',
age: 8,
created: true
}).then(function () {
return service.create({
name: 'David',
age: 4,
created: true
});
}).then(function () {
return service.patch(null, {
age: 2
}, params);
}).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].age).to.equal(2);
(0, _chai.expect)(data[1].age).to.equal(2);
}).then(function () {
return service.remove(null, params);
});
});
it('patches multiple, returns correct items', function () {
var service = app.service(serviceName);
return service.create([{
name: 'Dave',
age: 2,
created: true
}, {
name: 'David',
age: 2,
created: true
}, {
name: 'D',
age: 8,
created: true
}]).then(function () {
return service.patch(null, {
age: 8
}, { query: { age: 2 } });
}).then(function (data) {
(0, _chai.expect)(data.length).to.equal(2);
(0, _chai.expect)(data[0].age).to.equal(8);
(0, _chai.expect)(data[1].age).to.equal(8);
}).then(function () {
return service.remove(null, {
query: { age: 8 }
});
});
});
it('returns NotFound error for non-existing id', function () {
return app.service(serviceName).patch('568225fbfe21222432e836ff', { name: 'PatchDoug' }).then(function () {
throw new Error('Should never get here');
}).catch(function (error) {
(0, _chai.expect)(error).to.be.ok;
(0, _chai.expect)(error instanceof errors.NotFound).to.be.ok;
(0, _chai.expect)(error.message).to.equal('No record found for id \'568225fbfe21222432e836ff\'');
});
});
});
describe('create', function () {
it('creates a single new instance and returns the created instance', function () {
var originalData = {
name: 'Bill',
age: 40
};
var originalCopy = Object.assign({}, originalData);
return app.service(serviceName).create(originalData).then(function (data) {
(0, _chai.expect)(originalData).to.deep.equal(originalCopy);
(0, _chai.expect)(data).to.be.instanceof(Object);
(0, _chai.expect)(data).to.not.be.empty;
(0, _chai.expect)(data.name).to.equal('Bill');
});
});
it('creates a single new instance, supports $select', function () {
var originalData = {
name: 'William',
age: 23
};
return app.service(serviceName).create(originalData, {
query: { $select: ['name'] }
}).then(function (data) {
(0, _chai.expect)(data.name).to.equal('William');
(0, _chai.expect)(data.age).to.not.exist;
});
});
it('creates multiple new instances', function () {
var items = [{
name: 'Gerald',
age: 18
}, {
name: 'Herald',
age: 18
}];
return app.service(serviceName).create(items).then(function (data) {
(0, _chai.expect)(data).to.not.be.empty;
(0, _chai.expect)(Array.isArray(data)).to.equal(true);
(0, _chai.expect)(_typeof(data[0][idProp])).to.not.equal('undefined');
(0, _chai.expect)(data[0].name).to.equal('Gerald');
(0, _chai.expect)(_typeof(data[1][idProp])).to.not.equal('undefined');
(0, _chai.expect)(data[1].name).to.equal('Herald');
});
});
});
describe('Services don\'t call public methods internally', function () {
var throwing = void 0;
before(function () {
throwing = app.service(serviceName).extend({
get store() {
return app.service(serviceName).store;
},
find: function find() {
throw new Error('find method called');
},
get: function get() {
throw new Error('get method called');
},
create: function create() {
throw new Error('create method called');
},
update: function update() {
throw new Error('update method called');
},
patch: function patch() {
throw new Error('patch method called');
},
remove: function remove() {
throw new Error('remove method called');
}
});
});
it('find', function () {
return app.service(serviceName).find.call(throwing);
});
it('get', function () {
return app.service(serviceName).get.call(throwing, _ids.Doug);
});
it('create', function () {
return app.service(serviceName).create.call(throwing, {
name: 'Bob',
age: 25
});
});
it('update', function () {
return app.service(serviceName).update.call(throwing, _ids.Doug, {
name: 'Dougler'
});
});
it('patch', function () {
return app.service(serviceName).patch.call(throwing, _ids.Doug, {
name: 'PatchDoug'
});
});
it('remove', function () {
return app.service(serviceName).remove.call(throwing, _ids.Doug);
});
});
});
}
exports.default = common;
module.exports = exports['default'];