diff --git a/packages/ember-data/lib/system/model/internal-model.js b/packages/ember-data/lib/system/model/internal-model.js index ab31ff2032f..b10e0f3e38e 100644 --- a/packages/ember-data/lib/system/model/internal-model.js +++ b/packages/ember-data/lib/system/model/internal-model.js @@ -644,6 +644,8 @@ InternalModel.prototype = { } } + this.send('becameInvalid'); + this._saveWasRejected(); }, diff --git a/packages/ember-data/lib/system/model/states.js b/packages/ember-data/lib/system/model/states.js index 9f24dae5812..732f14b1101 100644 --- a/packages/ember-data/lib/system/model/states.js +++ b/packages/ember-data/lib/system/model/states.js @@ -326,8 +326,8 @@ var DirtyState = { didSetProperty(internalModel, context); }, + becameInvalid: Ember.K, becomeDirty: Ember.K, - pushedData: Ember.K, willCommit: function(internalModel) { @@ -702,8 +702,9 @@ var RootState = { didSetProperty(internalModel, context); }, - deleteRecord: Ember.K, + becameInvalid: Ember.K, becomeDirty: Ember.K, + deleteRecord: Ember.K, willCommit: Ember.K, diff --git a/packages/ember-data/tests/integration/records/save-test.js b/packages/ember-data/tests/integration/records/save-test.js index 10fc17fbd50..46bab32edf5 100644 --- a/packages/ember-data/tests/integration/records/save-test.js +++ b/packages/ember-data/tests/integration/records/save-test.js @@ -87,7 +87,7 @@ test("Retry is allowed in a failure handler", function() { }); test("Repeated failed saves keeps the record in uncommited state", function() { - expect(2); + expect(4); var post; run(function() { @@ -100,15 +100,72 @@ test("Repeated failed saves keeps the record in uncommited state", function() { run(function() { post.save().then(null, function() { + ok(post.get('isError')); equal(post.get('currentState.stateName'), 'root.loaded.created.uncommitted'); post.save().then(null, function() { + ok(post.get('isError')); equal(post.get('currentState.stateName'), 'root.loaded.created.uncommitted'); }); }); }); }); +test("Repeated failed saves with invalid error marks the record as invalid", function() { + expect(2); + var post; + + run(function() { + post = env.store.createRecord('post', { title: 'toto' }); + }); + + env.adapter.createRecord = function(store, type, snapshot) { + var error = new DS.InvalidError([ + { + detail: 'is invalid', + source: { pointer: 'data/attributes/title' } + } + ]); + + return Ember.RSVP.reject(error); + }; + + run(function() { + post.save().then(null, function() { + equal(post.get('isValid'), false); + + post.save().then(null, function() { + equal(post.get('isValid'), false); + }); + }); + }); +}); + +test("Repeated failed saves with invalid error without payload marks the record as invalid", function() { + expect(2); + var post; + + run(function() { + post = env.store.createRecord('post', { title: 'toto' }); + }); + + env.adapter.createRecord = function(store, type, snapshot) { + var error = new DS.InvalidError(); + + return Ember.RSVP.reject(error); + }; + + run(function() { + post.save().then(null, function() { + equal(post.get('isValid'), false); + + post.save().then(null, function() { + equal(post.get('isValid'), false); + }); + }); + }); +}); + test("Will reject save on invalid", function() { expect(1); var post;