// ========================================================================== // Project: SproutCore
- JavaScript Application Framework // Copyright: ©2006-2011 Apple Inc. and contributors. // License: Licensed under MIT license (see license.js) // ========================================================================== /*globals module, ok, equals, same, test */
var store, Foo, json, foo ; module(“SC.Record#writeAttribute”, {
setup: function() { SC.RunLoop.begin(); store = SC.Store.create(); Foo = SC.Record.extend(); json = { foo: "bar", number: 123, bool: YES, array: [1,2,3], guid: 1 }; foo = store.createRecord(Foo, json); store.writeStatus(foo.storeKey, SC.Record.READY_CLEAN); SC.RunLoop.end(); }, teardown: function () { store.destroy(); Foo = store = json = foo = null; }
});
test(“returns receiver”, function() {
equals(foo.writeAttribute("bar", "baz"), foo, 'should return receiver');
});
test(“first time writing should mark record as dirty”, function() {
// precondition equals(foo.get('status'), SC.Record.READY_CLEAN, 'precond - start clean'); SC.RunLoop.begin(); // action foo.writeAttribute("bar", "baz"); SC.RunLoop.end(); // evaluate equals(foo.get('status'), SC.Record.READY_DIRTY, 'should make READY_DIRTY after write');
});
test(“state change should be deferred if writing inside of a beginEditing()/endEditing() pair”, function() {
// precondition equals(foo.get('status'), SC.Record.READY_CLEAN, 'precond - start clean'); SC.RunLoop.begin(); // action foo.beginEditing(); foo.writeAttribute("bar", "baz"); equals(foo.get('status'), SC.Record.READY_CLEAN, 'should not change state yet'); foo.endEditing(); SC.RunLoop.end(); // evaluate equals(foo.get('status'), SC.Record.READY_DIRTY, 'should make READY_DIRTY after write');
}) ;
test(“raises exception if you try to write an attribute before an attribute hash has been set”, function() {
store.removeDataHash(foo.storeKey); equals(store.readDataHash(foo.storeKey), null, 'precond - should not have store key'); var cnt=0 ; try { foo.writeAttribute("foo", "bar"); } catch(e) { equals(e.message, SC.Record.BAD_STATE_ERROR.toString(), 'should throw BAD_STATE_ERROR'); cnt++; } equals(cnt, 1, 'should raise exception');
});
test(“Writing to an attribute in chained store sets correct status”, function() {
var chainedStore = store.chain() ; var chainedRecord = chainedStore.find(Foo, foo.get('id')); equals(chainedRecord.get('status'), SC.Record.READY_CLEAN, 'precon - status should be READY_CLEAN'); SC.RunLoop.begin(); chainedRecord.writeAttribute('foo', 'newValue'); SC.RunLoop.end(); //chainedRecord.set('foo', 'newValue'); equals(chainedRecord.get('status'), SC.Record.READY_DIRTY, 'status should be READY_DIRTY');
});
test(“Writing a new guid”, function(){
equals(foo.get('id'), 1, 'foo.id should be 1'); foo.set('guid', 2); equals(foo.get('id'), 2, 'foo.id should be 2');
});
test(“Writing primaryKey of 'id'”, function(){
var PrimaryKeyId = SC.Record.extend({ primaryKey: 'id' }); var foo2 = store.createRecord(PrimaryKeyId, { id: 1 }); equals(foo2.get('id'), 1, 'foo2.id should be 1'); foo2.set('id', 2); equals(foo2.get('id'), 2, 'foo2.id should be 2'); equals(store.idFor(foo2.get('storeKey')), 2, 'foo2.id should be 2 in the store');
});