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