Skip to content

Commit 77cbb3a

Browse files
fix method ordering & system test
1 parent d89627c commit 77cbb3a

3 files changed

Lines changed: 49 additions & 41 deletions

File tree

lib/datastore/transaction.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,11 @@ Transaction.prototype.commit_ = function(callback) {
376376
}
377377
})
378378

379-
// Group entities together by action (delete or save).
379+
// Group entities together by method: `save` mutations, then `delete`. Note:
380+
// `save` mutations being first is required to maintain order when assigning
381+
// IDs to incomplete keys.
380382
.sort(function(a, b) {
381-
return a.method > b.method ? 1 : a.method < b.method ? -1 : 0;
383+
return a.method < b.method ? 1 : a.method > b.method ? -1 : 0;
382384
})
383385

384386
// Group arguments together so that we only make one call to each method.

system-test/datastore.js

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -690,48 +690,52 @@ describe('Datastore', function() {
690690
var key = datastore.key(['Company', 'Google']);
691691
var incompleteKey = datastore.key('Company');
692692

693-
datastore.runInTransaction(function(t, tDone) {
694-
t.delete(deleteKey);
695-
696-
t.save([
697-
{
698-
key: key,
699-
data: { rating: 10 }
700-
},
701-
{
702-
key: incompleteKey,
703-
data: { rating: 100 }
704-
}
705-
]);
706-
707-
tDone();
693+
datastore.save({
694+
key: deleteKey,
695+
data: {}
708696
}, function(err) {
709697
assert.ifError(err);
710698

711-
// Incomplete key should have been given an ID.
712-
assert.strictEqual(incompleteKey.path.length, 2);
713-
714-
async.parallel([
715-
// The key queued for deletion should have been deleted.
716-
function(done) {
717-
datastore.get(deleteKey, function(err, entity) {
718-
assert.ifError(err);
719-
assert.strictEqual(typeof entity, 'undefined');
720-
done();
721-
});
722-
},
699+
datastore.runInTransaction(function(t, tDone) {
700+
t.delete(deleteKey);
701+
702+
t.save([
703+
{
704+
key: key,
705+
data: { rating: 10 }
706+
},
707+
{
708+
key: incompleteKey,
709+
data: { rating: 100 }
710+
}
711+
]);
723712

724-
// Data should have been updated on the key.
725-
function(done) {
726-
datastore.get(key, function(err, entity) {
727-
assert.ifError(err);
728-
assert.strictEqual(entity.data.rating, 10);
729-
done();
730-
});
731-
}
732-
], function(err) {
713+
tDone();
714+
}, function(err) {
733715
assert.ifError(err);
734-
datastore.delete([key, incompleteKey], done);
716+
717+
// Incomplete key should have been given an ID.
718+
assert.strictEqual(incompleteKey.path.length, 2);
719+
720+
async.parallel([
721+
// The key queued for deletion should have been deleted.
722+
function(callback) {
723+
datastore.get(deleteKey, function(err, entity) {
724+
assert.ifError(err);
725+
assert.strictEqual(typeof entity, 'undefined');
726+
callback();
727+
});
728+
},
729+
730+
// Data should have been updated on the key.
731+
function(callback) {
732+
datastore.get(key, function(err, entity) {
733+
assert.ifError(err);
734+
assert.strictEqual(entity.data.rating, 10);
735+
callback();
736+
});
737+
}
738+
], done);
735739
});
736740
});
737741
});

test/datastore/transaction.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,11 @@ describe('Transaction', function() {
333333
assert.equal(saveCalled, 1);
334334

335335
assert.equal(args.length, 2);
336+
337+
// Save arguments must come first.
336338
assert.deepEqual(args, [
337-
[deleteArg1, deleteArg2],
338-
[saveArg1, saveArg2]
339+
[saveArg1, saveArg2],
340+
[deleteArg1, deleteArg2]
339341
]);
340342
});
341343

0 commit comments

Comments
 (0)