בדיקה אינטראקטיבית של פונקציות

מעטפת Cloud Functions מספקת מעטפת אינטראקטיבית להפעלת פונקציות עם נתוני בדיקה. המעטפת תומכת בכל סוגי הטריגרים.

הגדרת פרטי כניסה לאדמין (אופציונלי)

אם רוצים שהבדיקות של הפונקציות יפעלו עם ממשקי API של Google או עם ממשקי API אחרים של Firebase דרך Firebase Admin SDK, יכול להיות שתצטרכו להגדיר פרטי כניסה של אדמין.

  • לטריגרים Cloud Firestore ו-Realtime Database כבר יש מספיק פרטי כניסה, ולא נדרשת הגדרה נוספת.
  • בכל ממשקי ה-API האחרים, כולל Firebase APIs כמו Authentication ו-FCM או Google APIs כמו Cloud Translation או Cloud Speech, צריך לבצע את שלבי ההגדרה שמתוארים בקטע הזה. ההגדרה הזו חלה גם אם משתמשים במעטפת Cloud Functions או ב-firebase emulators:start.

כדי להגדיר פרטי כניסה של אדמין לפונקציות מדומה:

  1. פותחים את החלונית Service Accounts במסוף Google Cloud.
  2. מוודאים שחשבון השירות שמוגדר כברירת מחדל App Engine נבחר, ומשתמשים בתפריט האפשרויות בצד שמאל כדי לבחור באפשרות יצירת מפתח.
  3. כשמופיעה בקשה, בוחרים באפשרות JSON בתור סוג המפתח ולוחצים על יצירה.
  4. מגדירים את פרטי ברירת המחדל של Google כך שיפנו אל המפתח שהורד:

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

אחרי שמבצעים את השלבים האלה, בדיקות הפונקציות יכולות לגשת ל-Firebase ול-Google APIs באמצעות Admin SDK. לדוגמה, כשבודקים טריגר Authentication, הפונקציה המדומה יכולה לקרוא ל-admin.auth().getUserByEmail(email).

הפעלת פונקציות באמצעות מעטפת Cloud Functions

מעטפת Cloud Functions מדמה את כל סוגי הטריגרים של הפונקציות באמצעות מעטפת אינטראקטיבית להפעלת הפונקציות עם נתוני בדיקה. האפשרויות משתנות בהתאם לסוג הפונקציה, אבל פורמט השימוש הבסיסי הוא:

myFunctionName(data, options)

הפרמטר data נדרש לטריגרים של Realtime Database,‏ Cloud Firestore ו-PubSub, ואופציונלי לכל סוגי הפונקציות האחרים. בנוסף, הפרמטר האופציונלי options תקף רק לפונקציות של Realtime Database ו-Cloud Firestore.

אפשר גם לטעון נתוני בדיקה מקובץ מקומי. כדי לעשות את זה, שומרים את הקובץ כמשתנה ומפעילים פונקציה עם המשתנה:

var data = require('./path/to/testData.json');
myFunction(data);

התקנה והגדרה של מעטפת Cloud Functions

כדי להשתמש בתכונה הזו, גרסת firebase-tools צריכה להיות 3.11.0 לפחות, וגרסת firebase-functions SDK צריכה להיות 0.6.2 לפחות. כדי לעדכן את שניהם, מריצים את הפקודות הבאות בספרייה functions/ של הפרויקט:

npm install --save firebase-functions@latest
npm install -g firebase-tools

אם אתם משתמשים במשתני הגדרה של פונקציות מותאמות אישית, קודם מריצים את הפקודה כדי לקבל את ההגדרה המותאמת אישית (מריצים את הפקודה הזו בספרייה functions) בסביבה המקומית:

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

לבסוף, מריצים את ה-shell באמצעות הפקודה הבאה:

firebase functions:shell

הפעלת פונקציות HTTPS

כדי להפעיל פונקציות HTTPS במעטפת, השימוש זהה לשימוש במודול NPM‏ request, אבל צריך להחליף את request בשם הפונקציה שרוצים לבצע לה הדמיה. לדוגמה:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

הפעלה של פונקציות שאפשר לקרוא להן באמצעות HTTPS

כשמפעילים פונקציות שאפשר לקרוא להן באמצעות HTTPS באופן מקומי, צריך לספק נתוני בדיקה מתאימים.

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

אפשר גם להעביר את Firebase-Instance-ID-token כפרמטר השני. הערך חייב להיות מחרוזת.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

האפשרות לאמולציה של context.auth לא זמינה כרגע.

הפעלת פונקציות של Realtime Database

כשמריצים פונקציות של Realtime Database באופן מקומי, צריך לספק נתוני בדיקה מתאימים. בדרך כלל צריך לספק נתוני בדיקה חדשים לפעולות onCreate, נתונים ישנים או נתונים שהוסרו לפעולות onDelete, וגם וגם לפונקציות onUpdate או onWrite:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

בנוסף לאפשרויות before/after, המעטפת מספקת את האפשרות params לשימוש בתווים כלליים לחיפוש בנתיב:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

כברירת מחדל, המעטפת מפעילה פונקציות של Realtime Database עם הרשאות אדמין (חשבון שירות). אפשר להשתמש באפשרות auth כדי להריץ פונקציות בתור משתמש קצה מסוים, או בתור משתמש לא מאומת:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

הפעלת פונקציות של Firestore

כשמריצים פונקציות של Firestore באופן מקומי, צריך לספק נתוני בדיקה מתאימים. בדרך כלל צריך לספק נתוני בדיקה חדשים לפעולות onCreate, נתונים ישנים או נתונים שהוסרו לפעולות onDelete, וגם נתונים חדשים וגם נתונים ישנים לפונקציות onUpdate או onWrite. שימו לב שנתוני Firestore צריכים להיות צמדי מפתח/ערך. אפשר לעיין בסוגי הנתונים הנתמכים.

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

בנוסף לשדות before/after של אובייקט data, אפשר להשתמש בשדות params באובייקט options כדי ליצור תווים כלליים לחיפוש בשם של מסמך:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

המעטפת תמיד מריצה פונקציות של Firestore עם הרשאות אדמין, כלומר היא מדמה אירוע של יצירה, עדכון או מחיקה כאילו הוא בוצע על ידי משתמש עם הרשאת אדמין.

הפעלת פונקציות PubSub

בפונקציות PubSub, מוסיפים את מטען ההודעה למופע Buffer ומוסיפים מאפייני נתונים אופציונליים כמו בדוגמה:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

הפעלת פונקציות של Analytics

אפשר להפעיל פונקציה של Analytics בלי נתונים על ידי הרצת הפקודה myAnalyticsFunction() במעטפת. כדי להפעיל את הפונקציה עם נתוני בדיקה, מומלץ להגדיר משתנה לשדות נתוני האירועים הספציפיים שהפונקציה צריכה:

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

הפעלת פונקציות של אחסון ואימות

כדי להפעיל פונקציות של אחסון ואימות, מפעילים את הפונקציה המקומית עם נתוני הבדיקה שרוצים לראות בתוך הפונקציה. נתוני הבדיקה צריכים להיות בפורמטים המתאימים:

מציינים רק את השדות שהקוד תלוי בהם, או לא מציינים שדות בכלל אם רוצים רק להריץ את הפונקציה.