Skip to content

Commit 11f67c5

Browse files
authored
Merge pull request soumak77#107 from ilearnio/firestore/batch-queue
Flush batch only after "commit" is called
2 parents 24cacd6 + ce12bf5 commit 11f67c5

File tree

2 files changed

+58
-10
lines changed

2 files changed

+58
-10
lines changed

src/firestore.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,31 +69,51 @@ MockFirestore.prototype.runTransaction = function(transFunc) {
6969
});
7070
};
7171

72+
var processBatchQueue = function (queue) {
73+
_.forEach(queue, function (queueItem) {
74+
var method = queueItem.method;
75+
var doc = queueItem.args[0];
76+
var data = queueItem.args[1];
77+
var opts = queueItem.args[2];
78+
79+
if (method === 'set') {
80+
if (opts && opts.merge === true) {
81+
doc._update(data, { setMerge: true });
82+
} else {
83+
doc.set(data);
84+
}
85+
} else if (method === 'create') {
86+
doc.create(data);
87+
} else if (method === 'update') {
88+
doc.update(data);
89+
} else if (method === 'delete') {
90+
doc.delete();
91+
}
92+
});
93+
};
94+
7295
MockFirestore.prototype.batch = function () {
7396
var self = this;
97+
var queue = [];
7498
var batch = {
7599
set: function(doc, data, opts) {
76-
var _opts = _.assign({}, { merge: false }, opts);
77-
if (_opts.merge) {
78-
doc._update(data, { setMerge: true });
79-
}
80-
else {
81-
doc.set(data);
82-
}
100+
queue.push({ method: 'set', args: [doc, data, opts] });
83101
return batch;
84102
},
85103
create: function(doc, data) {
86-
doc.create(data);
104+
queue.push({ method: 'create', args: [doc, data] });
105+
return batch;
87106
},
88107
update: function(doc, data) {
89-
doc.update(data);
108+
queue.push({ method: 'update', args: [doc, data] });
90109
return batch;
91110
},
92111
delete: function(doc) {
93-
doc.delete();
112+
queue.push({ method: 'delete', args: [doc] });
94113
return batch;
95114
},
96115
commit: function() {
116+
processBatchQueue(queue);
97117
if (self.queue.events.length > 0) {
98118
self.flush();
99119
}

test/unit/firestore.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,5 +219,33 @@ describe('MockFirestore', function () {
219219

220220
return awaitChecks;
221221
});
222+
223+
context('when "batch.commit" is not called', function () {
224+
afterEach(function () {
225+
db.doc('col/batch-foo').delete();
226+
db.doc('col/batch-bar').delete();
227+
db.flush();
228+
});
229+
230+
it('does not create documents', function (done) {
231+
var batch = db.batch();
232+
batch.set(db.doc('col/batch-foo'), { foo: 'fooo' });
233+
batch.set(db.doc('col/batch-bar'), { bar: 'barr' });
234+
235+
expect(function () { db.flush(); }).to.throw('No deferred tasks to be flushed');
236+
237+
var promises = [
238+
db.doc('col/batch-foo').get(),
239+
db.doc('col/batch-bar').get()
240+
];
241+
db.flush();
242+
243+
Promise.all(promises).then(function (docs) {
244+
expect(docs[0].exists).to.eq(false);
245+
expect(docs[1].exists).to.eq(false);
246+
done();
247+
});
248+
});
249+
});
222250
});
223251
});

0 commit comments

Comments
 (0)