--- /dev/null
+/*!
+ * Ext JS Library 3.2.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**
+ * Tests Ext.data.Store functionality
+ * @author Ed Spencer
+ */
+(function() {
+ var suite = Ext.test.session.getSuite('Ext.data.Store'),
+ assert = Y.Assert;
+
+ //a shared setup function used by several of the suites
+ var defaultSetup = function() {
+ this.store = new Ext.data.Store({
+ proxy : new Ext.data.MemoryProxy({}),
+ reader: new Ext.data.ArrayReader({}, [
+ {name: 'name', type: 'string'},
+ {name: 'email', type: 'string'},
+ {name: 'greatness', type: 'int'},
+ {name: 'group', type: 'string'},
+ {name: 'old', type: 'boolean'}
+ ]),
+ storeId: 'myStore',
+ remoteSort: false
+ });
+
+ this.store.loadData([
+ ['Ed Spencer', 'ed@extjs.com', 100, 'code', false],
+ ['Abe Elias', 'abe@extjs.com', 70, 'admin', false],
+ ['Aaron Conran', 'aaron@extjs.com', 5, 'admin', true],
+ ['Tommy Maintz', 'tommy@extjs.com', -15, 'code', true]
+ ]);
+ };
+
+ suite.add(new Y.Test.Case({
+ name: 'local single sorting',
+
+ setUp: defaultSetup,
+
+ testSetDefaultSort: function() {
+ this.store.setDefaultSort('name', 'DESC');
+
+ var store = this.store,
+ sortInfo = store.sortInfo;
+
+ assert.areEqual('name', sortInfo.field);
+ assert.areEqual('DESC', sortInfo.direction);
+ assert.areEqual('DESC', store.sortToggle['name']);
+ },
+
+ testSetDefaultSortDefaultToASC: function() {
+ this.store.setDefaultSort('email');
+
+ var store = this.store,
+ sortInfo = store.sortInfo;
+
+ assert.areEqual('email', sortInfo.field);
+ assert.areEqual('ASC', sortInfo['direction']);
+ assert.areEqual('ASC', store.sortToggle['email']);
+ },
+
+ testSortByField: function() {
+ var store = this.store;
+
+ store.sort('name', 'ASC');
+ assert.areEqual('Aaron Conran', store.getAt(0).get('name'));
+ assert.areEqual('Abe Elias', store.getAt(1).get('name'));
+ assert.areEqual('Ed Spencer', store.getAt(2).get('name'));
+ assert.areEqual('Tommy Maintz', store.getAt(3).get('name'));
+ },
+
+ testToggling: function() {
+ var store = this.store;
+
+ store.sort('name', 'ASC');
+
+ //second call to sort toggles the direction
+ store.sort('name');
+
+ assert.areEqual('Aaron Conran', store.getAt(3).get('name'));
+ assert.areEqual('Abe Elias', store.getAt(2).get('name'));
+ assert.areEqual('Ed Spencer', store.getAt(1).get('name'));
+ assert.areEqual('Tommy Maintz', store.getAt(0).get('name'));
+ },
+
+ testSetsHasMultiSort: function() {
+ this.store.sort('name', 'ASC');
+
+ assert.isFalse(this.store.hasMultiSort);
+ },
+
+ testEventFired: function() {
+ var executed = false,
+ store = this.store;
+
+ store.on('datachanged', function() {
+ executed = true;
+ }, this);
+
+ store.sort('name');
+ assert.isTrue(executed);
+ },
+
+ testSavesSortInfo: function() {
+ var store = this.store;
+
+ store.sort('name', 'DESC');
+
+ assert.areEqual('name', store.sortInfo.field);
+ assert.areEqual('DESC', store.sortInfo.direction);
+ },
+
+ //if we tell store to sort on a non-existent field it should return false and do nothing
+ testInvalidFieldIgnored: function() {
+ var store = this.store;
+
+ //first we'll sort by name to give some reference sorting
+ store.sort('name', 'ASC');
+
+ assert.isFalse(store.sort('someUnknownField'));
+
+ //make sure the original sorting was preserved
+ assert.areEqual('Aaron Conran', store.getAt(0).get('name'));
+ assert.areEqual('Abe Elias', store.getAt(1).get('name'));
+ assert.areEqual('Ed Spencer', store.getAt(2).get('name'));
+ assert.areEqual('Tommy Maintz', store.getAt(3).get('name'));
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'local multiple sorting',
+
+ setUp: function() {
+ defaultSetup.call(this);
+
+ this.sorters = [
+ {
+ field : 'group',
+ direction: 'ASC'
+ },
+ {
+ field : 'old',
+ direction: 'DESC'
+ }
+ ];
+ },
+
+ testSetsHasMultiSort: function() {
+ this.store.sort(this.sorters);
+
+ assert.isTrue(this.store.hasMultiSort);
+ },
+
+ testMultipleSorters: function() {
+ var store = this.store,
+ sorters = this.sorters;
+
+ store.sort(sorters);
+
+ assert.areEqual('Aaron Conran', store.getAt(0).get('name'));
+ assert.areEqual('Abe Elias', store.getAt(1).get('name'));
+ assert.areEqual('Tommy Maintz', store.getAt(2).get('name'));
+ assert.areEqual('Ed Spencer', store.getAt(3).get('name'));
+ }
+
+ // testMultipleSorterToggling: function() {
+ // var store = this.store,
+ // sorters = this.sorters;
+ //
+ // //first we'll sort to give some reference sorting
+ // store.sort(sorters, "ASC");
+ //
+ // //second call to sort toggles direction
+ // store.sort(sorters);
+ //
+ // assert.areEqual('Aaron Conran', store.getAt(3).get('name'));
+ // assert.areEqual('Abe Elias', store.getAt(2).get('name'));
+ // assert.areEqual('Tommy Maintz', store.getAt(1).get('name'));
+ // assert.areEqual('Ed Spencer', store.getAt(0).get('name'));
+ // }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'single filtering',
+
+ setUp: defaultSetup,
+
+ testFilterByField: function() {
+ var store = this.store;
+
+ store.filter('group', 'code');
+ assert.areEqual(2, store.getCount());
+ },
+
+ testFilterByFieldAnyMatch: function() {
+ var store = this.store;
+
+ store.filter('email', 'extjs', true);
+ assert.areEqual(4, store.getCount());
+ },
+
+ testFilterByFieldCaseSensitive: function() {
+ var store = this.store;
+
+ store.filter('group', 'Code', false, true);
+ assert.areEqual(0, store.getCount());
+ },
+
+ testFilterByFieldExactMatch: function() {
+ var store = this.store;
+
+ store.filter('email', 'aaron', false, false, true);
+ assert.areEqual(0, store.getCount());
+ },
+
+ testClearFilter: function() {
+ var store = this.store,
+ executed = false;
+
+ store.on('datachanged', function() {
+ executed = true;
+ }, this);
+
+ store.filter('group', 'code');
+ assert.areEqual(2, store.getCount());
+
+ store.clearFilter();
+ assert.areEqual(4, store.getCount());
+
+ assert.isTrue(executed);
+ },
+
+ testSuppressClearFilterEvent: function() {
+ var store = this.store,
+ executed = false;
+
+ store.filter('group', 'email');
+ store.clearFilter(true);
+
+ store.on('datachanged', function() {
+ executed = true;
+ }, this);
+ assert.isFalse(executed);
+ },
+
+ testIsFiltered: function() {
+ var store = this.store;
+
+ assert.isFalse(store.isFiltered());
+ store.filter('group', 'code');
+ assert.isTrue(store.isFiltered());
+ },
+
+ testFilterByFunction: function() {
+ var store = this.store,
+ execScope,
+ executed;
+
+ store.on('datachanged', function() {
+ executed = true;
+ }, this);
+
+ var filterFn = function(item) {
+ execScope = this;
+
+ return item.get('greatness') > 50;
+ };
+
+ store.filterBy(filterFn, this);
+ assert.areEqual(this, execScope);
+ assert.areEqual(2, store.getCount());
+ assert.isTrue(executed);
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name : 'filtering more than once',
+ setUp: defaultSetup,
+
+ testFirstFilterIsCleared: function() {
+ var store = this.store;
+
+ store.filter('group', 'code');
+ assert.areEqual(2, store.getCount());
+
+ store.filter('old', false);
+
+ //if filter had not been reset first, count would be 1
+ assert.areEqual(2, store.getCount());
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name : 'multiple filters',
+ setUp: function() {
+ defaultSetup.call(this);
+
+ this.filters = [
+ {
+ property: 'group',
+ value : 'code'
+ },
+ {
+ property: 'old',
+ value : true
+ }
+ ];
+ },
+
+ testMultipleBasicFilters: function() {
+ this.store.filter(this.filters);
+
+ //applying the filter set above shoule yield one result
+ assert.areEqual(1, this.store.getCount());
+ assert.areEqual('Tommy Maintz', this.store.data.first().get('name'));
+ },
+
+ testMultiFiltersFiresDataChanged: function() {
+ var executed = false;
+
+ this.store.on('datachanged', function() {
+ executed = true;
+ }, this);
+
+ this.store.filter(this.filters);
+
+ assert.isTrue(executed);
+ },
+
+ //tests that the anyMatch and caseSensitive defaults are correctly applied
+ testMultiFilterDefaults: function() {
+ //PENDING
+ },
+
+ //tests a single custom filter
+ testCustomFilter: function() {
+ var execScope;
+
+ //tests that the passed filter function is called
+ //tests that the filter is called in the right scope
+ this.store.filter({
+ fn: function(record) {
+ execScope = this;
+ return record.get('group') == 'admin' && record.get('old') === true;
+ },
+ scope: this
+ });
+
+ assert.areEqual(this, execScope);
+ assert.areEqual(1, this.store.getCount());
+ assert.areEqual('Aaron Conran', this.store.data.first().get('name'));
+ },
+
+ //tests multiple filters where we pass in custom matcher functions
+ testMultiCustomFilters: function() {
+ this.store.filter([
+ {
+ fn: function(record) {
+ return record.get('group') == 'admin';
+ }
+ },
+ {
+ fn: function(record) {
+ return record.get('old') === false;
+ }
+ }
+ ]);
+
+ assert.areEqual(1, this.store.getCount());
+ assert.areEqual('Abe Elias', this.store.data.first().get('name'));
+ },
+
+ testBasicAndCustomFilters: function() {
+ //should return a single result - Ed Spencer
+ this.store.filter([
+ {
+ fn: function(record) {
+ return record.get('old') === false;
+ }
+ },
+ {
+ property: 'group',
+ value : 'code'
+ }
+ ]);
+
+ assert.areEqual(1, this.store.getCount());
+ assert.areEqual('Ed Spencer', this.store.data.first().get('name'));
+ },
+
+ testClearMultipleFilters: function() {
+ this.store.filter(this.filters);
+ assert.areEqual(1, this.store.getCount());
+
+ //make sure that clearing multiple filters is still correct
+ this.store.clearFilter();
+ assert.areEqual(4, this.store.getCount());
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'inserting and removing',
+
+ testInsert: function() {
+ //PENDING
+ },
+
+ testInsertFiresAddEvent: function() {
+ //PENDING
+ },
+
+ testRemove: function() {
+ //PENDING
+ },
+
+ testRemoveAll: function() {
+ //PENDING
+ },
+
+ testRemoveAt: function() {
+ //PENDING
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'destroying',
+
+ setUp: defaultSetup,
+
+ //we hijack Ext.StoreMgr.unregister temporarily and then set it back in this test case
+ testUnregistersFromStore: function() {
+ var executed = false,
+ arg = undefined,
+ unregister = Ext.StoreMgr.unregister;
+
+ Ext.StoreMgr.unregister = function(store) {
+ executed = true;
+ arg = store;
+ };
+
+ this.store.destroy();
+
+ assert.isTrue(executed);
+ assert.areEqual(this.store, arg);
+
+ Ext.StoreMgr.unregister = unregister;
+ },
+
+ testClearsData: function() {
+ var executed = false;
+ this.store.clearData = function() {
+ executed = true;
+ };
+
+ this.store.destroy();
+ assert.isTrue(executed);
+ },
+
+ testDestroysProxy: function() {
+ var executed = false,
+ arg = undefined,
+ proxy = this.store.proxy,
+ destroy = Ext.destroy;
+
+ Ext.destroy = function(store) {
+ executed = true;
+ arg = store;
+ };
+
+ this.store.destroy();
+
+ assert.isTrue(executed);
+ assert.areEqual(proxy, arg);
+
+ Ext.destroy = destroy;
+ },
+
+ testUnsetsReferences: function() {
+ this.store.destroy();
+
+ assert.isNull(this.store.reader);
+ assert.isNull(this.store.writer);
+ assert.isNull(this.store.data);
+ },
+
+ testIsDestroyed: function() {
+ assert.isFalse(this.store.isDestroyed);
+
+ this.store.destroy();
+
+ assert.isTrue(this.store.isDestroyed);
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'counting and iterators',
+
+ setUp: defaultSetup,
+
+ testGetCount: function() {
+ assert.areEqual(4, this.store.getCount());
+ },
+
+ testGetTotalCount: function() {
+ //PENDING - need a fake remote data set test with paging
+ },
+
+ testEach: function() {
+ var count = 0,
+ callScope;
+
+ this.store.each(function() {
+ callScope = this;
+ count ++;
+ }, this);
+
+ assert.areEqual(4, count);
+ assert.areEqual(this, callScope);
+ },
+
+ testSum: function() {
+ var sum = this.store.sum('greatness');
+
+ assert.areEqual(160, sum);
+ },
+
+ testSumWithStartAndEnd: function() {
+ var sum = this.store.sum('greatness', 1, 3);
+
+ assert.areEqual(60, sum);
+ },
+
+ //a normal collect test - check that we're pulling the right values out of the store
+ testCollect: function() {
+ var values = this.store.collect('name');
+
+ assert.areEqual(4, values.length);
+ assert.areNotEqual(-1, values.indexOf("Ed Spencer"));
+ assert.areNotEqual(-1, values.indexOf("Abe Elias"));
+ assert.areNotEqual(-1, values.indexOf("Aaron Conran"));
+ assert.areNotEqual(-1, values.indexOf("Tommy Maintz"));
+ },
+
+ //checks that all collected values are unique
+ testCollectIsUnique: function() {
+ var values = this.store.collect('group');
+
+ assert.areEqual(2, values.length);
+ assert.areNotEqual(-1, values.indexOf("code"));
+ assert.areNotEqual(-1, values.indexOf("admin"));
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'committing',
+
+ testCommitChanges: function() {
+ //PENDING
+ },
+
+ testRejectChanges: function() {
+ //PENDING
+ },
+
+ testAfterCommit: function() {
+ //PENDING
+ },
+
+ testAfterReject: function() {
+ //PENDING
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'modified',
+
+ testGetModifiedRecords: function() {
+ //PENDING
+ }
+ }));
+
+ suite.add(new Y.Test.Case({
+ name: 'loading'
+ }));
+})();