تعتمد كلّ من 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; } } }
يعرض التقرير الذي تم إنشاؤه عدد المرات التي تم فيها استخدام كل قاعدة والقيمة التي تم إرجاعها.
