💽
Firestoreのセキュリティルールのテストを行う際に処理が終わらずタイムアウトする
Firestoreのセキュリティルールのテスト導入を行った際にトラブったメモです。
発生した問題
以下のようなテストを書いてみました。
test(
"作成できない",
async () => {
await assertFails(
addDoc(collection(db, "users"), {
displayName: "NewTestUser",
})
)
}
)
エミュレーターを起動してテストを実行してみると以下のように失敗しました。
addDoc
の処理が終わらなくてそのままタイムアウトしています。
> jest firebase/tests/rules/users.test.ts
FAIL firebase/tests/rules/users.test.ts (11.328 s)
users
ログインしてないとき
✕ 作成できない (5013 ms)
● users › ログインしてないとき › 作成できない
thrown: "Exceeded timeout of 5000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."
24 | })
25 |
> 26 | test("作成できない", async () => {
| ^
27 | await assertFails(
28 | addDoc(collection(db, "users"), {
29 | displayName: "NewTestUser",
解決方法
原因調査は難航したのですが、以下のサイトにある回答が参考になりました。
jest.config.js
のtestEnvironment: jsdom
になっているから失敗していました。
デフォルトのtestEnvironment: node
に変更すればタイムアウトしなくなります。
修正例
ReactやNextJSと共通の環境でテストをしているときは、実行コマンドを分けることで別のConfigを使うのがいいでしょう。
構成は
├── firebase
│ ├── data
│ ├── tests
│ │ ├── helpers
│ │ └── rules
│ ├── .firebaserc
│ ├── firebase.json
│ └── firestore.rules
├── public
└── src
├── pages
│ └── api
├── styles
└── test
└── pages
のような感じだとします。
NextJS用のテストConfig
jest.config.js
module.exports = {
roots: ["<rootDir>"],
testMatch: ["**/*.+(spec|test).+(ts|tsx|js)"],
testPathIgnorePatterns: ["<rootDir>/firebase/"],
transform: {
"^.+\\.(ts|tsx)$": "ts-jest",
},
moduleDirectories: ["node_modules"],
testEnvironment: "jsdom",
}
Firestoreのセキュリティルール用のテストConfig
jest.config.firebase.js
module.exports = {
roots: ["<rootDir>"],
testMatch: ["<rootDir>/firebase/**/*.+(spec|test).+(ts|tsx|js)"],
transform: {
"^.+\\.(ts|tsx)$": "ts-jest",
},
moduleDirectories: ["node_modules"],
testEnvironment: "node",
}
それぞれの実行コマンド
package.json
"scripts": {
"test": "jest",
"test_firebase": "jest --config jest.config.firebase.js"
},
Discussion