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