diff --git a/data-queryable.js b/data-queryable.js index ab7e6cd..98c2b3c 100644 --- a/data-queryable.js +++ b/data-queryable.js @@ -6,7 +6,7 @@ var _ = require('lodash'); var {TextUtils} = require('@themost/common'); var {DataMappingExtender} = require('./data-mapping-extensions'); var {DataAssociationMapping} = require('./types'); -var {DataError} = require('@themost/common'); +var {DataError, Args} = require('@themost/common'); var {QueryField} = require('@themost/query'); var {QueryEntity} = require('@themost/query'); var {QueryUtils} = require('@themost/query'); @@ -853,6 +853,7 @@ DataQueryable.prototype.prepare = function(useOr) { }); */ DataQueryable.prototype.where = function(attr) { + Args.check(this.query.$where == null, new Error('The where expression has already been initialized.')); if (typeof attr === 'string' && /\//.test(attr)) { this.query.where(DataAttributeResolver.prototype.resolveNestedAttribute.call(this, attr)); return this; diff --git a/spec/DataQueryable.spec.ts b/spec/DataQueryable.spec.ts new file mode 100644 index 0000000..5461322 --- /dev/null +++ b/spec/DataQueryable.spec.ts @@ -0,0 +1,51 @@ +import {DataModelFilterParser} from '../data-model-filter.parser'; +import {TestApplication} from './TestApplication'; +import {DataContext} from '../types'; +import {resolve} from 'path'; + +describe('DataQueryable', () => { + + let app: TestApplication; + let context: DataContext; + beforeAll((done) => { + app = new TestApplication(resolve(__dirname, 'test2')); + context = app.createContext(); + return done(); + }); + afterAll(async () => { + await context.finalizeAsync(); + await app.finalize(); + }); + + /** + * @see https://github.com/themost-framework/data/issues/161 + */ + it('should validate where statement', async () => { + const Orders = context.model('Order').silent(); + const items = await Orders.where('orderStatus/alternateName').equal('OrderDelivered') + .orderByDescending('orderDate').take(10).getItems(); + expect(items).toBeTruthy(); + expect(items.length).toBeGreaterThan(0); + }); + + /** + * @see https://github.com/themost-framework/data/issues/161 + */ + it('should validate where statement with error', async () => { + const Orders = context.model('Order').silent(); + const q = Orders.where('orderStatus/alternateName').equal('OrderDelivered') + .orderByDescending('orderDate').take(10); + expect(() => q.where('orderedItem/category').equal('Laptops')).toThrow('The where expression has already been initialized.'); + }); + + /** + * @see https://github.com/themost-framework/data/issues/161 + */ + it('should validate where statement after prepare', async () => { + const Orders = context.model('Order').silent(); + const q = Orders.where('orderStatus/alternateName').equal('OrderDelivered') + .orderByDescending('orderDate').take(10); + expect(() => q.prepare().where('orderedItem/category').equal('Laptops')).toBeTruthy(); + }); + +});