अपना ऐप्लिकेशन बनाते समय, हो सकता है कि आप Cloud Firestore डेटाबेस. हालांकि, ऐप्लिकेशन लॉन्च करने से पहले, आपको बारीकियां देखने की ज़रूरत होगी Cloud Firestore के सुरक्षा नियम. Cloud Firestore एम्युलेटर की मदद से, प्रोटोटाइप बनाना और अपने ऐप्लिकेशन की सामान्य सुविधाओं और व्यवहार की जांच करना, आपके पास यूनिट टेस्ट लिखने का विकल्प होता है, जो आपके Cloud Firestore के सुरक्षा नियमों के व्यवहार की जांच करते हैं.
क्विकस्टार्ट
आसान नियमों वाले कुछ बुनियादी टेस्ट केस के लिए, क्विकस्टार्ट सैंपल आज़माएं.
Cloud Firestore के सुरक्षा नियमों को समझें
Firebase से पुष्टि करने की सुविधा लागू करें और बिना सर्वर वाले डिवाइसों के लिए, Cloud Firestore के सुरक्षा नियम प्रमाणीकरण, प्राधिकरण, और डेटा सत्यापन, जब आप मोबाइल और वेब क्लाइंट लाइब्रेरी पर लागू होती है.
Cloud Firestore के सुरक्षा नियमों के दो हिस्से होते हैं:
match
स्टेटमेंट, जो आपके डेटाबेस में मौजूद दस्तावेज़ों की पहचान करता है.- एक
allow
एक्सप्रेशन, जो उन दस्तावेज़ों के ऐक्सेस को कंट्रोल करता है.
Firebase से पुष्टि करने की सुविधा, उपयोगकर्ताओं के क्रेडेंशियल और बुनियादी जानकारी उपयोगकर्ता और भूमिका पर आधारित ऐक्सेस सिस्टम मिलते हैं.
Cloud Firestore मोबाइल/वेब क्लाइंट लाइब्रेरी से डेटाबेस के हर अनुरोध को किसी भी डेटा को पढ़ने या लिखने से पहले, उसकी जांच आपके सुरक्षा नियमों के हिसाब से की जाती है. अगर नियम किसी भी दिए गए दस्तावेज़ पथ तक पहुंच अस्वीकार करते हैं, तो अनुरोध पूरा नहीं हुआ.
Cloud Firestore के सुरक्षा नियमों का इस्तेमाल शुरू करने में Cloud Firestore के सुरक्षा नियमों के बारे में ज़्यादा जानें.
एम्युलेटर को इंस्टॉल करें
Cloud Firestore एम्युलेटर इंस्टॉल करने के लिए, Firebase सीएलआई का इस्तेमाल करें और नीचे दिए गए निर्देश को चलाएं:
firebase setup:emulators:firestore
एम्युलेटर चलाएं
सबसे पहले, अपनी वर्किंग डायरेक्ट्री में Firebase प्रोजेक्ट शुरू करें. यह है Firebase सीएलआई का इस्तेमाल करने के दौरान, इस्तेमाल करने के लिए सबसे पहले सामान्य चरण लागू होता है.
firebase init
नीचे दिए गए निर्देश का इस्तेमाल करके, एम्युलेटर को शुरू करें. एम्युलेटर चलेगा जब तक कि आप यह प्रक्रिया खत्म न कर दें:
firebase emulators:start --only firestore
कई मामलों में आप एम्युलेटर शुरू करना चाहते हैं, टेस्ट सुइट चलाना चाहते हैं, और फिर बंद करना चाहते हैं
टेस्ट करने के बाद, एम्युलेटर को बंद कर दिया जाएगा. इस प्रोसेस को आसानी से करने के लिए,
emulators:exec
निर्देश:
firebase emulators:exec --only firestore "./my-test-script.sh"
शुरू होने पर, एम्युलेटर डिफ़ॉल्ट पोर्ट (8080) पर चलने की कोशिश करेगा. आप
अपने डिवाइस के "emulators"
सेक्शन में बदलाव करके, एम्युलेटर पोर्ट को बदलें
firebase.json
फ़ाइल:
{ // ... "emulators": { "firestore": { "port": "YOUR_PORT" } } }
एम्युलेटर को चलाने से पहले
एम्युलेटर का इस्तेमाल शुरू करने से पहले, इन बातों का ध्यान रखें:
- एम्युलेटर, शुरुआत में
firestore.rules
में तय किए गए नियमों को लोड करेगा फ़ील्ड में अपनीfirebase.json
फ़ाइल की वैल्यू डालें. यह एक लोकल फ़ाइल है जिसमें आपके Cloud Firestore के सुरक्षा नियम हैं और उन नियमों को प्रोजेक्ट. यदि आप स्थानीय फ़ाइल पथ उपलब्ध नहीं कराते याloadFirestoreRules
तरीका नीचे बताया गया है, एम्युलेटर सभी का इस्तेमाल करता है ओपन रूल वाले प्रोजेक्ट. - हालांकि
ज़्यादातर Firebase SDK टूल
सीधे एम्युलेटर के साथ काम करते हैं, सिर्फ़
@firebase/rules-unit-testing
लाइब्रेरी सुरक्षा नियमों मेंauth
का मज़ाक़ बना रहे हैं, जिससे यूनिट टेस्ट बहुत आसान हो जाता है. इसके अलावा, लाइब्रेरी, एम्युलेटर के लिए बनी कुछ खास सुविधाओं के साथ काम करती है. जैसे, सारा डेटा मिटाना, जैसा कि नीचे बताया गया है. - एम्युलेटर, प्रोडक्शन में Firebase की पुष्टि करने वाले टोकन भी स्वीकार करेंगे साथ ही, क्लाइंट SDK टूल का इस्तेमाल करके नियमों का आकलन करें, ताकि का इस्तेमाल, सीधे इंटिग्रेशन और मैन्युअल टेस्ट में मौजूद एम्युलेटर पर करने के लिए किया जा सकता है.
लोकल यूनिट टेस्ट चलाना
v9 JavaScript SDK टूल की मदद से लोकल यूनिट टेस्ट करना
Firebase, अपने दोनों वर्शन के साथ सुरक्षा नियमों की यूनिट टेस्टिंग लाइब्रेरी उपलब्ध कराता है 9 JavaScript SDK टूल और उसका 8 वर्शन. लाइब्रेरी के एपीआई काफ़ी अहम हैं अलग हैं. हम v9 टेस्टिंग लाइब्रेरी का सुझाव देते हैं, जो ज़्यादा व्यवस्थित और इसे एम्युलेटर से कनेक्ट करने के लिए कम सेटअप की ज़रूरत होती है. इस तरह, यह गलती से भी सुरक्षित रहता है प्रोडक्शन के संसाधनों का इस्तेमाल. पुराने सिस्टम के साथ काम करने की सुविधा के लिए, हम लगातार अपने v8 टेस्टिंग लाइब्रेरी उपलब्ध है.
- v9 SDK टूल में, जांच करने के सामान्य तरीके और यूटिलिटी फ़ंक्शन
- v9 SDK टूल में, एम्युलेटर के हिसाब से बने टेस्ट के तरीके
एम्युलेटर के साथ इंटरैक्ट करने के लिए, @firebase/rules-unit-testing
मॉड्यूल का इस्तेमाल करें
जो डिवाइस में मौजूद हों. अगर टाइम आउट या ECONNREFUSED
गड़बड़ियां मिलती हैं, तो दोबारा जांच करें
है कि एम्युलेटर असल में चल रहा है.
हम Node.js के नए वर्शन का इस्तेमाल करने का सुझाव देते हैं, ताकि आप
async/await
नोटेशन. वे सभी व्यवहार जिनका आपको टेस्ट करना चाहिए
में एसिंक्रोनस फ़ंक्शन होते हैं. टेस्टिंग मॉड्यूल को इस तरह से डिज़ाइन किया गया है कि
प्रॉमिस-आधारित कोड.
v9 रूल यूनिट की टेस्टिंग लाइब्रेरी को एम्युलेटर के बारे में हमेशा जानकारी रहती है और कभी भी ऐसा नहीं होता इसके अलावा, प्रोडक्शन से जुड़े संसाधनों को भी बेहतर बनाया जा सकता है.
आप v9 मॉड्यूलर इंपोर्ट स्टेटमेंट का इस्तेमाल करके लाइब्रेरी इंपोर्ट करते हैं. उदाहरण के लिए:
import {
assertFails,
assertSucceeds,
initializeTestEnvironment
} from "@firebase/rules-unit-testing"
// Use `const { … } = require("@firebase/rules-unit-testing")` if imports are not supported
// Or we suggest `const testing = require("@firebase/rules-unit-testing")` if necessary.
इंपोर्ट होने के बाद, यूनिट टेस्ट लागू करने के लिए ये काम करने की ज़रूरत होती है:
RulesTestEnvironment
को बनाया और कॉन्फ़िगर किया जा रहा है.initializeTestEnvironment
.- आसान सुविधा का इस्तेमाल करके, नियमों को ट्रिगर किए बिना टेस्ट डेटा सेट अप करना
तरीका है, जिसकी मदद से कुछ समय के लिए इसे बायपास किया जा सकता है,
RulesTestEnvironment.withSecurityRulesDisabled
. - हुक से पहले/बाद में टेस्ट सुइट और हर टेस्ट को सेट अप किया जा रहा है.
टेस्ट डेटा और एनवायरमेंट को खाली करें, जैसे कि
RulesTestEnvironment.cleanup()
याRulesTestEnvironment.clearFirestore()
. - ऐसे टेस्ट केस लागू करना जो पुष्टि करने की स्थिति की नकल करते हैं
RulesTestEnvironment.authenticatedContext
औरRulesTestEnvironment.unauthenticatedContext
.
सामान्य तरीके और उपयोगिता फ़ंक्शन
v9 SDK टूल में एम्युलेटर के लिए खास तौर पर बनाए गए टेस्ट के तरीके भी देखें.
initializeTestEnvironment() => RulesTestEnvironment
यह फ़ंक्शन, नियमों की यूनिट की जांच करने के लिए, टेस्ट एनवायरमेंट को शुरू करता है. इसे कॉल करें पहले फ़ंक्शन का इस्तेमाल करें. सफल एक्ज़ीक्यूशन के लिए यह ज़रूरी है कि एम्युलेटर दौड़ने.
यह फ़ंक्शन, TestEnvironmentConfig
के बारे में बताने वाले वैकल्पिक ऑब्जेक्ट को स्वीकार करता है,
इसमें एक प्रोजेक्ट आईडी और एम्युलेटर कॉन्फ़िगरेशन की सेटिंग शामिल हो सकती हैं.
let testEnv = await initializeTestEnvironment({ projectId: "demo-project-1234", firestore: { rules: fs.readFileSync("firestore.rules", "utf8"), }, });
RulesTestEnvironment.authenticatedContext({ user_id: string, tokenOptions?: TokenOptions }) => RulesTestContext
इस तरीके से एक RulesTestContext
बनता है, जो पुष्टि किए गए डेटा की तरह काम करता है
पुष्टि करने वाले उपयोगकर्ता. रिटर्न किए गए कॉन्टेक्स्ट के ज़रिए किए गए अनुरोधों का एक मॉक होगा
पुष्टि करने वाला टोकन अटैच किया गया. वैकल्पिक रूप से, कस्टम दावों को परिभाषित करने वाला कोई ऑब्जेक्ट पास करें या
पुष्टि करने वाले टोकन पेलोड के लिए बदलाव करता है.
किसी भी एम्युलेटर को ऐक्सेस करने के लिए, अपने टेस्ट में टेस्ट के लिए दिखाए गए कॉन्टेक्स्ट ऑब्जेक्ट का इस्तेमाल करें
initializeTestEnvironment
के साथ कॉन्फ़िगर किए गए इंस्टेंस भी शामिल हैं.
// Assuming a Firestore app and the Firestore emulator for this example import { setDoc } from "firebase/firestore"; const alice = testEnv.authenticatedContext("alice", { … }); // Use the Firestore instance associated with this context await assertSucceeds(setDoc(alice.firestore(), '/users/alice'), { ... });
RulesTestEnvironment.unauthenticatedContext() => RulesTestContext
इस तरीके से एक RulesTestContext
बनता है, जो इस तरह काम करता है:
प्रमाणीकरण के ज़रिए लॉग इन नहीं किया है. रिटर्न किए गए कॉन्टेक्स्ट के ज़रिए किए गए अनुरोध
Firebase पुष्टि टोकन अटैच होना चाहिए.
किसी भी एम्युलेटर को ऐक्सेस करने के लिए, अपने टेस्ट में टेस्ट के लिए दिखाए गए कॉन्टेक्स्ट ऑब्जेक्ट का इस्तेमाल करें
initializeTestEnvironment
के साथ कॉन्फ़िगर किए गए इंस्टेंस भी शामिल हैं.
// Assuming a Cloud Storage app and the Storage emulator for this example import { getStorage, ref, deleteObject } from "firebase/storage"; const alice = testEnv.unauthenticatedContext(); // Use the Cloud Storage instance associated with this context const desertRef = ref(alice.storage(), 'images/desert.jpg'); await assertSucceeds(deleteObject(desertRef));
RulesTestEnvironment.withSecurityRulesDisabled()
कॉन्टेक्स्ट के साथ टेस्ट सेटअप फ़ंक्शन चलाएं जो इस तरह काम करता है जैसे सुरक्षा के नियम बंद किया गया.
यह तरीका एक कॉलबैक फ़ंक्शन लेता है, जो सुरक्षा के नियमों को बायपास करता है संदर्भ के साथ-साथ प्रॉमिस भी दिखाता है. प्रॉमिसिंग के बाद कॉन्टेक्स्ट खत्म हो जाएगा समाधान करता है / अस्वीकार करता है.
RulesTestEnvironment.cleanup()
यह तरीका टेस्ट एनवायरमेंट में बनाए गए सभी RulesTestContexts
को मिटा देता है और
मौजूदा संसाधनों को साफ़ करता है, ताकि बाहर निकलने का रास्ता साफ़ हो जाए.
इस तरीके से एम्युलेटर की स्थिति में किसी तरह का बदलाव नहीं होता. डेटा रीसेट करने के लिए के बीच में, ऐप्लिकेशन एम्युलेटर के लिए बने साफ़ डेटा वाले तरीके का इस्तेमाल करें.
assertSucceeds(pr: Promise<any>)) => Promise<any>
यह एक टेस्ट केस यूटिलिटी फ़ंक्शन है.
फ़ंक्शन यह पुष्टि करता है कि दिए गए प्रॉमिस में, एम्युलेटर ऑपरेशन को रैप किया गया है सुरक्षा नियम के उल्लंघन के बिना हल कर दिया जाएगा.
await assertSucceeds(setDoc(alice.firestore(), '/users/alice'), { ... });
assertFails(pr: Promise<any>)) => Promise<any>
यह एक टेस्ट केस यूटिलिटी फ़ंक्शन है.
फ़ंक्शन यह पुष्टि करता है कि दिए गए प्रॉमिस में, एम्युलेटर ऑपरेशन को रैप किया गया है को सुरक्षा नियमों का उल्लंघन करने पर अस्वीकार कर दिया जाएगा.
await assertFails(setDoc(alice.firestore(), '/users/bob'), { ... });
एम्युलेटर के लिए खास तरीके
v9 SDK टूल में टेस्ट करने के सामान्य तरीके और यूटिलिटी फ़ंक्शन भी देखें.
RulesTestEnvironment.clearFirestore() => Promise<void>
इस तरीके से, Firestore डेटाबेस में वह डेटा मिट जाता है जो
projectId
को Firestore एम्युलेटर के लिए कॉन्फ़िगर किया गया.
RulesTestContext.firestore(settings?: Firestore.FirestoreSettings) => Firestore;
जांच के इस कॉन्टेक्स्ट के लिए, इस तरीके को Firestore इंस्टेंस मिलता है. रिटर्न Firebase JS क्लाइंट SDK इंस्टेंस का इस्तेमाल, क्लाइंट SDK API (v9 मॉड्यूलर) के साथ किया जा सकता है या v9 कंपैट).
नियमों के आकलन को विज़ुअलाइज़ करना
Cloud Firestore एम्युलेटर की मदद से, क्लाइंट के अनुरोधों को एम्युलेटर सुइट का यूज़र इंटरफ़ेस (यूआई), जिसमें Firebase के सुरक्षा नियमों के लिए इवैलुएशन ट्रेसिंग भी शामिल है.
Firestore > खोलें अनुरोध टैब से, सभी समस्याओं का आकलन किया जा सकता है हर अनुरोध का क्रम तय करें.
टेस्ट रिपोर्ट जनरेट करना
टेस्ट का सुइट चलाने के बाद, टेस्ट को ऐक्सेस किया जा सकता है कवरेज रिपोर्ट से पता चलता है कि सुरक्षा के आपके हर नियम का आकलन कैसे किया गया.
रिपोर्ट पाने के लिए, एम्युलेटर पर बिना अनुमति के सार्वजनिक किए गए एंडपॉइंट से क्वेरी करें, जबकि अभी यह चालू है. ब्राउज़र-फ़्रेंडली वर्शन के लिए, इस यूआरएल का इस्तेमाल करें:
http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage.html
इससे आपके नियम, एक्सप्रेशन और सब-एक्सप्रेशन में बंट जाते हैं. आकलन और मानों की संख्या सहित ज़्यादा जानकारी के लिए माउसओवर वापस किया गया. इस डेटा के रॉ JSON वर्शन के लिए, यह यूआरएल शामिल करें आपकी क्वेरी में:
http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage
एम्युलेटर और प्रोडक्शन के बीच अंतर
- आपको अलग से Cloud Firestore प्रोजेक्ट बनाने की ज़रूरत नहीं है. एम्युलेटर अपने-आप ऐसा कोई भी इंस्टेंस बनाता है जिसे ऐक्सेस किया जाता है.
- Cloud Firestore एम्युलेटर, Firebase की पुष्टि करने की सामान्य प्रक्रिया के साथ काम नहीं करता.
इसके बजाय, हमने Firebase टेस्ट SDK टूल में
initializeTestApp()
तरीका उपलब्ध कराया हैrules-unit-testing
लाइब्रेरी, जिसके लिएauth
फ़ील्ड लेना पड़ता है. Firebase हैंडल बनाया गया इस तरीके का इस्तेमाल करने पर, यह इस तरह काम करेगा: को नहीं दिया जाएगा. अगर आपnull
में पास करते हैं, तो यह इस तरह काम करेगा: उपयोगकर्ता की पुष्टि नहीं हुई है (उदाहरण के लिए,auth != null
नियम काम नहीं करेंगे).
आम तौर पर होने वाली समस्याओं को हल करना
Cloud Firestore एम्युलेटर का इस्तेमाल करने पर, आपके पास नीचे दी गई समस्याएं. अनियमित व्यवहार की समस्या को हल करने के लिए, नीचे दिए गए दिशा-निर्देशों का पालन करें अनुभव कर रहा है. ये नोट, सुरक्षा नियमों की यूनिट टेस्टिंग की मदद से लिखे गए हैं लाइब्रेरी के लिए भी बनाया गया है, लेकिन किसी भी Firebase SDK टूल पर ये सामान्य तरीके लागू किए जा सकते हैं.
जांच करने का तरीका अलग-अलग है
अगर आपके टेस्ट कभी-कभी पास हो रहे हैं और काम नहीं कर रहे हैं, भले ही उनमें कोई बदलाव न किया गया हो
इन चीज़ों की जांच करते हैं, तो आपको यह पुष्टि करनी पड़ सकती है कि उन्हें सही क्रम में लगाया गया है.
एम्युलेटर के साथ होने वाले ज़्यादातर इंटरैक्शन एसिंक्रोनस होते हैं. इसलिए, पक्का करें कि सभी
एक साथ काम नहीं करने वाली प्रोसेस को सही क्रम में लगाया गया है. आप इनमें से किसी एक तरीके से क्रम तय कर सकते हैं
वादों को जोड़ने या await
नोटेशन का बेझिझक इस्तेमाल करना.
खास तौर पर, ये एक साथ काम नहीं करने वाली प्रोसेस की समीक्षा करें:
- सुरक्षा के नियम सेट करना. जैसे,
initializeTestEnvironment
. - डेटा को पढ़ना और लिखना. जैसे,
db.collection("users").doc("alice").get()
. - कार्रवाइयों से जुड़े दावे, जिनमें
assertSucceeds
औरassertFails
शामिल हैं.
एम्युलेटर को पहली बार लोड करने पर ही, जांच में पास होती हैं
एम्युलेटर को स्टेटफ़ुल तरीके से दिखाया गया है. यह मेमोरी में लिखे गए सभी डेटा को सेव करता है, इसलिए एम्युलेटर के बंद होने पर, कोई भी डेटा मिट जाता है. अगर एक से ज़्यादा विज्ञापन चलाए जा रहे हैं, तो एक ही प्रोजेक्ट आईडी के साथ की जाने वाली जांच से, हर टेस्ट ऐसा डेटा बना सकता है जो का असर बाद की टेस्टिंग पर पड़ता है. इनमें से किसी भी तरीके का इस्तेमाल करके, इसे बायपास करें:
- हर जांच के लिए, यूनीक प्रोजेक्ट आईडी का इस्तेमाल करें. ध्यान दें कि अगर आपको ऐसा करना है
हर टेस्ट के दौरान,
initializeTestEnvironment
को कॉल करना होगा; नियम सिर्फ़ डिफ़ॉल्ट प्रोजेक्ट आईडी के लिए अपने-आप लोड होती हैं. - अपने टेस्ट को फिर से व्यवस्थित करें, ताकि वे पहले लिखे गए डेटा से इंटरैक्ट न करें उदाहरण के लिए, हर टेस्ट के लिए एक अलग कलेक्शन का इस्तेमाल करें.
- टेस्ट के दौरान लिखा गया सारा डेटा मिटाएं.
टेस्ट सेटअप करना बहुत मुश्किल है
टेस्ट सेट अप करते समय, हो सकता है कि आप डेटा में इस तरह से बदलाव करना चाहें कि
असल में, Cloud Firestore के सुरक्षा नियमों की अनुमति नहीं है. अगर आपके नियम, टेस्ट सेटअप कर रहे हैं
जटिल, अपने सेटअप में RulesTestEnvironment.withSecurityRulesDisabled
का इस्तेमाल करके देखें
चरणों को पूरा करने की कोशिश करता है, इसलिए पढ़ने और लिखने से PERMISSION_DENIED
गड़बड़ियां ट्रिगर नहीं होंगी.
इसके बाद, आपकी जांच से पुष्टि हो चुकी है या पुष्टि नहीं हुई है के तौर पर कार्रवाइयां की जा सकती हैं
RulesTestEnvironment.authenticatedContext
और unauthenticatedContext
का इस्तेमाल करने वाले उपयोगकर्ता
क्रम से. इससे आपको यह पुष्टि करने की सुविधा मिलती है कि आपके Cloud Firestore के सुरक्षा नियमों की अनुमति है / अस्वीकार कर दी गई है
अलग-अलग मामलों को सही ढंग से दर्ज किया है.