UNPKG

@e22m4u/js-repository

Version:

Реализация репозитория для работы с базами данных в Node.js

135 lines (117 loc) 4.71 kB
import {expect} from 'chai'; import {chai} from '../../chai.js'; import {Adapter} from '../adapter.js'; import {DatabaseSchema} from '../../database-schema.js'; import {IncludeClauseTool} from '../../filter/index.js'; const dbs = new DatabaseSchema(); dbs.defineModel({name: 'model'}); const FILTER = {include: 'parent'}; const MODEL_DATA = { foo: 'fooVal', bar: 'barVal', }; const RETVAL_DATA = { foo: MODEL_DATA.foo, bar: MODEL_DATA.bar, baz: 'bazVal', }; class TestAdapter extends Adapter { // eslint-disable-next-line no-unused-vars async create(modelName, modelData, filter = undefined) { return Object.assign({}, MODEL_DATA); } // eslint-disable-next-line no-unused-vars async replaceById(modelName, id, modelData, filter = undefined) { return Object.assign({}, MODEL_DATA); } // eslint-disable-next-line no-unused-vars async replaceOrCreate(modelName, modelData, filter = undefined) { return Object.assign({}, MODEL_DATA); } // eslint-disable-next-line no-unused-vars async patchById(modelName, id, modelData, filter = undefined) { return Object.assign({}, MODEL_DATA); } // eslint-disable-next-line no-unused-vars async find(modelName, filter = undefined) { return [Object.assign({}, MODEL_DATA)]; } // eslint-disable-next-line no-unused-vars async findById(modelName, id, filter = undefined) { return Object.assign({}, MODEL_DATA); } } const A = dbs.getService(TestAdapter); const T = dbs.getService(IncludeClauseTool); const sandbox = chai.spy.sandbox(); describe('InclusionDecorator', function () { afterEach(function () { sandbox.restore(); }); it('overrides the "create" method method and applies clause inclusion', async function () { sandbox.on(T, 'includeTo', function (entities, modelName, clause) { expect(entities).to.be.eql([MODEL_DATA]); expect(modelName).to.be.eql('model'); expect(clause).to.be.eql(FILTER.include); Object.assign(entities[0], RETVAL_DATA); }); const retval = await A.create('model', {}, FILTER); expect(retval).to.be.eql(RETVAL_DATA); expect(T.includeTo).to.be.called.once; }); it('overrides the "replaceById" method and applies clause inclusion', async function () { sandbox.on(T, 'includeTo', function (entities, modelName, clause) { expect(entities).to.be.eql([MODEL_DATA]); expect(modelName).to.be.eql('model'); expect(clause).to.be.eql(FILTER.include); Object.assign(entities[0], RETVAL_DATA); }); const retval = await A.replaceById('model', 1, {}, FILTER); expect(retval).to.be.eql(RETVAL_DATA); expect(T.includeTo).to.be.called.once; }); it('overrides the "replaceOrCreate" method and applies clause inclusion', async function () { sandbox.on(T, 'includeTo', function (entities, modelName, clause) { expect(entities).to.be.eql([MODEL_DATA]); expect(modelName).to.be.eql('model'); expect(clause).to.be.eql(FILTER.include); Object.assign(entities[0], RETVAL_DATA); }); const retval = await A.replaceOrCreate('model', {}, FILTER); expect(retval).to.be.eql(RETVAL_DATA); expect(T.includeTo).to.be.called.once; }); it('overrides the "patchById" method and applies clause inclusion', async function () { sandbox.on(T, 'includeTo', function (entities, modelName, clause) { expect(entities).to.be.eql([MODEL_DATA]); expect(modelName).to.be.eql('model'); expect(clause).to.be.eql(FILTER.include); Object.assign(entities[0], RETVAL_DATA); }); const retval = await A.patchById('model', 1, {}, FILTER); expect(retval).to.be.eql(RETVAL_DATA); expect(T.includeTo).to.be.called.once; }); it('overrides the "find" method and applies clause inclusion', async function () { sandbox.on(T, 'includeTo', function (entities, modelName, clause) { expect(entities).to.be.eql([MODEL_DATA]); expect(modelName).to.be.eql('model'); expect(clause).to.be.eql(FILTER.include); Object.assign(entities[0], RETVAL_DATA); }); const retval = await A.find('model', FILTER); expect(retval).to.be.eql([RETVAL_DATA]); expect(T.includeTo).to.be.called.once; }); it('overrides the "findById" method and applies clause inclusion', async function () { sandbox.on(T, 'includeTo', function (entities, modelName, clause) { expect(entities).to.be.eql([MODEL_DATA]); expect(modelName).to.be.eql('model'); expect(clause).to.be.eql(FILTER.include); Object.assign(entities[0], RETVAL_DATA); }); const retval = await A.findById('model', 1, FILTER); expect(retval).to.be.eql(RETVAL_DATA); expect(T.includeTo).to.be.called.once; }); });