Cloud Firestore и Realtime Database полагаются на мощные, лаконичные языки правил, специально созданные для управления информационной безопасностью и контролем доступа. Однако, поскольку правила становятся длиннее и сложнее, вам может понадобиться помощь в отладке ошибок в их поведении.
Эмуляторы Firebase включают возможность генерировать отчеты о покрытии правил, так что вы можете точно увидеть, что оценивает каждое подвыражение при воспроизведении ошибки. Отчеты также предоставляют информацию о том, как часто каждый тестовый случай использовал правило, как и традиционные методы «покрытия строк».
Сформировать отчет
После запуска набора тестов вы можете получить доступ к отчетам о покрытии тестами, которые показывают, как оценивалось каждое из ваших правил безопасности.
Чтобы получить отчеты, запросите открытую конечную точку на эмуляторе во время его работы. Для версии, удобной для браузера, используйте следующий URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
Это разбивает ваши правила на выражения и подвыражения, на которые вы можете навести курсор для получения дополнительной информации, включая количество оценок и возвращаемых значений. Для необработанной версии JSON этих данных включите следующий URL в свой запрос:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Отладка примеров правил
Чтобы легко создать отчет о тестировании, используйте краткие руководства по эмулятору, доступные на GitHub для Cloud Firestore и Realtime Database . Эти краткие руководства помогут вам правильно установить и инициализировать эмуляторы, а затем сгенерировать примеры тестов из примерного набора правил.
Рассмотрим пример приложения, использующего Cloud Firestore , которое подсчитывает, сколько раз пользователи нажимают кнопку. Приложение использует следующие правила:
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
Для отладки ошибок в правилах, показанных выше, используйте следующий пример теста JavaScript:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
Эмулятор генерирует отчет, доступный по указанному выше URL-адресу:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
В отчете показаны следующие неопределенные и нулевые ошибки:
Проблема с этим конкретным примером заключается в том, что правила не различают создание документа и обновление документа. Следовательно, запись не допускается, если документ не существует, и документ не может быть создан, поскольку он не существует. Разделение «записи» на две более конкретные операции — «создание» и «обновление» — решает проблему.
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow create: if request.resource.data.value == 0; allow update: if request.resource.data.value == resource.data.value +1; } } }
Сгенерированный отчет показывает, как часто использовалось каждое правило и что было возвращено.