Repository navigation
How to use firebase emulator to test storage and firestore triggers? #104
Description
Activity
Install
firebase-tools:$ npm install -g firebase-toolsInstall the firestore emulator:
$ firebase setup:emulators:firestoreWrite a basic "background" function:
def hello(data, context): print(data, context)
Install the Functions Framework:
$ pip install functions-frameworkIn one terminal, start the Functions Framework (by default this will be on
localhost:8080):$ functions-framework --target hello --signature-type eventIn a second terminal, start the emulator (on a different port,
localhost:8081) and tell it which host/port to use for the functions emulator:$ java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.11.jar --functions_emulator localhost:8080 --port 8081Register a trigger with the firestore emulator:
$ curl --location --request PUT 'http://localhost:8081/emulator/v1/projects/my-project/triggers/Test' \ --header 'Content-Type: application/json' \ --data-raw '{ "eventTrigger": { "resource": "projects/my-project/databases/(default)/documents/my-collection/{id}", "eventType": "providers/cloud.firestore/eventTypes/document.write", "service": "firestore.googleapis.com" } }'Install the Firestore client library (using Python here but it can be any client library):
$ pip install google-cloud-firestoreWrite a script to trigger a write:
from google.cloud import firestore client = firestore.Client(project="my-project") client.collection("my-collection").add(document_data={"foo": "bar"})
In a third terminal, trigger a write:
$ export FIRESTORE_EMULATOR_HOST=localhost:8081 && python test.pyObserve the function being triggered by the emulator in the first terminal:
$ functions-framework --target hello --signature-type event [2021-01-12 13:31:33 -0600] [22783] [INFO] Starting gunicorn 20.0.4 [2021-01-12 13:31:33 -0600] [22783] [INFO] Listening at: http://0.0.0.0:8080 (22783) [2021-01-12 13:31:33 -0600] [22783] [INFO] Using worker: threads [2021-01-12 13:31:33 -0600] [22800] [INFO] Booting worker with pid: 22800 {'value': {'name': 'projects/my-project/databases/(default)/documents/my-collection/LDtrTcJpPiy0V5TIg4p9', 'fields': {'foo': {'stringValue': 'bar'}}, 'createTime': '2021-01-12T20:35:29.425788Z', 'updateTime': '2021-01-12T20:35:29.425788Z'}, 'updateMask': {}} {event_id: 3299c6a0-3efa-4893-ad87-3dc59c78b084, timestamp: 2021-01-12T20:35:29.425Z, event_type: providers/cloud.firestore/eventTypes/document.write, resource: {'name': 'projects/my-project/databases/(default)/documents/my-collection/LDtrTcJpPiy0V5TIg4p9', 'service': 'firestore.googleapis.com'}}Reacted by Manu Ganji- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Jan 12, 2021 This is such a detailed reply. Thank you very much @di ! :)
I have 2 more questions.
- I can't currently test
storagetriggers, correct? - Can I start the emulator with
firebase emulators:startand still register the python function? My hope is to test both my nodejs and python functions at the same time.
- I can't currently test
Happy to help!
I can't currently test storage triggers, correct?
If you mean Cloud Storage for Firebase, correct. From https://firebase.google.com/docs/emulator-suite#feature-matrix:
the Cloud Functions emulator does not support background functions triggered by Auth or Cloud Storage for Firebase.
There's a feature request for this here: firebase/firebase-tools#1738
Can I start the emulator with
firebase emulators:startand still register the python function? My hope is to test both my nodejs and python functions at the same time.I'm not very familiar with the firebase emulator, but it seems like it's not possible to start the emulator via
firebase emulators:startand specify--functions_emulator. In addition I think the emulated functions would all need to run on the same host/port.This might be a good question for the
firebase-toolstag on Stack Overflow instead -- it doesn't really have anything to do with the Functions Framework at this point.Reacted by Manu GanjiHi @di
Thanks for guidelines, quite useful. However, I am facing an issue and I hope you can help me outI followed your step-by-step instructions, but it is not working. When I checked the firebase-debug.log I find these logs:
[debug] [2021-03-08T23:18:40.086Z] Accepted request POST /functions/projects/{project Id}/triggers/Test --> Test {"metadata":{"emulator":{"name":"functions"},"message":"Accepted request POST /functions/projects/{project id}/triggers/Test --> Test"}}
[debug] [2021-03-08T23:18:40.086Z] Could not find key=Test in {}
[debug] [2021-03-08T23:18:40.088Z] RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined {"metadata":{"emulator":{"name":"functions"},"message":{"code":"ERR_HTTP_INVALID_STATUS_CODE"}}}
[debug] [2021-03-08T23:18:40.088Z] [work-queue] {"queueLength":0,"workRunningCount":0}I think I am missing something about registering the trigger "Test" somewhere, the one is referring to in the PUT endpoint:
http://localhost:8081/emulator/v1/projects/my-project/triggers/TestIs there any configuration missing?
Thanks in advance!
@lfpazmino Sorry, I can't really help with the Firebase emulator here. This might be a good issue for the https://github.com/firebase/firebase-tools/ repo or a question for the
firebase-toolstag on Stack Overflow instead.- locked and limited conversation to collaborators
on Mar 9, 2021
I have a python function that runs on firestore document changes. How do I emulate and test integration with storage locally?