Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

firestore-jest-mock

Package Overview
Dependencies
Maintainers
1
Versions
28
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

firestore-jest-mock

Jest helper for mocking Google Cloud Firestore

  • 0.1.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
16K
increased by30.43%
Maintainers
1
Weekly downloads
 
Created
Source

Mock Firestore

Jest Mock for testing Google Cloud Firestore

A simple way to mock calls to Cloud Firestore, allowing you to asser that you are requesting data correctly.

This is not a pseudo-database -- it is only for testing you are interfacing with firebase/firestore the way you expect.

Table of Contents

What's in the Box

This library provides an easy to use mocked version of firestore.

mockFirebase

The default method to use is mockFirebase, which returns a jest mock, overwriting firebase and firebase-admin. It accepts an object with two pieces:

  • database -- A mock of your collections
  • currentUser -- (optional) overwrites the currently logged in user

Example usage:

const { mockFirebase } = require('firestore-jest-mock');
// Create a fake firestore with a `users` and `posts` collection
mockFirebase({
  database: {
    users: [
      { id: 'abc123', name: 'Homer Simpson'}, 
      { id: 'abc456', name: 'Lisa Simpson' }
    ],
    posts: [
      { id: '123abc', title: 'Really cool title' }
    ]
  }
});

This will populate a fake database with a users and posts collection.

Now you can write queries or requests for data just as you would with firestore:

test('testing stuff', () => {
  const firebase = require('firebase'); // or import firebase from 'firebase';
  const db = firebase.firestore();
  
  db.collection('users').get().then((userDocs) => {
    // write assertions here
  });
});

What would you want to test?

The job of the this library is not to test firestore, but to allow you to test your code without hitting firebase. Take this example:

function maybeGetUsersInState(state) {
  const query = firestore.collection('users');
  
  if (state) {
    query = query.where('state', '==', state);
  }

  return query.get();
}

We have a conditional query here. If you pass state to this function, we will query against it; otherwise, we just get all of the users. So, you may want to write a test that ensures you are querying correctly:

const { mockFirebase } = require('firestore-jest-mock');

// Import the mock versions of the functions you expect to be called
const { mockCollection, mockWhere } = require('firestore-jest-mock/mocks/firestore');
describe('we can query', () => {
  mockFirebase({
    database: {
      users: [
        { id: 'abc123', name: 'Homer Simpson'}, 
        { id: 'abc456', name: 'Lisa Simpson' }
      ]
    }
  });

  test('query with state', async () => {
    await maybeGetUsersInState('alabama');

    // Assert that we call the correct firestore methods
    expect(mockCollection).toHaveBeenCalledWith('users');
    expect(mockWhere).toHaveBeenCalledWith('state', '==', 'alabama');
  });

  test('no state', async () => {
    await maybeGetUsersInState();

    // Assert that we call the correct firestore methods
    expect(mockCollection).toHaveBeenCalledWith('users');
    expect(mockWhere).not.toHaveBeenCalled();
  });
});

In this test, we don't necessarily care what gets returned from firestore (it's not our job to test firestore), but instead we try to assert that we built our query correctly.

If I pass a state to this function, does it properly query the users collection?

That's what we want to answer.

I wrote a where clause, but all the records were returned!

The where clause in the mocked firestore will not actually filter the data at all. We are not recreating firestore in this mock, just exposing an API that allows us to write assertions. It is also not the job of the developer (you) to test that firestore filtered the data appropriately. Your application doesn't double-check firestore's response -- it trusts that it's always correct!

Functions you can test

Firestore
MethodUseMethod in Firestore
mockCollectionAssert the correct collection is being queriedcollection
mockDocAssert the correct record is being fetched by id. Tells the mock you are fetching a single recorddoc
mockWhereAssert the correct query is written. Tells the mock you are fetching multiple recordswhere
mockBatchAssert batch was calledbatch
mockBatchDeleteAssert correct refs are passedbatch delete
mockBatchCommitAssert commit is called. Returns a promisebatch commit
mockGetAssert get is called. Returns a promise resolving either to a single doc or querySnapshotget
mockGetAllAssert correct refs are passed. Returns a promise resolving to array of docs.getAll
mockUpdateAssert correct params are passed to update. Returns a promiseupdate
mockAddAssert correct params are passed to add. Returns a promise resolving to the doc with new idadd
mockSetAssert correct params are passed to set. Returns a promiseset
mockDeleteAssert delete is called on ref. Returns a promisedelete
mockOrderByAssert correct field is passed to orderByorderBy
mockLimitAssert limit is set properlylimit
Auth
MethodUseMethod in Firebase
mockCreateUserWithEmailAndPasswordAssert correct email and password are passed. Returns a promisecreateUserWithEmailAndPassword
mockDeleteUserAssert correct id is passed to delete method. Returns a promisedeleteUser
mockSendVerificationEmailAssert request for verification email was sent. Lives on the currentUsersendVerificationEmail
mockSignInWithEmailAndPasswordAssert correct email and password were passed. Returns a promisesignInWithEmailAndPassword
mockSendPasswordResetEmailAssert correct email was passed.sendPasswordResetEmail
mockVerifyIdTokenAssert correct token is passed. Returns a promiseverifyIdToken

Installation

With npm:

$ npm install firestore-jest-mock --save-dev

With yarn:

$ yarn add firestore-jest-mock --dev

Contributing

We welcome all contributions to our projects! Filing bugs, feature requests, code changes, docs changes, or anything else you'd like to contribute are all more than welcome! More information about contributing can be found in the contributing guidelines.

Code of Conduct

Upstatement strives to provide a welcoming, inclusive environment for all users. To hold ourselves accountable to that mission, we have a strictly-enforced code of conduct.

About Upstatement

Upstatement is a digital transformation studio headquartered in Boston, MA that imagines and builds exceptional digital experiences. Make sure to check out our services, work, and open positions!

Keywords

FAQs

Package last updated on 01 Nov 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc