Skip to content

Commit d7b3d52

Browse files
authored
Merge pull request soumak77#104 from ilearnio/firestore/DocumentReference/getCollections
Add DocumentReference.prototype.getCollections
2 parents 10be2b8 + 19c14b6 commit d7b3d52

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

src/firestore-document.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,29 @@ MockFirestoreDocument.prototype.delete = function (callback) {
199199
});
200200
};
201201

202+
/**
203+
* Fetches the subcollections that are direct children of the document.
204+
* @see https://cloud.google.com/nodejs/docs/reference/firestore/0.15.x/DocumentReference#getCollections
205+
*/
206+
MockFirestoreDocument.prototype.getCollections = function () {
207+
var err = this._nextErr('getCollections');
208+
var self = this;
209+
return new Promise(function (resolve, reject) {
210+
self._defer('getCollections', _.toArray(arguments), function () {
211+
if (err === null) {
212+
var collections = _.toArray(this.children);
213+
// Filter out empty collections
214+
collections = _.filter(collections, function (collection) {
215+
return !_.isEmpty(collection.data);
216+
});
217+
resolve(collections);
218+
} else {
219+
reject(err);
220+
}
221+
});
222+
});
223+
};
224+
202225
MockFirestoreDocument.prototype._hasChild = function (key) {
203226
return _.isObject(this.data) && _.has(this.data, key);
204227
};

test/unit/firestore-document.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,4 +396,71 @@ describe('MockFirestoreDocument', function () {
396396
expect(result).to.eventually.equal(null);
397397
});
398398
});
399+
400+
describe('#getCollections', function () {
401+
beforeEach(function () {
402+
db.doc('doc/subcol/subcol-doc').set({ foo: 'bar' });
403+
db.doc('doc/subcol2/subcol-doc').set({ foo: 'bar' });
404+
db.doc('doc/subcol/subcol-doc/deep-col/deep-doc').set({ foo: 'bar' });
405+
db.doc('doc/subcol/subcol-doc/deep-col2/deep-doc').set({ foo: 'bar' });
406+
db.flush();
407+
});
408+
afterEach(function () {
409+
db.doc('doc/subcol/subcol-doc').delete();
410+
db.doc('doc/subcol2/subcol-doc').delete();
411+
db.doc('doc/subcol/subcol-doc/deep-col/deep-doc').delete();
412+
db.doc('doc/subcol/subcol-doc/deep-col2/deep-doc').delete();
413+
db.flush();
414+
});
415+
416+
context('when present', function () {
417+
it('returns collections of document', function (done) {
418+
db.doc('doc').getCollections().then(function (colRefs) {
419+
expect(colRefs).to.be.an('array');
420+
expect(colRefs).to.have.length(2);
421+
expect(colRefs[0].path).to.equal('doc/subcol');
422+
expect(colRefs[1].path).to.equal('doc/subcol2');
423+
done();
424+
});
425+
db.flush();
426+
});
427+
428+
it('returns deeply nested collections of document', function (done) {
429+
db.doc('doc/subcol/subcol-doc').getCollections().then(function (colRefs) {
430+
expect(colRefs).to.be.an('array');
431+
expect(colRefs).to.have.length(2);
432+
expect(colRefs[0].path).to.equal('doc/subcol/subcol-doc/deep-col');
433+
expect(colRefs[1].path).to.equal('doc/subcol/subcol-doc/deep-col2');
434+
done();
435+
});
436+
db.flush();
437+
});
438+
});
439+
440+
context('when not present', function () {
441+
it('returns empty list of collections', function (done) {
442+
db.doc('not-existing').getCollections().then(function (colRefs) {
443+
expect(colRefs).to.be.an('array');
444+
expect(colRefs).to.have.length(0);
445+
done();
446+
});
447+
db.flush();
448+
});
449+
450+
it('skips collections that has no documents', function (done) {
451+
db.doc('doc/subcol/subcol-doc').delete();
452+
db.doc('doc/subcol2/subcol-doc').delete();
453+
db.doc('doc/subcol/subcol-doc/deep-col/deep-doc').delete();
454+
db.doc('doc/subcol/subcol-doc/deep-col2/deep-doc').delete();
455+
db.flush();
456+
457+
db.doc('doc').getCollections().then(function (colRefs) {
458+
expect(colRefs).to.be.an('array');
459+
expect(colRefs).to.have.length(0);
460+
done();
461+
});
462+
db.flush();
463+
});
464+
});
465+
});
399466
});

0 commit comments

Comments
 (0)