From ec9bd8f568216864d1aea0586855cdaee5467aef Mon Sep 17 00:00:00 2001 From: tchak Date: Thu, 16 Jul 2015 16:54:39 +0200 Subject: [PATCH] [BUGFIX release] Transition to loaded.saved state after rollback Closes #3499 #3498 --- .../ember-data/lib/system/model/states.js | 1 + .../unit/model/rollback-attributes-test.js | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/ember-data/lib/system/model/states.js b/packages/ember-data/lib/system/model/states.js index 85ecb542ac4..6906d18964d 100644 --- a/packages/ember-data/lib/system/model/states.js +++ b/packages/ember-data/lib/system/model/states.js @@ -342,6 +342,7 @@ var DirtyState = { rolledBack: function(internalModel) { internalModel.clearErrorMessages(); + internalModel.transitionTo('loaded.saved'); internalModel.triggerLater('ready'); }, diff --git a/packages/ember-data/tests/unit/model/rollback-attributes-test.js b/packages/ember-data/tests/unit/model/rollback-attributes-test.js index 6d6ddaf6640..440949182c9 100644 --- a/packages/ember-data/tests/unit/model/rollback-attributes-test.js +++ b/packages/ember-data/tests/unit/model/rollback-attributes-test.js @@ -110,7 +110,7 @@ test("a record's changes can be made if it fails to save", function() { }); test("a deleted record's attributes can be rollbacked if it fails to save, record arrays are updated accordingly", function() { - expect(7); + expect(8); env.adapter.deleteRecord = function(store, type, snapshot) { return Ember.RSVP.reject(); }; @@ -136,6 +136,7 @@ test("a deleted record's attributes can be rollbacked if it fails to save, recor }); equal(person.get('isDeleted'), false); equal(person.get('isError'), false); + equal(person.get('hasDirtyAttributes'), false, "must be not dirty"); }).then(function() { equal(people.get('length'), 1, "the underlying record array is updated accordingly in an asynchronous way"); }); @@ -264,6 +265,7 @@ test("invalid record's attributes can be rollbacked", function() { dog.save().then(null, async(function() { dog.rollbackAttributes(); + equal(dog.get('hasDirtyAttributes'), false, "must not be dirty"); equal(dog.get('name'), "Pluto"); ok(dog.get('isValid')); })); @@ -288,13 +290,14 @@ test("invalid record's attributes rolled back to correct state after set", funct completes without failure and the failure hits the failure route of the promise instead of crashing the save. */ Ember.run.next(function() { - reject(adapter.ajaxError({ name: 'is invalid' })); + reject(new DS.InvalidError([ + { + detail: 'is invalid', + source: { pointer: 'data/attributes/name' } + } + ])); }); }); - }, - - ajaxError: function(jqXHR) { - return new Error(jqXHR); } }); @@ -310,6 +313,8 @@ test("invalid record's attributes rolled back to correct state after set", funct dog.save().then(null, async(function() { equal(dog.get('name'), "is a dwarf planet"); equal(dog.get('breed'), "planet"); + ok(Ember.isPresent(dog.get('errors.name'))); + equal(dog.get('errors.name.length'), 1); run(function() { dog.set('name', 'Seymour Asses'); @@ -324,6 +329,8 @@ test("invalid record's attributes rolled back to correct state after set", funct equal(dog.get('name'), "Pluto"); equal(dog.get('breed'), "Disney"); + equal(dog.get('hasDirtyAttributes'), false, "must not be dirty"); + ok(Ember.isEmpty(dog.get('errors.name'))); ok(dog.get('isValid')); })); });