আপনি যখন আপনার অ্যাপ তৈরি করছেন, আপনি আপনার Cloud Firestore ডাটাবেসের অ্যাক্সেস লক ডাউন করতে চাইতে পারেন। যাইহোক, আপনি লঞ্চ করার আগে, আপনার আরও সূক্ষ্ম Cloud Firestore Security Rules প্রয়োজন হবে৷ Cloud Firestore এমুলেটর দিয়ে, আপনার অ্যাপের সাধারণ বৈশিষ্ট্য এবং আচরণের প্রোটোটাইপিং এবং পরীক্ষা করার পাশাপাশি, আপনি ইউনিট পরীক্ষা লিখতে পারেন যা আপনার Cloud Firestore Security Rules আচরণ পরীক্ষা করে।
কুইকস্টার্ট
সাধারণ নিয়ম সহ কয়েকটি প্রাথমিক পরীক্ষার ক্ষেত্রে, দ্রুত স্টার্ট নমুনা চেষ্টা করে দেখুন।
Cloud Firestore Security Rules বুঝুন৷
আপনি যখন মোবাইল এবং ওয়েব ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন তখন সার্ভারহীন প্রমাণীকরণ, অনুমোদন এবং ডেটা যাচাইকরণের জন্য Firebase Authentication এবং Cloud Firestore Security Rules প্রয়োগ করুন৷
Cloud Firestore Security Rules দুটি অংশ অন্তর্ভুক্ত:
- একটি
match
স্টেটমেন্ট যা আপনার ডাটাবেসের নথিগুলি সনাক্ত করে। - একটি
allow
অভিব্যক্তি যা সেই নথিগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করে।
Firebase Authentication ব্যবহারকারীদের শংসাপত্র যাচাই করে এবং ব্যবহারকারী-ভিত্তিক এবং ভূমিকা-ভিত্তিক অ্যাক্সেস সিস্টেমের ভিত্তি প্রদান করে।
একটি Cloud Firestore মোবাইল/ওয়েব ক্লায়েন্ট লাইব্রেরি থেকে প্রতিটি ডেটাবেস অনুরোধ কোনো ডেটা পড়ার বা লেখার আগে আপনার নিরাপত্তা নিয়মের বিরুদ্ধে মূল্যায়ন করা হয়। যদি নিয়মগুলি নির্দিষ্ট নথির কোনো পাথের অ্যাক্সেস অস্বীকার করে, তাহলে সম্পূর্ণ অনুরোধ ব্যর্থ হয়।
Cloud Firestore Security Rules Cloud Firestore Security Rules নিয়ম সম্পর্কে আরও জানুন।
এমুলেটর ইনস্টল করুন
Cloud Firestore এমুলেটর ইনস্টল করতে, Firebase সিএলআই ব্যবহার করুন এবং নীচের কমান্ডটি চালান:
firebase setup:emulators:firestore
এমুলেটর চালান
আপনার কাজের ডিরেক্টরিতে একটি ফায়ারবেস প্রকল্প শুরু করে শুরু করুন। Firebase CLI ব্যবহার করার সময় এটি একটি সাধারণ প্রথম ধাপ।
firebase init
নিম্নলিখিত কমান্ড ব্যবহার করে এমুলেটর শুরু করুন। আপনি প্রক্রিয়াটি শেষ না করা পর্যন্ত এমুলেটর চলবে:
firebase emulators:start --only firestore
অনেক ক্ষেত্রে আপনি এমুলেটর শুরু করতে চান, একটি পরীক্ষা স্যুট চালাতে চান এবং তারপর পরীক্ষা চালানোর পরে এমুলেটরটি বন্ধ করতে চান। আপনি emulators:exec
কমান্ড ব্যবহার করে সহজেই এটি করতে পারেন:
firebase emulators:exec --only firestore "./my-test-script.sh"
শুরু হলে এমুলেটর একটি ডিফল্ট পোর্টে চালানোর চেষ্টা করবে (8080)। আপনি আপনার firebase.json
ফাইলের "emulators"
বিভাগটি পরিবর্তন করে এমুলেটর পোর্ট পরিবর্তন করতে পারেন:
{ // ... "emulators": { "firestore": { "port": "YOUR_PORT" } } }
আপনি এমুলেটর চালানোর আগে
আপনি এমুলেটর ব্যবহার শুরু করার আগে, নিম্নলিখিত মনে রাখবেন:
- এমুলেটর প্রাথমিকভাবে আপনার
firebase.json
ফাইলেরfirestore.rules
ক্ষেত্রে নির্দিষ্ট নিয়ম লোড করবে। এটি আপনার Cloud Firestore Security Rules সমন্বিত একটি স্থানীয় ফাইলের নাম আশা করে এবং সেই নিয়মগুলি সমস্ত প্রকল্পে প্রয়োগ করে৷ আপনি যদি স্থানীয় ফাইল পাথ প্রদান না করেন বা নীচে বর্ণিতloadFirestoreRules
পদ্ধতি ব্যবহার না করেন, তাহলে এমুলেটর সমস্ত প্রকল্পকে উন্মুক্ত নিয়ম হিসাবে বিবেচনা করে। - যদিও বেশিরভাগ ফায়ারবেস SDK সরাসরি এমুলেটরগুলির সাথে কাজ করে, শুধুমাত্র
@firebase/rules-unit-testing
লাইব্রেরি নিরাপত্তা নিয়মে মকিংauth
সমর্থন করে, যা ইউনিট পরীক্ষাগুলিকে আরও সহজ করে তোলে। এছাড়াও, লাইব্রেরি কয়েকটি এমুলেটর-নির্দিষ্ট বৈশিষ্ট্য সমর্থন করে যেমন সমস্ত ডেটা সাফ করা, যেমন নীচে তালিকাভুক্ত করা হয়েছে। - এমুলেটররা ক্লায়েন্ট SDK-এর মাধ্যমে প্রদত্ত উত্পাদন ফায়ারবেস প্রমাণীকরণ টোকেনগুলিও গ্রহণ করবে এবং সেই অনুযায়ী নিয়মগুলি মূল্যায়ন করবে, যা ইন্টিগ্রেশন এবং ম্যানুয়াল পরীক্ষায় আপনার অ্যাপ্লিকেশনটিকে সরাসরি এমুলেটরগুলির সাথে সংযুক্ত করার অনুমতি দেয়৷
স্থানীয় ইউনিট পরীক্ষা চালান
v9 JavaScript SDK দিয়ে স্থানীয় ইউনিট পরীক্ষা চালান
Firebase এর সংস্করণ 9 JavaScript SDK এবং এর সংস্করণ 8 SDK উভয়ের সাথে একটি নিরাপত্তা নিয়ম ইউনিট পরীক্ষার লাইব্রেরি বিতরণ করে। লাইব্রেরি এপিআই উল্লেখযোগ্যভাবে ভিন্ন। আমরা v9 টেস্টিং লাইব্রেরির সুপারিশ করি, যেটি আরও সুবিন্যস্ত এবং এমুলেটরগুলির সাথে সংযোগ করার জন্য কম সেটআপের প্রয়োজন হয় এবং এইভাবে নিরাপদে উত্পাদন সংস্থানগুলির দুর্ঘটনাজনিত ব্যবহার এড়ানো যায়। পিছনের সামঞ্জস্যের জন্য, আমরা v8 টেস্টিং লাইব্রেরি উপলব্ধ করা চালিয়ে যাচ্ছি।
স্থানীয়ভাবে চলা এমুলেটরের সাথে ইন্টারঅ্যাক্ট করতে @firebase/rules-unit-testing
মডিউল ব্যবহার করুন। আপনি যদি টাইমআউট বা ECONNREFUSED
ত্রুটি পান, তাহলে এমুলেটরটি আসলে চলছে কিনা তা দুবার চেক করুন।
আমরা দৃঢ়ভাবে Node.js এর একটি সাম্প্রতিক সংস্করণ ব্যবহার করার পরামর্শ দিই যাতে আপনি async/await
notation ব্যবহার করতে পারেন। আপনি পরীক্ষা করতে চান এমন প্রায় সমস্ত আচরণের মধ্যে অ্যাসিঙ্ক্রোনাস ফাংশন জড়িত, এবং টেস্টিং মডিউলটি প্রতিশ্রুতি-ভিত্তিক কোডের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে।
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.
একবার আমদানি করা হলে, ইউনিট পরীক্ষা বাস্তবায়নের সাথে জড়িত:
-
initializeTestEnvironment
জন্য একটি কল সহ একটিRulesTestEnvironment
তৈরি এবং কনফিগার করা। - নিয়ম ট্রিগার না করে পরীক্ষার ডেটা সেট আপ করা, একটি সুবিধার পদ্ধতি ব্যবহার করে যা আপনাকে সাময়িকভাবে সেগুলিকে বাইপাস করতে দেয়,
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 Auth টোকেন সংযুক্ত থাকবে না।
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 ডাটাবেসের ডেটা সাফ করে যা Firestore এমুলেটরের জন্য কনফিগার করা projectId
এর অন্তর্গত।
RulesTestContext.firestore(settings?: Firestore.FirestoreSettings) => Firestore;
এই পদ্ধতিটি এই পরীক্ষার প্রসঙ্গের জন্য একটি Firestore উদাহরণ পায়। ফিরে আসা Firebase JS ক্লায়েন্ট SDK উদাহরণটি ক্লায়েন্ট SDK APIs (v9 মডুলার বা v9 কম্প্যাট) এর সাথে ব্যবহার করা যেতে পারে।
নিয়ম মূল্যায়ন কল্পনা করুন
Cloud Firestore এমুলেটর আপনাকে ফায়ারবেস নিরাপত্তা নিয়মের মূল্যায়ন ট্রেসিং সহ এমুলেটর স্যুট UI-তে ক্লায়েন্ট অনুরোধগুলি কল্পনা করতে দেয়।
প্রতিটি অনুরোধের বিশদ মূল্যায়ন ক্রম দেখতে Firestore > অনুরোধ ট্যাবটি খুলুন।
পরীক্ষার রিপোর্ট তৈরি করুন
পরীক্ষার একটি স্যুট চালানোর পরে, আপনি পরীক্ষার কভারেজ রিপোর্টগুলি অ্যাক্সেস করতে পারেন যা দেখায় যে আপনার প্রতিটি নিরাপত্তা নিয়ম কীভাবে মূল্যায়ন করা হয়েছে।
প্রতিবেদনগুলি পেতে, এমুলেটর চলাকালীন একটি উন্মুক্ত শেষ বিন্দুকে জিজ্ঞাসা করুন। একটি ব্রাউজার-বান্ধব সংস্করণের জন্য, নিম্নলিখিত URL ব্যবহার করুন:
http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage.html
এটি আপনার নিয়মগুলিকে এক্সপ্রেশন এবং সাব এক্সপ্রেশনে ভেঙ্গে দেয় যা আপনি আরও তথ্যের জন্য মাউসওভার করতে পারেন, মূল্যায়নের সংখ্যা এবং ফেরত দেওয়া মান সহ। এই ডেটার অশোধিত JSON সংস্করণের জন্য, আপনার ক্যোয়ারীতে নিম্নলিখিত URLটি অন্তর্ভুক্ত করুন:
http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage
এমুলেটর এবং উত্পাদন মধ্যে পার্থক্য
- আপনাকে স্পষ্টভাবে একটি Cloud Firestore প্রকল্প তৈরি করতে হবে না। এমুলেটর স্বয়ংক্রিয়ভাবে অ্যাক্সেস করা যে কোনো উদাহরণ তৈরি করে।
- Cloud Firestore এমুলেটর সাধারণ Firebase Authentication প্রবাহের সাথে কাজ করে না। পরিবর্তে, ফায়ারবেস টেস্ট SDK-এ, আমরা
rules-unit-testing
লাইব্রেরিতেinitializeTestApp()
পদ্ধতি প্রদান করেছি, যা একটিauth
ক্ষেত্র নেয়। এই পদ্ধতিটি ব্যবহার করে তৈরি করা ফায়ারবেস হ্যান্ডেল এমন আচরণ করবে যেন এটি আপনার সরবরাহ করা সত্তা হিসাবে সফলভাবে প্রমাণীকৃত হয়েছে। আপনিnull
এ পাস করলে, এটি একটি অননুমোদিত ব্যবহারকারী হিসাবে আচরণ করবে (auth != null
নিয়ম ব্যর্থ হবে, উদাহরণস্বরূপ)।
পরিচিত সমস্যা সমাধান করুন
আপনি Cloud Firestore এমুলেটর ব্যবহার করার সাথে সাথে আপনি নিম্নলিখিত পরিচিত সমস্যাগুলির মধ্যে পড়তে পারেন। আপনি যে কোনো অনিয়মিত আচরণের সম্মুখীন হচ্ছেন তার সমস্যা সমাধানের জন্য নিচের নির্দেশিকা অনুসরণ করুন। এই নোটগুলি সিকিউরিটি রুলস ইউনিট টেস্টিং লাইব্রেরির কথা মাথায় রেখে লেখা হয়েছে, তবে সাধারণ পদ্ধতিগুলি যেকোন Firebase SDK-এর ক্ষেত্রে প্রযোজ্য।
পরীক্ষার আচরণ অসামঞ্জস্যপূর্ণ
যদি আপনার পরীক্ষাগুলি মাঝে মাঝে পাস করে এবং ব্যর্থ হয়, এমনকি পরীক্ষায় কোনও পরিবর্তন না করেও, আপনাকে যাচাই করতে হতে পারে যে সেগুলি সঠিকভাবে ক্রম করা হয়েছে। এমুলেটরের সাথে বেশিরভাগ ইন্টারঅ্যাকশনই অ্যাসিঙ্ক্রোনাস, তাই দুবার চেক করুন যে সমস্ত অ্যাসিঙ্ক কোড সঠিকভাবে সিকোয়েন্স করা হয়েছে। আপনি প্রতিশ্রুতি চেইন করে বা উদারভাবে await
স্বরলিপি ব্যবহার করে সিকোয়েন্সিং ঠিক করতে পারেন।
বিশেষ করে, নিম্নলিখিত অ্যাসিঙ্ক অপারেশনগুলি পর্যালোচনা করুন:
- নিরাপত্তা নিয়ম সেট করা, উদাহরণস্বরূপ,
initializeTestEnvironment
। - যেমন,
db.collection("users").doc("alice").get()
সহ ডেটা পড়া এবং লেখা। -
assertSucceeds
এবংassertFails
সহ অপারেশনাল দাবী।
আপনি প্রথমবার এমুলেটর লোড করলেই পরীক্ষাগুলি পাস হয়৷
এমুলেটর রাষ্ট্রীয়। এটি মেমরিতে এটিতে লেখা সমস্ত ডেটা সঞ্চয় করে, তাই যখনই এমুলেটর বন্ধ হয়ে যায় তখন যে কোনও ডেটা হারিয়ে যায়। আপনি যদি একই প্রজেক্ট আইডির বিরুদ্ধে একাধিক পরীক্ষা চালাচ্ছেন, প্রতিটি পরীক্ষা এমন ডেটা তৈরি করতে পারে যা পরবর্তী পরীক্ষাগুলিকে প্রভাবিত করতে পারে। এই আচরণটি বাইপাস করতে আপনি নিম্নলিখিত পদ্ধতিগুলির যে কোনও একটি ব্যবহার করতে পারেন:
- প্রতিটি পরীক্ষার জন্য অনন্য প্রকল্প আইডি ব্যবহার করুন। মনে রাখবেন যে আপনি যদি এটি করতে চান তবে প্রতিটি পরীক্ষার অংশ হিসাবে আপনাকে
initializeTestEnvironment
কল করতে হবে; নিয়মগুলি শুধুমাত্র ডিফল্ট প্রকল্প আইডির জন্য স্বয়ংক্রিয়ভাবে লোড হয়। - আপনার পরীক্ষাগুলিকে পুনর্গঠন করুন যাতে তারা পূর্বে লিখিত ডেটার সাথে যোগাযোগ না করে (উদাহরণস্বরূপ, প্রতিটি পরীক্ষার জন্য আলাদা সংগ্রহ ব্যবহার করুন)।
- পরীক্ষার সময় লেখা সমস্ত ডেটা মুছুন।
টেস্ট সেটআপ খুবই জটিল
আপনার পরীক্ষা সেট আপ করার সময়, আপনি এমনভাবে ডেটা পরিবর্তন করতে চাইতে পারেন যা আপনার Cloud Firestore Security Rules আসলে অনুমতি দেয় না। যদি আপনার নিয়মগুলি পরীক্ষা সেটআপকে জটিল করে তোলে, তাহলে আপনার সেটআপ ধাপে RulesTestEnvironment.withSecurityRulesDisabled
ব্যবহার করার চেষ্টা করুন, যাতে পড়া এবং লেখা PERMISSION_DENIED
ত্রুটিগুলিকে ট্রিগার করবে না৷
এর পরে, আপনার পরীক্ষা যথাক্রমে RulesTestEnvironment.authenticatedContext
এবং unauthenticatedContext
ব্যবহার করে একটি প্রমাণীকৃত বা অপ্রমাণিত ব্যবহারকারী হিসাবে অপারেশন করতে পারে। এটি আপনাকে যাচাই করতে দেয় যে আপনার Cloud Firestore Security Rules বিভিন্ন ক্ষেত্রে সঠিকভাবে অনুমোদন/অস্বীকার করে।