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