Tutorial: Mocking Firestore Functions

firebase-functions does not provide a firestore equivalent to functions.database.DeltaSnapshot. Therefore you will need to use the provided firebasemock.DeltaDocumentSnapshot method from this library in order to mock firestore cloud events. The method signature is shown below:

DeltaDocumentSnapshot(adminApp: firebase.app.App, data: any, delta: any, path: string);

Source Code

// triggers.js
var admin = require('firebase-admin');

function create(event) {
  console.log(event.params.uid);
}

function update(event) {
  console.log(event.params.uid);
}

function remove(event) {
  console.log(event.params.uid);
}

module.exports = {
  create: create,
  update: update,
  remove: remove
}
// index.js
var functions = require('firebase-functions');
var triggers = require('./triggers');

functions.firestore.document('users/{uid}').onCreate(triggers.create);
functions.firestore.document('users/{uid}').onUpdate(triggers.update);
functions.firestore.document('users/{uid}').onDelete(triggers.remove);

Test Code

var proxyquire      = require('proxyquire');
var sinon           = require('sinon');
var expect          = require('chai').use(require('sinon-chai')).expect;
var firebasemock    = require('firebase-mock');
var mockauth        = new firebasemock.MockFirebase();
var mockfirestore   = new firebasemock.MockFirestore();
var mocksdk         = firebasemock.MockFirebaseSdk(null, function() {
  return mockauth;
}, function() {
  return mockfirestore;
});
var mockapp = mocksdk.initializeApp();

var triggers = proxyquire('./triggers', {
  'firebase-admin': mocksdk
});

describe('Firestore Function', function () {
  beforeEach(function() {
    mockfirestore = new firebasemock.MockFirestore();
    mockfirestore.autoFlush();
    mockauth = new firebasemock.MockFirebase();
    mockauth.autoFlush();
  });

  var uid = '123';

  it('create', function() {
    var event = {
      data: new firebasemock.DeltaDocumentSnapshot(mockapp, null, {
        name: 'bob',
        createdTime: new Date()
      }, 'users/' + uid),
      params: {
        uid: uid
      }
    };

    expect(event.data.get('name')).to.equal('bob');
    expect(event.params.uid).to.equal(uid);

    triggers.create(event);
  });

  it('update', function() {
    var event = {
      data: new firebasemock.DeltaDocumentSnapshot(mockapp, {
        name: 'bob',
        createdTime: new Date()
      }, {
        name: 'bobby'
      }, 'users/' + uid),
      params: {
        uid: uid
      }
    };

    expect(event.data.previous.get('name')).to.equal('bob');
    expect(event.data.get('name')).to.equal('bobby');
    expect(event.params.uid).to.equal(uid);

    triggers.update(event);
  });

  it('delete', function() {
    var event = {
      data: new firebasemock.DeltaDocumentSnapshot(mockapp, {
        name: 'bob',
        createdTime: new Date()
      }, null, 'users/' + uid),
      params: {
        uid: uid
      }
    };

    expect(event.data.previous.get('name')).to.equal('bob');
    expect(event.params.uid).to.equal(uid);

    triggers.remove(event);
  });
});