Cloud Firestore ו-Realtime Database מסתמכים על שפות כללים יעילות ותמציתיות שנוצרו במיוחד כדי לשלוט באבטחת מידע ובבקרת גישה. עם זאת, ככל שהכללים יהיו ארוכים ומורכבים יותר, יכול להיות שתצטרכו עזרה בניפוי באגים בשגיאות בהתנהגות שלהם.
ב-Firebase Emulators יש אפשרות ליצור דוחות כיסוי של כללים, כך שתוכלו לראות בדיוק מה הערך שהתקבל לכל ביטוי משנה כשאתם יוצרים מחדש שגיאה. הדוחות כוללים גם מידע על התדירות שבה כל בדיקה השתמש בכלל, כמו שיטות 'כיסוי שורות' מסורתיות.
יצירת דוח
אחרי שמריצים מקבץ של בדיקות, אפשר לגשת לדוחות כיסוי לבדיקות שמראים איך בוצעה הערכה של כל אחד מכללי האבטחה.
כדי לקבל את הדוחות, צריך להריץ שאילתות על נקודת קצה חשופה באמולטור בזמן שהוא פועל. כדי לקבל גרסה שמתאימה לדפדפנים, צריך להשתמש בכתובת ה-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
בדוח מוצגות השגיאות הבאות עם ערך null או לא מוגדר:
הבעיה בדוגמה הספציפית הזו היא שהכללים לא מבדילים בין יצירת המסמך לבין עדכון המסמך. כתוצאה מכך, הכתיבה לא מתאפשרת אם המסמך לא קיים, ואי אפשר ליצור את המסמך כי הוא לא קיים. כדי לפתור את הבעיה, צריך להבדיל בין 'כתיבה' לשתי פעולות ספציפיות יותר – 'יצירה' ו'עדכון'.
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; } } }
בדוח שנוצר אפשר לראות מה תדירות השימוש בכל כלל ומה הוחזר.