UNPKG

feathers-service-tests

Version:

A standardized testing harness for Feathers services

775 lines (670 loc) 26.1 kB
'use strict'; 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'];