test('In memory', function() { var collection = new PostCollection(null, {processInMemory: true}); this.ajaxResponse = {results: ExampleData.POSTS}; var eventLog = new EventLog(collection); collection.load(); equal(collection.size(), 3); equal(this.ajaxCount, 1, 'should load both parent and remote children'); equal(eventLog.counts.load, 1, 'should fire load on inital load'); collection.load(); equal(this.ajaxCount, 1, 'should not load again if processInMemory'); equal(eventLog.counts.load, 2, 'should fire load on in memory load'); equal(collection.size(), 3); collection.set({query: '2'}); collection.load(); equal(collection.size(), 1, 'should query in memory'); equal(collection.at(0).get('id'), 2); collection.set({ query: undefined, filter: {id: 1} }); collection.addFilter(new Filter({key: 'id', value: 1, comparison: 'equals'})); collection.load(); equal(collection.size(), 1, 'should filter in memory'); equal(collection.at(0).get('id'), 1); });
test('View state', function(){ var collection = new PostCollection(); this.ajaxResponse = {results: ExampleData.POSTS, meta: {sortField: 'subject', sortDir: 1, page: 0, pageSize: 200}}; collection.load(); var queryParams = collection.getQueryParams(); equal(queryParams.sortField, 'subject', 'query params should include view state'); equal(queryParams.sortDir, 1, 'query params should include view state'); var eventLog = new EventLog(collection); collection.set({sortField: 'body'}); equal(eventLog.counts['change:sortField'], 1, 'should fire change event'); collection.set({sortField: 'body'}); equal(eventLog.counts['change:sortField'], 1, 'should not fire change when value is the same'); });
test('Can set attributes and models', function() { var collection = new PostCollection(); collection.set({ href: '/foo', models: ExampleData.POSTS }); equal(collection.get('href'), '/foo', 'should set attributes'); equal(collection.size(), ExampleData.POSTS.length, 'should set models'); });
test('should discard load if query has changed before returning', function(){ var collection = new PostCollection(); this.ajaxResponse = {results: ExampleData.POSTS, meta: {query: 'foo', filter: {body: 'foo'}}}; collection.set({query: 'foo', filter: {body: 'foo'}}); collection.load({success: function() { ok(true, 'should complete load since query is the same'); }.bind(this)}); collection.set('query', 'bar'); collection.load({success: function() { ok(false, 'should not complete load since query changed'); }}); collection.set({query: 'foo', filter: {body: 'bar'}}); collection.load({success: function() { ok(false, 'should not complete load since filter changed'); }}); });
test('changing model then filtering in memory keeps changes', function() { var collection = new PostCollection(null, {processInMemory: true}); this.ajaxResponse = {results: ExampleData.POSTS}; var eventLog = new EventLog(collection); collection.load(); equal(collection.at(0).get('active'), undefined); collection.at(0).set('active', true); collection.set('filter', {id: ExampleData.POSTS[0].id}); collection.load(); equal(collection.at(0).get('active'), true, 'should keep values after filtering'); });
test('loaded models have fetched set', function() { this.ajaxResponse = {results: ExampleData.POSTS, meta: {total: 6}}; var collection = new PostCollection(null); collection.set('pageSize', 3); var buffered = new BufferedCollection(collection); var eventLog = new EventLog(buffered); buffered.ensureData(0,3); equal(buffered.at(0).fetched, true, 'should set fetched'); buffered.ensureData(3,6); equal(buffered.at(5).fetched, true, 'should set fetched'); });
test('Can ensureData across pages', function() { this.ajaxResponse = {results: ExampleData.POSTS, meta: {total: 6}}; var collection = new PostCollection(null); collection.set('pageSize', 3); var buffered = new BufferedCollection(collection); var eventLog = new EventLog(buffered); buffered.ensureData(1,5); equal(buffered.buffer.length, 6, 'should load 2 pages'); equal(eventLog.counts.pageLoad, 2, 'should 2 pages pageLoad'); });
test('Can instantiate', function() { var collection = new PostCollection(); collection.reset(ExampleData.POSTS); equal(collection.size(), 3); equal(collection.at(1).get('body'), 'my body2'); ok(collection.getRelated('filters') !== undefined, 'filter should exist'); collection.setFilter('foo', 'bar'); collection.set('foo', 'bar'); var collection2 = new PostCollection(); equal(collection2.get('foo'), undefined, 'should not share meta'); ok(collection2.getFilters('foo').length === 0, 'should not share filter'); });
test('Do load again while already loading if params have changed', function(assert){ var collection = new PostCollection(); var done = assert.async(); this.ajaxResponse = {results: ExampleData.POSTS}; this.ajaxAsync = true; collection.load(); collection.set('pageSize', 7); collection.load({success: function() { equal(this.ajaxCount, 2, 'should load again after param change'); done(); }.bind(this)}); this.ajaxAsync = false; });
test('Can ensureData', function() { this.ajaxResponse = {results: ExampleData.POSTS, meta: {total: 6}}; var collection = new PostCollection(null); collection.set('pageSize', 3); var buffered = new BufferedCollection(collection); var eventLog = new EventLog(buffered); buffered.ensureData(0,1); equal(eventLog.counts.beginLoad, 1, 'should emit beginPageLoad'); equal(eventLog.counts.pageLoad, 1, 'should emit pageLoad'); equal(buffered.size(), 6, 'should get total from response meta'); equal(buffered.buffer.length, 3, 'should have only actually loaded one page'); buffered.ensureData(2,3); equal(this.ajaxCount, 2, 'should request 2nd page'); equal(buffered.buffer.length, 6, 'should have loaded 2nd page'); });