it('should resolve the Promise **after** `prepare` method is executed', function (done) { var model = new Model(); spyOn(model, 'prepare'); var promise = model.load(); promise.done(function () { expect(model.prepare).toHaveBeenCalled(); done(); }); });
it('should abort a abortable Promise if model is disposed before it resolves', function () { var model = new Model(); var spy = jasmine.createSpy('abort'); model.datasource = function () { var promise = delayed(1, 1)(); promise.abort = spy; return promise; }; model.load(); model.dispose(); expect(spy).toHaveBeenCalled(); });
it('should not call `abort` after it resolves', function (done) { var model = new Model(); var spy = jasmine.createSpy('abort'); model.datasource = function () { var promise = delayed(1, 1)(); promise.abort = spy; return promise; }; model.load().done(function () { expect(spy).not.toHaveBeenCalled(); done(); }); });
it('should load data in parallel if `datasource` is given as an array', function (done) { var model = new Model(); var queue = []; model.datasource = [ { x: delayed(20, 'a', queue) }, { y: delayed(10, 'b', queue) } ]; var promise = model.load(); promise.done(function () { expect(queue.join('')).toBe('ab'); done(); }); });
it('should add a property if `datasource` is given as an object', function (done) { var model = new Model(); model.datasource = { x: function() { return 1; } }; var promise = model.load(); promise.done(function () { expect(model.get('x')).toBe(1); done(); }); });
it('should cancel a cancellable Promise in parallel config if model is disposed before it resolves', function () { var model = new Model(); var spy = jasmine.createSpy('cancel'); model.datasource = { a: function () { var promise = delayed(1, 1)(); promise.cancel = spy; return promise; } }; model.load(); model.dispose(); expect(spy).toHaveBeenCalled(); });
it('should dump the return value if `datasource` is given as a function', function (done) { var model = new Model(); model.datasource = function () { return { x: 1, y: 2 }; } var promise = model.load(); promise.done(function () { expect(model.get('x')).toBe(1); expect(model.get('y')).toBe(2); done(); }); });
it('should abort a abortable Promise in sequence config if model is disposed before it resolves', function (done) { var model = new Model(); var spy = jasmine.createSpy('abort'); model.datasource = [ function () { var promise = delayed(1, 10)(); promise.abort = spy; return promise; } ]; model.load(); setTimeout(function () { model.dispose(); expect(spy).toHaveBeenCalled(); done(); }, 1); });
it('should accept data load descriptor as `datasource` item', function (done) { var model = new Model(); var queue = []; model.datasource = { x: { name: 'a', retrieve: delayed(20, 'a', queue) }, y: { name: 'b', retrieve: delayed(10, 'b', queue) } }; var promise = model.load(); promise.done(function () { expect(queue.join('')).toBe('ba'); expect(model.get('x')).toBeUndefined(); expect(model.get('y')).toBeUndefined(); expect(model.get('a')).toBe('a'); expect(model.get('b')).toBe('b'); done(); }); });
it('should give the correct load sequence when `datasource` is given as a mixed config', function (done) { var model = new Model(); var queue = []; model.datasource = [ { x: delayed(20, 'a', queue) }, { y: delayed(10, 'b', queue) }, { a: delayed(20, 'c', queue), b: delayed(10, 'd', queue) } ]; var promise = model.load(); promise.done(function () { expect(queue.join('')).toBe('abdc'); done(); }); });
it('should wait for datasource loaded if data factory returns a Promise', function (done) { var model = new Model(); var deferred = new Deferred(); model.datasource = { x: function () { setTimeout(function () { deferred.resolve(1); }, 0); return deferred.promise; } }; var promise = model.load(); promise.done(function () { expect(deferred.state).toBe('resolved'); expect(model.get('x')).toBe(1); done(); }); });
it('should ignore `name` descriptor property if `dump` is set to true', function (done) { var model = new Model(); model.datasource = [ { name: 'x', retrieve: function() { return { x: 1, y: 2 } }, dump: true } ]; var promise = model.load(); promise.done(function () { expect(model.get('x')).toBe(1); expect(model.get('y')).toBe(2); done(); }); })
it('should return a Promise when calling `load` method', function () { var model = new Model(); var value = model.load(); expect(Deferred.isPromise(value)).toBe(true); });