TDD in Cloud Functions for Firebase using rescue-fire
Tags: firebase, cloudfunctions, typscript, javascript
Published: 2018-02-11 14:45:25

---
title: TDD in Cloud Functions for Firebase using rescue-fire
published: true
description: TDD in Cloud Functions for Firebase using rescue-fire
tags: #firebase #cloudfunctions #typscript #javascript
---

The deployment of Cloud Functions is very slow. Deployment is normally completed in 30 seconds, but it sometimes take more than 10 minutes.
It is a waste of time to wait a few minutes just by rewriting one line.

[Cloud Functions Emulator](https://firebase.google.com/docs/functions/local-emulator) is very useful. However, it is hard to create the test data json, and it is not possible to write tests.

Let's emulate functions locally with [rescue\-fire](https://github.com/starhoshi/rescue-fire) and do TDD.

![logo\.png \(733×207\)](https://raw.githubusercontent.com/starhoshi/rescue-fire/master/docs/logo.png)

# How to

Cloud Functions starts with a variable called `event`.

```ts
exports.updateUser = functions.firestore.document('users/{userId}')
  .onCreate(event => {
    console.log('old name', event.data.data().name)
    return event.data.ref.update({name: 'new name'})
})
```

If you can create this `event`, you can use [Admin SDK](https://firebase.google.com/docs/admin/setup) to run almost the same code as Cloud Functions.
[rescue\-fire](https://github.com/starhoshi/rescue-fire) makes this `event`.

## 1. Installation

```
npm install rescue-fire --only=dev
yarn add --dev rescue-fire
```

## 2. Prepare Google Cloud Account Credentials

Download the service account key json file.

[https://firebase.google.com/docs/admin/setup?authuser=0#add_firebase_to_your_app](https://firebase.google.com/docs/admin/setup?authuser=0#add_firebase_to_your_app)

This json file is sensitive, be careful.

> Important: This file contains sensitive information, including your service account's private encryption key. Keep it confidential and never store it in a public repository.

## 3. Install testing library

Please use your favorite testing library.

For example, in the case of [Jest](https://facebook.github.io/jest/):

```
npm install jest --only=dev
yarn add --dev jest
```

### 4. Write a test

Let's create a function to update name when user is created. The code of the function is as follows.

This sample is written in TypeScript.

```ts
const changeName = (event: functions.Event<DeltaDocumentSnapshot>) => {
  console.log('old name', event.data.data().name)
  return event.data.ref.update({ name: 'new name' })
}
```

The test will be like this.

```ts
import 'jest'
import * as admin from 'firebase-admin'
import * as functions from 'firebase-functions'
import * as Rescue from 'rescue-fire'

// Set up to run firebase in local.
beforeAll(() => {
  const serviceAccount = require('./your-firebase-adminsdk.json')
  admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
  })
})

test('update name', async () => {
  // prepare
  const data = {name: 'name'}
  const user = await admin.firestore().collection('user').add(data)
  const event = Rescue.event(user, data)

  // start Cloud Functions
  await changeName(event)

  // expect name changed
  const updatedUser = await admin.firestore().collection('user').doc(user.id).get()
  expect(updatedUser.data()!.name).toBe('new name')
})
```

Cloud Functions can be developed with TDD. (strictly not TDD 🙃)

This is a small function, but  [orderable.test.ts](https://github.com/starhoshi/orderable.ts/blob/master/orderable/src/__tests__/orderable.test.ts) is testing huge functions with rescue-fire.

Optional Parameters defenitions is [here](https://github.com/starhoshi/rescue-fire/blob/master/src/index.ts#L18).


### 4. Finally, create Functions

```ts
exports.updateUser = functions.firestore
  .document('users/{userId}')
  .onCreate(event => {
    return changeName(event)
})
```

🎉

## Notes

The event created by rescue-fire is not complete. I think that it is enough to write tests, but keep in mind that it is different from the actual event.

Please use [starhoshi/rescue\-fire: A test helper for Cloud Functions\.](https://github.com/starhoshi/rescue-fire)!