Cloud Firestore et Realtime Database s'appuient tous deux sur des langages de règles puissants et concis spécialement créés pour régir la sécurité des informations et le contrôle d'accès. Cependant, à 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 incluent la possibilité de générer des rapports de couverture de règles, afin que vous puissiez voir exactement à quoi chaque sous-expression est évaluée lorsque vous reproduisez une erreur. Les rapports fournissent également des informations sur la fréquence à laquelle chaque scénario de test utilise une règle, à l'instar des techniques traditionnelles de « couverture de lignes ».
Générer un rapport
Après avoir exécuté une suite de tests, vous pouvez accéder aux rapports de 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 conviviale pour le navigateur, utilisez l'URL suivante :
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Base de données en temps réel
http://localhost:9000/.inspect/coverage?ns=<database_name>
Cela divise vos règles en expressions et sous-expressions sur lesquelles vous pouvez passer la souris pour 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
Base de données en temps réel
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Exemples de règles de débogage
Pour générer facilement un rapport de test, utilisez les démarrages rapides de l'émulateur disponibles sur GitHub pour Cloud Firestore et Realtime Database . Ces guides de démarrage rapide vous guident dans l'installation et l'initialisation correctes des émulateurs, puis dans la génération d'exemples de tests à partir d'un exemple d'ensemble de règles.
Prenons un exemple d'application utilisant Cloud Firestore qui compte le nombre de fois où les utilisateurs cliquent sur un bouton. L'application utilise 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 dans les règles indiqué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 non définies et de valeur nulle suivantes :
Le problème avec cet exemple spécifique est que les règles ne font pas de 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 le document ne peut pas être créé car il n'existe pas. Différencier « écrire » en deux opérations plus spécifiques – « créer » et « mettre à 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é montre la fréquence à laquelle chaque règle a été utilisée et ce qui a été renvoyé.