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>
Примеры правил отладки
Чтобы легко создать отчет о тестировании, воспользуйтесь краткими руководствами по эмулятору Cloud Firestore и Realtime Database доступными на GitHub. Эти краткие руководства помогут вам правильно установить и инициализировать эмуляторы, а затем создать примеры тестов на основе набора правил.
Рассмотрим пример приложения, использующего 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; } } }
Сгенерированный отчет показывает, как часто использовалось каждое правило и что было возвращено.