How to use nock in order to mock Firebase/Firestore in NodeJS?

367 Views Asked by At

I have a REST API which written in NodeJS. The REST API gets a file and information and then uploads the file to the drive and stores the information inside my Firebase/Firestore DB. I'm trying to write tests in order to test my REST API, so I need to mock Firestore. I already mock the google-drive using nock by tracking the HTTPS requests that are made by googleapis. Now I'm trying to do the same thing with Firestore.

I tried different methods like, for example, for authentication I tried (based on the docs):

nock('https://firestore.googleapis.com/$discovery/rest')
.persist()
.post('')
.reply(200, { 'access_token': 'abc', 'refresh_token': '123', 'expires_in': 10 })

But nock does not follow the requests. How do I use nock to track the following code? Does firebase package actually makes requests to the API?

const firebase = require("firebase");

// Required for side-effects
require("firebase/firestore");

// First code - authenatiocation
firebase.initializeApp(firebaseConfig);
db = firebase.firestore();

// ...
// Second code - Get data from DB
const snapshot = await db.collection(collection).orderBy("timestamp", "desc").get();

// ...
// Third code - upload new report
const response = await db.collection(collection).doc(document_id).set(data);

If it's not possible with nock, then it can be achieved?

1

There are 1 best solutions below

0
On

It could be argued that stubbing the Firebase methods would make more sense than mocking any API calls the library might internally make. The latter assumes knowledge about the internal functioning of the library and doesn't make full use of the benefits of abstraction.

You could use sinon to stub Firebase methods. Something like,

db = firebase.firestore();

const stub = sinon.stub(db, 'collection')
  .returns({
    orderBy: sinon.stub().returns({
      get: sinon.stub().returns(yourDocObjectHere)
    }),
    doc: sinon.stub().returns({
      set: sinon.stub().returns(someObjectHere)
    })    
  })

and then assert like

sinon.assert.calledWith(db.collection.orderBy, 'timestamp', 'desc');