Générer des rapports de test

Cloud Firestore et Realtime Database reposent tous deux sur des langages de règles puissants et concis conçus spécifiquement pour régir la sécurité des informations et le contrôle des accès. Toutefois, à mesure que les règles deviennent plus longues et plus complexes, vous aurez peut-être besoin d'aide pour déboguer les erreurs dans leur comportement.

Les émulateurs Firebase permettent de générer des rapports sur la couverture des règles. permet de voir exactement ce à quoi chaque sous-expression est évaluée lorsque vous la reproduisez. une erreur. Les rapports fournissent également des informations sur la fréquence à laquelle chaque scénario de test a utilisé une règle, comme les techniques traditionnelles de "couverture de ligne".

Générer un rapport

Après avoir exécuté une suite de tests, vous pouvez accéder à des rapports sur la couverture des tests qui montrent comment chacune de vos règles de sécurité a été évaluée.

Pour obtenir les rapports, interrogez un point de terminaison exposé sur l'émulateur pendant son exécution. Pour une version adaptée aux navigateurs, utilisez l'URL suivante :

Cloud Firestore

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

Realtime Database

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

Cette opération casse vos règles en expressions et sous-expressions que vous pouvez survoler avec la souris pour obtenir plus d'informations, y compris le nombre d'évaluations et les valeurs renvoyées. Pour la version JSON brute de ces données, incluez l'URL suivante dans votre requête :

Cloud Firestore

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

Realtime Database

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

Déboguer les exemples de règles

Pour générer facilement un rapport de test, utilisez les guides de démarrage rapide de l'émulateur disponibles sur GitHub pour Cloud Firestore et Realtime Database. Ces guides de démarrage rapide vous guident pour installer correctement et initialiser les émulateurs, puis générer des exemples de tests à partir d'un exemple d'un ensemble de règles.

Prenons l'exemple d'une application utilisant Cloud Firestore qui comptabilise le nombre de fois où les utilisateurs cliquent sur un bouton. L'application applique les règles suivantes:

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

Pour déboguer les erreurs des règles présentées ci-dessus, utilisez l'exemple de test JavaScript suivant :

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

L'émulateur génère un rapport disponible à l'URL indiquée ci-dessus:

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

Le rapport affiche les erreurs suivantes, qu'elles soient non définies ou avec des valeurs nulles:

Le problème avec cet exemple spécifique est que les règles ne font pas la différence entre la création du document et sa mise à jour. Par conséquent, l'écriture n'est pas autorisée si le document n'existe pas et que le document ne peut pas être créé parce qu'il n'existe pas. La différenciation de l'écriture en deux opérations plus spécifiques (création et mise à jour) résout le problème.

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

Le rapport généré indique la fréquence d'utilisation de chaque règle et ce qui a été renvoyé.