UNPKG

forest-express-sequelize

Version:

Official Express/Sequelize Liana for Forest

278 lines (234 loc) 8.05 kB
const { postProcess } = require('../../src/utils/sequelize-compatibility'); const sequelize = { constructor: { version: '4.44.4' } }; const Model = { sequelize, name: 'model', associations: { submodelAlias: { target: { sequelize, name: 'submodel', associations: { subsubmodel1Alias: { target: { sequelize, name: 'subsubmodel2', associations: {}, }, }, subsubmodel2Alias: { target: { sequelize, name: 'subsubmodel1', associations: {}, }, }, }, }, }, }, }; const SubModel = Model.associations.submodelAlias.target; const SubSubModel1 = SubModel.associations.subsubmodel1Alias.target; const SubSubModel2 = SubModel.associations.subsubmodel2Alias.target; describe('utils > sequelize-compatibility', () => { describe('postProcess -> normalizeInclude', () => { it('should rewrite the include when using the {model, as} syntax', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ model: SubModel, as: 'submodelAlias' }] }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); it('should rewrite the include when using the {model} syntax', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ model: SubModel }] }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); it('should rewrite the include when using the {as} syntax', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ as: 'submodelAlias' }] }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); it('should rewrite the include when using the {association} syntax', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ association: 'submodelAlias' }] }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); it('should rewrite the include when using the string syntax', () => { expect.assertions(1); const options = postProcess(Model, { include: ['submodelAlias'] }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); it('should rewrite the include when using the Model syntax', () => { expect.assertions(1); const options = postProcess(Model, { include: [SubModel] }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); }); describe('postProcess', () => { it('bubble where conditions', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ as: 'submodelAlias', where: { id: 1 } }], where: { id: 1 }, }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], where: { id: 1, '$submodelAlias.id$': 1 }, }); }); it('should add attributes when both sides are defined', () => { expect.assertions(1); const options = postProcess(Model, { include: [ { as: 'submodelAlias', attributes: ['id'] }, { as: 'submodelAlias', attributes: ['name'] }, ], }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel, attributes: ['id', 'name'] }], }); }); it('should drop attributes when either side is undefined', () => { expect.assertions(1); const options = postProcess(Model, { include: [ { as: 'submodelAlias', attributes: ['id'] }, { as: 'submodelAlias' }, ], }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], }); }); it('should not crash if the root where conditions are undefined', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ as: 'submodelAlias', where: { id: 1 } }], }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], where: { '$submodelAlias.id$': 1 }, }); }); it('should merge includes when there are duplicates (for sequelize < 5)', () => { expect.assertions(1); const options = postProcess(Model, { include: [ SubModel, 'submodelAlias', { as: 'submodelAlias', where: { id: 1 } }, { association: 'submodelAlias', where: { title: 'Title' } }, { model: SubModel, where: { subTitle: 'subTitle' } }, ], where: { '$submodelAlias.rating$': 34, }, }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel }], where: { '$submodelAlias.id$': 1, '$submodelAlias.title$': 'Title', '$submodelAlias.subTitle$': 'subTitle', '$submodelAlias.rating$': 34, }, }); }); it('should do all of the above recursively', () => { expect.assertions(1); const options = postProcess(Model, { include: [ SubModel, 'submodelAlias', { as: 'submodelAlias', include: [ { as: 'subsubmodel1Alias', model: SubSubModel1, where: { subsubTitle: 'subsubtitle1' }, }, ], where: { id: 1 }, }, { association: 'submodelAlias', where: { title: 'Title' } }, { model: SubModel, include: [ { model: SubSubModel2, where: { subsubTitle: 'subsubtitle2' }, }, ], where: { subTitle: 'subTitle' }, }, ], where: { '$submodelAlias.rating$': 34, }, }); expect(options).toStrictEqual({ include: [ { as: 'submodelAlias', model: SubModel, include: [ { as: 'subsubmodel1Alias', model: SubSubModel1 }, { as: 'subsubmodel2Alias', model: SubSubModel2 }, ], }, ], where: { '$submodelAlias.id$': 1, '$submodelAlias.title$': 'Title', '$submodelAlias.subTitle$': 'subTitle', '$submodelAlias.rating$': 34, '$submodelAlias.subsubmodel1Alias.subsubTitle$': 'subsubtitle1', '$submodelAlias.subsubmodel2Alias.subsubTitle$': 'subsubtitle2', }, }); }); it('should add attributes when sub include is not an array', () => { expect.assertions(1); const options = postProcess(Model, { include: [{ as: 'submodelAlias', attributes: ['id'], include: 'subsubmodel1Alias' }], }); expect(options).toStrictEqual({ include: [{ as: 'submodelAlias', model: SubModel, attributes: ['id'], include: [{ as: 'subsubmodel1Alias', model: SubSubModel1 }], }], }); }); }); describe('postProcess -> removeDuplicateAssociations', () => { describe('when include alias is not valid', () => { it('should not throw an error', () => { expect.assertions(1); const include = [{ model: SubModel, as: 'notAValidAlias', include: SubModel }]; expect(() => postProcess(Model, { include })).not.toThrow(); }); }); describe('when the main model is reincluded', () => { it('should not throw an error', () => { expect.assertions(1); const include = [{ model: Model, include: SubSubModel1 }]; expect(() => postProcess(Model, { include })).not.toThrow(); }); }); }); });