Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

How to use firebase emulator to test storage and firestore triggers? #104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
manuganji opened this issue Jan 6, 2021 · 6 comments
Closed
Labels
documentation Improvements or additions to documentation

Comments

@manuganji
Copy link

I have a python function that runs on firestore document changes. How do I emulate and test integration with storage locally?

@di
Copy link
Member

di commented Jan 12, 2021

Install firebase-tools:

$ npm install -g firebase-tools

Install the firestore emulator:

$ firebase setup:emulators:firestore

Write a basic "background" function:

def hello(data, context):
    print(data, context)

Install the Functions Framework:

$ pip install functions-framework

In one terminal, start the Functions Framework (by default this will be on localhost:8080):

$ functions-framework --target hello --signature-type event

In 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 8081

Register 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-firestore

Write 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.py

Observe 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'}}

@di di added the documentation Improvements or additions to documentation label Jan 12, 2021
@manuganji
Copy link
Author

This is such a detailed reply. Thank you very much @di ! :)

@manuganji
Copy link
Author

I have 2 more questions.

  1. I can't currently test storage triggers, correct?
  2. Can I start the emulator with firebase emulators:start and still register the python function? My hope is to test both my nodejs and python functions at the same time.

@di
Copy link
Member

di commented Jan 12, 2021

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:start and 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:start and 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-tools tag on Stack Overflow instead -- it doesn't really have anything to do with the Functions Framework at this point.

@lfpazmino
Copy link

lfpazmino commented Mar 8, 2021

Hi @di
Thanks for guidelines, quite useful. However, I am facing an issue and I hope you can help me out

I 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/Test

Is there any configuration missing?

Thanks in advance!

@di
Copy link
Member

di commented Mar 9, 2021

@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-tools tag on Stack Overflow instead.

@di di closed this as completed Mar 9, 2021
@GoogleCloudPlatform GoogleCloudPlatform locked and limited conversation to collaborators Mar 9, 2021

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

3 participants