Generowanie raportów z testów

Cloud Firestore i Realtime Database korzystają z zaawansowanych, zwięzłych języków reguł które zostały stworzone specjalnie do zarządzania bezpieczeństwem informacji i kontrolą dostępu. Jednak w przypadku dłuższych i bardziej złożonych reguł możesz potrzebować pomocy w debugowaniu błędów w ich działaniu.

Emulatory Firebase umożliwiają generowanie raportów o pokryciu reguł, dzięki czemu możesz dokładnie sprawdzić, do czego została zredukowana każda podwyrażenie podczas odtwarzania błędu. Raporty zawierają też informacje o tym, jak często każdy przypadek testowy używał reguły, podobnie jak w przypadku tradycyjnych technik „pokrycia kodu”.

Wygeneruj raport

Po uruchomieniu pakietu testów możesz uzyskać dostęp do raportów o pokryciu testów, które pokazują, jak oceniana była każda z Twoich reguł bezpieczeństwa.

Aby uzyskać raporty, wyślij zapytanie do udostępnionego punktu końcowego w emulatorze podczas jego działania. Aby uzyskać wersję przyjazną dla przeglądarki, użyj tego adresu URL:

Cloud Firestore

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
 

Realtime Database

http://localhost:9000/.inspect/coverage?ns=<database_name>
 

Reguły są dzielone na wyrażenia i podwyrażenia, nad którymi możesz najechać kursorem, aby uzyskać więcej informacji, w tym liczbę ocen i zwrócone wartości. Aby uzyskać wersję tych danych w formacie JSON, dodaj do zapytania ten adres URL:

Cloud Firestore

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
 

Realtime Database

http://localhost:9000/.inspect/coverage.json?ns=<database_name>
 

Przykłady debugowania reguł

Aby łatwo wygenerować raport z testu, użyj szybkich przewodników po emulatorze dostępnych na GitHubie w przypadku Cloud Firestore i Realtime Database. Te szybkie przewodniki przeprowadzą Cię przez proces prawidłowej instalacji i inicjowania emulatorów, a następnie wygenerowania przykładowych testów na podstawie przykładowego zestawu reguł.

Rozważmy przykładową aplikację korzystającą z Cloud Firestore, która zlicza, ile razy użytkownicy klikną przycisk. Aplikacja korzysta z tych reguł:

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;
     }
   }
 }
 

Aby debugować błędy w regułach pokazanych powyżej, użyj tego przykładowego testu w JavaScript:

const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));

Emulator generuje raport dostępny pod adresem URL podanym powyżej:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

Raport zawiera te błędy wartości niezdefiniowanych i null:

Problem z tym konkretnym przykładem polega na tym, że reguły nie rozróżniają tworzenia dokumentu od jego aktualizowania. W związku z tym zapis nie jest dozwolony, jeśli dokument nie istnieje, a dokumentu nie można utworzyć, ponieważ nie istnieje. Rozróżnienie „zapisu” na 2 bardziej szczegółowe operacje – „utwórz” i „zaktualizuj” – rozwiązuje ten problem.

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;
     }
   }
 }
 

Wygenerowany raport pokazuje, jak często używana była każda reguła i co zostało zwrócone.