Fix dirtyKeys() and dirty(key:) on beforeSave when updating objects.

This commit is contained in:
Nikita Lutsenko
2016-02-23 18:01:54 -08:00
parent 531e2ffea8
commit 14cc82a057
2 changed files with 52 additions and 6 deletions

View File

@@ -429,6 +429,47 @@ describe('miscellaneous', function() {
});
});
it('test beforeSave get dirtyKeys on update', function(done) {
var triggerTime = 0;
// Register a mock beforeSave hook
Parse.Cloud.beforeSave('GameScore', function(req, res) {
var object = req.object;
expect(object instanceof Parse.Object).toBeTruthy();
expect(object.get('fooAgain')).toEqual('barAgain');
if (triggerTime == 0) {
// Create
expect(object.get('foo')).toEqual('bar');
} else if (triggerTime == 1) {
// Update
expect(object.dirtyKeys()).toEqual(['foo']);
expect(object.dirty('foo')).toBeTruthy();
expect(object.get('foo')).toEqual('baz');
} else {
res.error();
}
triggerTime++;
res.success();
});
var obj = new Parse.Object('GameScore');
obj.set('foo', 'bar');
obj.set('fooAgain', 'barAgain');
obj.save().then(function() {
// We only update foo
obj.set('foo', 'baz');
return obj.save();
}).then(function() {
// Make sure the checking has been triggered
expect(triggerTime).toBe(2);
// Clear mock beforeSave
delete Parse.Cloud.Triggers.beforeSave.GameScore;
done();
}, function(error) {
fail(error);
done();
});
});
it('test afterSave get full object on create and update', function(done) {
var triggerTime = 0;
// Register a mock beforeSave hook

View File

@@ -116,18 +116,23 @@ RestWrite.prototype.runBeforeTrigger = function() {
if (this.query && this.query.objectId) {
extraData.objectId = this.query.objectId;
}
// Build the inflated object, for a create write, originalData is empty
var inflatedObject = triggers.inflate(extraData, this.originalData);;
inflatedObject._finishFetch(this.data);
// Build the original object, we only do this for a update write
var originalObject;
let originalObject = null;
let updatedObject = null;
if (this.query && this.query.objectId) {
// This is an update for existing object.
originalObject = triggers.inflate(extraData, this.originalData);
updatedObject = triggers.inflate(extraData, this.originalData);
updatedObject.set(Parse._decode(undefined, this.data));
} else {
// This is create of an object, so no original object exists.
// TODO: (nlutsenko) Use the same flow as for creation, when _Session triggers support is removed.
updatedObject = triggers.inflate(extraData, this.data);
}
return Promise.resolve().then(() => {
return triggers.maybeRunTrigger(
'beforeSave', this.auth, inflatedObject, originalObject);
'beforeSave', this.auth, updatedObject, originalObject);
}).then((response) => {
if (response && response.object) {
this.data = response.object;