// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2009 Apple, Inc. and contributors. // License: Licened under MIT license (see license.js) // ========================================================================== /*globals module ok equals same test MyApp */ // NOTE: The test below are based on the Data Hashes state chart. This models // the "remove" event in the Store portion of the diagram. var store, child, storeKey, json; module("SC.Store#removeDataHash", { setup: function() { store = SC.Store.create(); json = { string: "string", number: 23, bool: YES }; storeKey = SC.Store.generateStoreKey(); store.writeDataHash(storeKey, json, SC.Record.READY_CLEAN); store.editables = null; // manually patch to setup test state child = store.chain(); // test multiple levels deep } }); // .......................................................... // BASIC STATE TRANSITIONS // // The transition from each base state performs the same operation, so just // run the same test on each state. function testRemoveDataHash() { var oldrev = store.revisions[storeKey]; // perform test equals(store.removeDataHash(storeKey, SC.Record.DESTROYED_CLEAN), store, 'should return receiver'); // verify equals(store.storeKeyEditState(storeKey), SC.Store.LOCKED, 'new edit state should be locked'); equals(store.readDataHash(storeKey), null, 'should have NO json data'); equals(store.readStatus(storeKey), SC.Record.DESTROYED_CLEAN, 'should have new status'); equals(store.revisions[storeKey], oldrev, 'should not change revision'); if (!SC.none(oldrev)) { ok(store.revisions.hasOwnProperty(storeKey), 'should clone reference to revision'); } } test("edit state=LOCKED", function() { // test preconditions equals(store.storeKeyEditState(storeKey), SC.Store.LOCKED, 'precond - edit state should be locked'); testRemoveDataHash(); }); test("edit state=EDITABLE", function() { // test preconditions store.readEditableDataHash(storeKey); equals(store.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'precond - edit state should be editable'); testRemoveDataHash(); }); // .......................................................... // REMOVE NON-EXISTING // test("remove a non-existing hash", function() { storeKey = SC.Store.generateStoreKey(); // new store key! equals(store.readDataHash(storeKey), null, 'precond - store should not have a data hash for store key yet'); // perform write equals(store.removeDataHash(storeKey, SC.Record.DESTROYED_CLEAN), store, 'should return receiver'); // verify change equals(store.storeKeyEditState(storeKey), SC.Store.LOCKED, 'new status should be locked'); equals(store.readDataHash(storeKey), null, 'should still be null'); equals(store.readStatus(storeKey), SC.Record.DESTROYED_CLEAN, 'should have new record status'); }); // .......................................................... // PROPOGATING TO NESTED STORES // test("change should propogate to child if child edit state = INHERITED", function() { // verify preconditions equals(child.storeKeyEditState(storeKey), SC.Store.INHERITED, 'precond - child edit state should be INHERITED'); // perform change store.removeDataHash(storeKey, SC.Record.DESTROYED_CLEAN); // verify same(child.readDataHash(storeKey), null, 'child should pick up change'); equals(child.readStatus(storeKey), SC.Record.DESTROYED_CLEAN, 'child should pick up new status'); }); function testLockedOrEditableChild() { // perform change store.removeDataHash(storeKey, SC.Record.DESTROYED_CLEAN); // verify same(child.readDataHash(storeKey), json, 'child should NOT pick up change'); equals(child.readStatus(storeKey), SC.Record.READY_CLEAN, 'child should pick up new status'); } test("change should not propogate to child if child edit state = LOCKED", function() { // verify preconditions child.readDataHash(storeKey); equals(child.storeKeyEditState(storeKey), SC.Store.LOCKED, 'precond - child edit state should be LOCKED'); testLockedOrEditableChild(); }); test("change should not propogate to child if child edit state = EDITABLE", function() { // verify preconditions child.readEditableDataHash(storeKey); equals(child.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'precond - child edit state should be EDITABLE'); testLockedOrEditableChild(); });