UNPKG

@feathersjs/adapter-tests

Version:

Feathers shared database adapter test suite

631 lines 29.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const assert_1 = __importDefault(require("assert")); exports.default = (test, app, _errors, serviceName, idProp) => { describe(' Methods', () => { let doug; let service; beforeEach(async () => { service = app.service(serviceName); doug = await app.service(serviceName).create({ name: 'Doug', age: 32 }); }); afterEach(async () => { try { await app.service(serviceName).remove(doug[idProp]); } catch (error) { } }); describe('get', () => { test('.get', async () => { const data = await service.get(doug[idProp]); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`); assert_1.default.strictEqual(data.name, 'Doug', 'data.name matches'); assert_1.default.strictEqual(data.age, 32, 'data.age matches'); }); test('.get + $select', async () => { const data = await service.get(doug[idProp], { query: { $select: ['name'] } }); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`); assert_1.default.strictEqual(data.name, 'Doug', 'data.name matches'); assert_1.default.ok(!data.age, 'data.age is falsy'); }); test('.get + id + query', async () => { try { await service.get(doug[idProp], { query: { name: 'Tester' } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } }); test('.get + NotFound', async () => { try { await service.get('568225fbfe21222432e836ff'); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.get + NotFound (integer)', async () => { try { await service.get(123456789); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.get + id + query id', async () => { const alice = await service.create({ name: 'Alice', age: 12 }); try { await service.get(doug[idProp], { query: { [idProp]: alice[idProp] } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } await service.remove(alice[idProp]); }); }); describe('find', () => { test('.find', async () => { const data = await service.find(); assert_1.default.ok(Array.isArray(data), 'Data is an array'); assert_1.default.strictEqual(data.length, 1, 'Got one entry'); }); }); describe('remove', () => { test('.remove', async () => { const data = await service.remove(doug[idProp]); assert_1.default.strictEqual(data.name, 'Doug', 'data.name matches'); }); test('.remove + $select', async () => { const data = await service.remove(doug[idProp], { query: { $select: ['name'] } }); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`); assert_1.default.strictEqual(data.name, 'Doug', 'data.name matches'); assert_1.default.ok(!data.age, 'data.age is falsy'); }); test('.remove + id + query', async () => { try { await service.remove(doug[idProp], { query: { name: 'Tester' } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } }); test('.remove + NotFound', async () => { try { await service.remove('568225fbfe21222432e836ff'); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.remove + NotFound (integer)', async () => { try { await service.remove(123456789); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.remove + multi', async () => { try { await service.remove(null); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'MethodNotAllowed', 'Removing multiple without option set throws MethodNotAllowed'); } service.options.multi = ['remove']; await service.create({ name: 'Dave', age: 29, created: true }); await service.create({ name: 'David', age: 3, created: true }); const data = await service.remove(null, { query: { created: true } }); assert_1.default.strictEqual(data.length, 2); const names = data.map((person) => person.name); assert_1.default.ok(names.includes('Dave'), 'Dave removed'); assert_1.default.ok(names.includes('David'), 'David removed'); }); test('.remove + multi no pagination', async () => { try { await service.remove(doug[idProp]); } catch (error) { } const count = 14; const defaultPaginate = 10; assert_1.default.ok(count > defaultPaginate, 'count is bigger than default pagination'); const multiBefore = service.options.multi; const paginateBefore = service.options.paginate; try { service.options.multi = true; service.options.paginate = { default: defaultPaginate, max: 100 }; const emptyItems = await service.find({ paginate: false }); assert_1.default.strictEqual(emptyItems.length, 0, 'no items before'); const createdItems = await service.create(Array.from(Array(count)).map((_, i) => ({ name: `name-${i}`, age: 3, created: true }))); assert_1.default.strictEqual(createdItems.length, count, `created ${count} items`); const foundItems = await service.find({ paginate: false }); assert_1.default.strictEqual(foundItems.length, count, `created ${count} items`); const foundPaginatedItems = await service.find({}); assert_1.default.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated items'); const allItems = await service.remove(null, { query: { created: true } }); assert_1.default.strictEqual(allItems.length, count, `removed all ${count} items`); } finally { await service.remove(null, { query: { created: true }, paginate: false }); service.options.multi = multiBefore; service.options.paginate = paginateBefore; } }); test('.remove + id + query id', async () => { const alice = await service.create({ name: 'Alice', age: 12 }); try { await service.remove(doug[idProp], { query: { [idProp]: alice[idProp] } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } await service.remove(alice[idProp]); }); }); describe('update', () => { test('.update', async () => { const originalData = { [idProp]: doug[idProp], name: 'Dougler' }; const originalCopy = Object.assign({}, originalData); const data = await service.update(doug[idProp], originalData); assert_1.default.deepStrictEqual(originalData, originalCopy, 'data was not modified'); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`); assert_1.default.strictEqual(data.name, 'Dougler', 'data.name matches'); assert_1.default.ok(!data.age, 'data.age is falsy'); }); test('.update + $select', async () => { const originalData = { [idProp]: doug[idProp], name: 'Dougler', age: 10 }; const data = await service.update(doug[idProp], originalData, { query: { $select: ['name'] } }); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`); assert_1.default.strictEqual(data.name, 'Dougler', 'data.name matches'); assert_1.default.ok(!data.age, 'data.age is falsy'); }); test('.update + id + query', async () => { try { await service.update(doug[idProp], { name: 'Dougler' }, { query: { name: 'Tester' } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } const updatedDoug = await service.get(doug[idProp]); assert_1.default.strictEqual(updatedDoug.name, 'Doug', 'Doug was not updated'); }); test('.update + NotFound', async () => { try { await service.update('568225fbfe21222432e836ff', { name: 'NotFound' }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.update + NotFound (integer)', async () => { try { await service.update(123456789, { name: 'NotFound' }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.update + query + NotFound', async () => { const dave = await service.create({ name: 'Dave' }); try { await service.update(dave[idProp], { name: 'UpdatedDave' }, { query: { name: 'NotDave' } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } await service.remove(dave[idProp]); }); test('.update + id + query id', async () => { const alice = await service.create({ name: 'Alice', age: 12 }); try { await service.update(doug[idProp], { name: 'Dougler', age: 33 }, { query: { [idProp]: alice[idProp] } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } await service.remove(alice[idProp]); }); }); describe('patch', () => { test('.patch', async () => { const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' }; const originalCopy = Object.assign({}, originalData); const data = await service.patch(doug[idProp], originalData); assert_1.default.deepStrictEqual(originalData, originalCopy, 'original data was not modified'); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`); assert_1.default.strictEqual(data.name, 'PatchDoug', 'data.name matches'); assert_1.default.strictEqual(data.age, 32, 'data.age matches'); }); test('.patch + $select', async () => { const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' }; const data = await service.patch(doug[idProp], originalData, { query: { $select: ['name'] } }); assert_1.default.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`); assert_1.default.strictEqual(data.name, 'PatchDoug', 'data.name matches'); assert_1.default.ok(!data.age, 'data.age is falsy'); }); test('.patch + id + query', async () => { try { await service.patch(doug[idProp], { name: 'id patched doug' }, { query: { name: 'Tester' } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } }); test('.patch multiple', async () => { try { await service.patch(null, {}); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'MethodNotAllowed', 'Removing multiple without option set throws MethodNotAllowed'); } const params = { query: { created: true } }; const dave = await service.create({ name: 'Dave', age: 29, created: true }); const david = await service.create({ name: 'David', age: 3, created: true }); service.options.multi = ['patch']; const data = await service.patch(null, { age: 2 }, params); assert_1.default.strictEqual(data.length, 2, 'returned two entries'); assert_1.default.strictEqual(data[0].age, 2, 'First entry age was updated'); assert_1.default.strictEqual(data[1].age, 2, 'Second entry age was updated'); await service.remove(dave[idProp]); await service.remove(david[idProp]); }); test('.patch multiple no pagination', async () => { try { await service.remove(doug[idProp]); } catch (error) { } const count = 14; const defaultPaginate = 10; assert_1.default.ok(count > defaultPaginate, 'count is bigger than default pagination'); const multiBefore = service.options.multi; const paginateBefore = service.options.paginate; let ids; try { service.options.multi = true; service.options.paginate = { default: defaultPaginate, max: 100 }; const emptyItems = await service.find({ paginate: false }); assert_1.default.strictEqual(emptyItems.length, 0, 'no items before'); const createdItems = await service.create(Array.from(Array(count)).map((_, i) => ({ name: `name-${i}`, age: 3, created: true }))); assert_1.default.strictEqual(createdItems.length, count, `created ${count} items`); ids = createdItems.map((item) => item[idProp]); const foundItems = await service.find({ paginate: false }); assert_1.default.strictEqual(foundItems.length, count, `created ${count} items`); const foundPaginatedItems = await service.find({}); assert_1.default.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated data'); const allItems = await service.patch(null, { age: 4 }, { query: { created: true } }); assert_1.default.strictEqual(allItems.length, count, `patched all ${count} items`); } finally { service.options.multi = multiBefore; service.options.paginate = paginateBefore; if (ids) { await Promise.all(ids.map((id) => service.remove(id))); } } }); test('.patch multi query same', async () => { const service = app.service(serviceName); const multiBefore = service.options.multi; service.options.multi = true; const params = { query: { age: { $lt: 10 } } }; const dave = await service.create({ name: 'Dave', age: 8, created: true }); const david = await service.create({ name: 'David', age: 4, created: true }); const data = await service.patch(null, { age: 2 }, params); assert_1.default.strictEqual(data.length, 2, 'returned two entries'); assert_1.default.strictEqual(data[0].age, 2, 'First entry age was updated'); assert_1.default.strictEqual(data[1].age, 2, 'Second entry age was updated'); await service.remove(dave[idProp]); await service.remove(david[idProp]); service.options.multi = multiBefore; }); test('.patch multi query changed', async () => { const service = app.service(serviceName); const multiBefore = service.options.multi; service.options.multi = true; const params = { query: { age: 10 } }; const dave = await service.create({ name: 'Dave', age: 10, created: true }); const david = await service.create({ name: 'David', age: 10, created: true }); const data = await service.patch(null, { age: 2 }, params); assert_1.default.strictEqual(data.length, 2, 'returned two entries'); assert_1.default.strictEqual(data[0].age, 2, 'First entry age was updated'); assert_1.default.strictEqual(data[1].age, 2, 'Second entry age was updated'); await service.remove(dave[idProp]); await service.remove(david[idProp]); service.options.multi = multiBefore; }); test('.patch + NotFound', async () => { try { await service.patch('568225fbfe21222432e836ff', { name: 'PatchDoug' }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.patch + NotFound (integer)', async () => { try { await service.patch(123456789, { name: 'PatchDoug' }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } }); test('.patch + query + NotFound', async () => { const dave = await service.create({ name: 'Dave' }); try { await service.patch(dave[idProp], { name: 'PatchedDave' }, { query: { name: 'NotDave' } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error'); } await service.remove(dave[idProp]); }); test('.patch + id + query id', async () => { const alice = await service.create({ name: 'Alice', age: 12 }); try { await service.patch(doug[idProp], { age: 33 }, { query: { [idProp]: alice[idProp] } }); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error'); } await service.remove(alice[idProp]); }); }); describe('create', () => { test('.create', async () => { const originalData = { name: 'Bill', age: 40 }; const originalCopy = Object.assign({}, originalData); const data = await service.create(originalData); assert_1.default.deepStrictEqual(originalData, originalCopy, 'original data was not modified'); assert_1.default.ok(data instanceof Object, 'data is an object'); assert_1.default.strictEqual(data.name, 'Bill', 'data.name matches'); await service.remove(data[idProp]); }); test('.create ignores query', async () => { const originalData = { name: 'Billy', age: 42 }; const data = await service.create(originalData, { query: { name: 'Dave' } }); assert_1.default.strictEqual(data.name, 'Billy', 'data.name matches'); await service.remove(data[idProp]); }); test('.create + $select', async () => { const originalData = { name: 'William', age: 23 }; const data = await service.create(originalData, { query: { $select: ['name'] } }); assert_1.default.ok(idProp in data, 'data has id'); assert_1.default.strictEqual(data.name, 'William', 'data.name matches'); assert_1.default.ok(!data.age, 'data.age is falsy'); await service.remove(data[idProp]); }); test('.create multi', async () => { try { await service.create([], {}); throw new Error('Should never get here'); } catch (error) { assert_1.default.strictEqual(error.name, 'MethodNotAllowed', 'Removing multiple without option set throws MethodNotAllowed'); } const items = [ { name: 'Gerald', age: 18 }, { name: 'Herald', age: 18 } ]; service.options.multi = ['create', 'patch']; const data = await service.create(items); assert_1.default.ok(Array.isArray(data), 'data is an array'); assert_1.default.ok(typeof data[0][idProp] !== 'undefined', 'id is set'); assert_1.default.strictEqual(data[0].name, 'Gerald', 'first name matches'); assert_1.default.ok(typeof data[1][idProp] !== 'undefined', 'id is set'); assert_1.default.strictEqual(data[1].name, 'Herald', 'second name macthes'); await service.remove(data[0][idProp]); await service.remove(data[1][idProp]); }); }); describe("doesn't call public methods internally", () => { let throwing; before(() => { throwing = Object.assign(Object.create(app.service(serviceName)), { get store() { return app.service(serviceName).store; }, find() { throw new Error('find method called'); }, get() { throw new Error('get method called'); }, create() { throw new Error('create method called'); }, update() { throw new Error('update method called'); }, patch() { throw new Error('patch method called'); }, remove() { throw new Error('remove method called'); } }); }); test('internal .find', () => app.service(serviceName).find.call(throwing)); test('internal .get', () => service.get.call(throwing, doug[idProp])); test('internal .create', async () => { const bob = await service.create.call(throwing, { name: 'Bob', age: 25 }); await service.remove(bob[idProp]); }); test('internal .update', () => service.update.call(throwing, doug[idProp], { name: 'Dougler' })); test('internal .patch', () => service.patch.call(throwing, doug[idProp], { name: 'PatchDoug' })); test('internal .remove', () => service.remove.call(throwing, doug[idProp])); }); }); }; //# sourceMappingURL=methods.js.map