/* eslint quote-props: 0 */ import Thread from '../../src/flux/models/thread'; import TestModel from '../fixtures/db-test-model'; import ModelQuery from '../../src/flux/models/query'; import DatabaseStore from '../../src/flux/stores/database-store'; const testMatchers = {'id': 'b'}; describe("DatabaseStore", function DatabaseStoreSpecs() { beforeEach(() => { TestModel.configureBasic(); spyOn(ModelQuery.prototype, 'where').andCallThrough(); this.performed = []; // Note: We spy on _query and test all of the convenience methods that sit above // it. None of these tests evaluate whether _query works! jasmine.unspy(DatabaseStore, "_query"); spyOn(DatabaseStore, "_query").andCallFake((query, values = []) => { this.performed.push({query, values}); return Promise.resolve([]); }); }); describe("find", () => it("should return a ModelQuery for retrieving a single item by Id", () => { const q = DatabaseStore.find(TestModel, "4"); expect(q.sql()).toBe("SELECT `TestModel`.`data` FROM `TestModel` WHERE `TestModel`.`id` = '4' LIMIT 1"); }) ); describe("findBy", () => { it("should pass the provided predicates on to the ModelQuery", () => { DatabaseStore.findBy(TestModel, testMatchers); expect(ModelQuery.prototype.where).toHaveBeenCalledWith(testMatchers); }); it("should return a ModelQuery ready to be executed", () => { const q = DatabaseStore.findBy(TestModel, testMatchers); expect(q.sql()).toBe("SELECT `TestModel`.`data` FROM `TestModel` WHERE `TestModel`.`id` = 'b' LIMIT 1"); }); }); describe("findAll", () => { it("should pass the provided predicates on to the ModelQuery", () => { DatabaseStore.findAll(TestModel, testMatchers); expect(ModelQuery.prototype.where).toHaveBeenCalledWith(testMatchers); }); it("should return a ModelQuery ready to be executed", () => { const q = DatabaseStore.findAll(TestModel, testMatchers); expect(q.sql()).toBe("SELECT `TestModel`.`data` FROM `TestModel` WHERE `TestModel`.`id` = 'b' "); }); }); describe("modelify", () => { beforeEach(() => { this.models = [ new Thread({id: 'local-A'}), new Thread({id: 'local-B'}), new Thread({id: 'local-C'}), new Thread({id: 'local-D'}), new Thread({id: 'local-E'}), new Thread({id: 'local-F'}), new Thread({id: 'local-G'}), ]; // Actually returns correct sets for queries, since matchers can evaluate // themselves against models in memory spyOn(DatabaseStore, 'run').andCallFake(query => { const results = this.models.filter(model => query._matchers.every(matcher => matcher.evaluate(model)) ); return Promise.resolve(results); }); }); describe("when given an array or input that is not an array", () => it("resolves immediately with an empty array", () => waitsForPromise(() => { return DatabaseStore.modelify(Thread, null).then(output => { expect(output).toEqual([]); }); }) ) ); describe("when given an array of mixed IDs, and models", () => it("resolves with an array of models", () => { const input = ['local-F', 'local-B', 'local-C', 'local-D', this.models[6]]; const expectedOutput = [this.models[5], this.models[1], this.models[2], this.models[3], this.models[6]]; return waitsForPromise(() => { return DatabaseStore.modelify(Thread, input).then(output => { expect(output).toEqual(expectedOutput); }); }); }) ); describe("when the input is only IDs", () => it("resolves with an array of models", () => { const input = ['local-D', 'local-F', 'local-G']; const expectedOutput = [this.models[3], this.models[5], this.models[6]]; return waitsForPromise(() => { return DatabaseStore.modelify(Thread, input).then(output => { expect(output).toEqual(expectedOutput); }); }); }) ); describe("when the input is all models", () => it("resolves with an array of models", () => { const input = [this.models[0], this.models[1], this.models[2], this.models[3]]; const expectedOutput = [this.models[0], this.models[1], this.models[2], this.models[3]]; return waitsForPromise(() => { return DatabaseStore.modelify(Thread, input).then(output => { expect(output).toEqual(expectedOutput); }); }); }) ); }); describe("count", () => { it("should pass the provided predicates on to the ModelQuery", () => { DatabaseStore.findAll(TestModel, testMatchers); expect(ModelQuery.prototype.where).toHaveBeenCalledWith(testMatchers); }); it("should return a ModelQuery configured for COUNT ready to be executed", () => { const q = DatabaseStore.findAll(TestModel, testMatchers); expect(q.sql()).toBe("SELECT `TestModel`.`data` FROM `TestModel` WHERE `TestModel`.`id` = 'b' "); }); }); });