JestでFirestoreセキュリティルールのテストを書く

公開日時

先日の記事でセキュリティルールのtestについて学んだので、個人プロジェクトで実践することにした。

YouTube動画ではmochaを使っていたが、今回はJestでテストを書くことにした。

firebase emulators:exec --only firestore "yarn test"

FIRESTORE INTERNAL ASSERTION FAILEDエラー

上記を実行したところ↓のエラーが発生した。

FIRESTORE INTERNAL ASSERTION FAILED: Unexpected state

node.js - 'FIRESTORE INTERNAL ASSERTION FAILED: Unexpected state' when unit testing with Jest - Stack Overflow

上記の記事を参考に jest.config.jstestEnvironment を変更したところエラーはでなくなった。

// testEnvironment: 'jsdom',
testEnvironment: 'node',

テスト実行が終了しない

エラーが解消したので再度テストを実行したところ、テストが完了してもコマンドが終了しない減少が起きた。

This usually means that there are asynchronous operations that weren't stopped in your tests.
Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.

ターミナルに上記のメッセージが表示されていたので --detectOpenHandles を付与してテストを再実行したものの何も検知できず。

firebase.appの終了処理をやる必要がありそうだなと思い、ドキュメントを読み直していたところ↓を見つけた。

apps() => [FirebaseApp]。このメソッドは、現在初期化されているテストと管理アプリをすべて返します。テスト間またはテスト後にアプリを消去するには、このメソッドを次のように使用します。

Promise.all(firebase.apps().map(app => app.delete()))

ということで、 afterAll でテスト後にFirebaseAppを消去するようにしたところ、正しくテストが終了できるようになった。

afterAll(async () => {
  await firebase.clearFirestoreData({ projectId: MY_PROJECT_ID })

  firebase.apps().map((app) => app.delete())
})

Github Actions

最後にGithub Actionsを使ってpushの度にテストが実行されるようにしておく。

    steps:
      - uses: actions/checkout@v2
      - run: yarn
      - run: yarn run firebase emulators:exec --only firestore "yarn test"

これで安心してFirestoreを使ったサービスの開発ができるようになった。

CIでのテスト実行については↓のYouTube動画も参考になる。

参考


Related #firebase

YouTubeの「Firebase Release Notes」プレイリスト

最新のアップデートの概要を把握するのにちょうど良い

Firebase Extensions

Functionsを実装する際の参考になる

Nuxt.jsのservice workerで環境変数を切り替えられるようにする

設定情報をハードコードしたくなかったので、ビルド時にnodeコマンドでファイル生成を行い環境変数を切り替えられるように対応した。