@e22m4u/js-repository
Version:
Реализация репозитория для работы с базами данных в Node.js
180 lines (161 loc) • 6.04 kB
JavaScript
import {expect} from 'chai';
import {chai} from '../../chai.js';
import {Adapter} from '../adapter.js';
import {DataType} from '../../definition/index.js';
import {DatabaseSchema} from '../../database-schema.js';
import {ModelDefinitionUtils} from '../../definition/index.js';
const dbs = new DatabaseSchema();
dbs.defineModel({
name: 'model',
properties: {
prop: {
type: DataType.STRING,
default: 'value',
},
},
});
const INPUT_DATA = {};
const INPUT_DATA_WITH_DEFAULTS = {prop: 'value'};
class TestAdapter extends Adapter {
// eslint-disable-next-line no-unused-vars
async create(modelName, modelData, filter = undefined) {
return modelData;
}
// eslint-disable-next-line no-unused-vars
async replaceById(modelName, id, modelData, filter = undefined) {
return modelData;
}
// eslint-disable-next-line no-unused-vars
async replaceOrCreate(modelName, modelData, filter = undefined) {
return modelData;
}
// eslint-disable-next-line no-unused-vars
patch(modelName, modelData, where = undefined) {
return Promise.resolve(modelData);
}
// eslint-disable-next-line no-unused-vars
async patchById(modelName, id, modelData, filter = undefined) {
return modelData;
}
// eslint-disable-next-line no-unused-vars
async find(modelName, filter = undefined) {
return [INPUT_DATA];
}
// eslint-disable-next-line no-unused-vars
async findById(modelName, id, filter = undefined) {
return INPUT_DATA;
}
}
const A = dbs.getService(TestAdapter);
const U = dbs.getService(ModelDefinitionUtils);
const sandbox = chai.spy.sandbox();
describe('DefaultValuesDecorator', function () {
afterEach(function () {
sandbox.restore();
});
it('overrides the "create" method method and sets default values to input data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.false;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.create('model', INPUT_DATA);
expect(res).to.be.eql(INPUT_DATA_WITH_DEFAULTS);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
it('overrides the "replaceById" method and sets default values to input data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.false;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.replaceById('model', 1, INPUT_DATA);
expect(res).to.be.eql(INPUT_DATA_WITH_DEFAULTS);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
it('overrides the "replaceOrCreate" method and sets default values to input data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.false;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.replaceOrCreate('model', INPUT_DATA);
expect(res).to.be.eql(INPUT_DATA_WITH_DEFAULTS);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
it('overrides the "patch" method and sets default values to input data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.true;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.patch('model', INPUT_DATA);
expect(res).to.be.eql(INPUT_DATA_WITH_DEFAULTS);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
it('overrides the "patchById" method and sets default values to input data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.true;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.patchById('model', 1, INPUT_DATA);
expect(res).to.be.eql(INPUT_DATA_WITH_DEFAULTS);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
it('overrides the "find" method and sets default values to output data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.false;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.find('model');
expect(res).to.be.eql([INPUT_DATA_WITH_DEFAULTS]);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
it('overrides the "findById" method and sets default values to output data', async function () {
sandbox.on(
U,
'setDefaultValuesToEmptyProperties',
(modelName, modelData, onlyProvidedProperties = false) => {
expect(modelName).to.be.eq('model');
expect(modelData).to.be.eql(INPUT_DATA);
expect(onlyProvidedProperties).to.be.false;
return INPUT_DATA_WITH_DEFAULTS;
},
);
const res = await A.findById('model', 1);
expect(res).to.be.eql(INPUT_DATA_WITH_DEFAULTS);
expect(U.setDefaultValuesToEmptyProperties).to.be.called.once;
});
});