In-memory implementation of Google Cloud Firestore for use in tests
Project description
Fake Firestore
Fork of mdowds/mock-firestore, originally
mock-firestoreon PyPI. This fork focuses on fake semantics and async facade.
An in-memory fake implementation of google-cloud-firestore for use in tests.
Important: This library fakes google-cloud-firestore — the official Google Cloud Firestore client library. It does not support firebase_admin.
Installation
pip install fake-firestore
Python 3.8+ is required.
Usage
from fake_firestore import FakeFirestoreClient
db = FakeFirestoreClient()
# Can be used in the same way as a firestore.Client() object would be, e.g.:
db.collection('users').get()
To reset the store to an empty state, use the reset() method:
db = FakeFirestoreClient()
db.reset()
Note:
MockFirestoreis still available as a backward compatibility alias forFakeFirestoreClient.
Supported operations
from fake_firestore import FakeFirestoreClient
db = FakeFirestoreClient()
# Collections
db.collections()
db.collection('users')
db.collection('users').get()
db.collection('users').list_documents()
db.collection('users').stream()
# Documents
db.collection('users').document()
db.collection('users').document('alovelace')
db.collection('users').document('alovelace').id
db.collection('users').document('alovelace').parent
db.collection('users').document('alovelace').update_time
db.collection('users').document('alovelace').read_time
db.collection('users').document('alovelace').get()
db.collection('users').document('alovelace').get().exists
db.collection('users').document('alovelace').get().to_dict()
db.collection('users').document('alovelace').set({
'first': 'Ada',
'last': 'Lovelace'
})
db.collection('users').document('alovelace').set({'first': 'Augusta Ada'}, merge=True)
db.collection('users').document('alovelace').update({'born': 1815})
db.collection('users').document('alovelace').update({'favourite.color': 'red'})
db.collection('users').document('alovelace').update({'associates': ['Charles Babbage', 'Michael Faraday']})
db.collection('users').document('alovelace').collection('friends')
db.collection('users').document('alovelace').delete()
db.collection('users').document(document_id='alovelace').delete()
db.collection('users').add({'first': 'Ada', 'last': 'Lovelace'}, 'alovelace')
db.get_all([db.collection('users').document('alovelace')])
db.document('users/alovelace')
db.document('users/alovelace').update({'born': 1815})
db.collection('users/alovelace/friends')
# Querying
db.collection('users').order_by('born').get()
db.collection('users').order_by('born', direction='DESCENDING').get()
db.collection('users').limit(5).get()
db.collection('users').where('born', '==', 1815).get()
db.collection('users').where('born', '!=', 1815).get()
db.collection('users').where('born', '<', 1815).get()
db.collection('users').where('born', '>', 1815).get()
db.collection('users').where('born', '<=', 1815).get()
db.collection('users').where('born', '>=', 1815).get()
db.collection('users').where('born', 'in', [1815, 1900]).stream()
db.collection('users').where('associates', 'array_contains', 'Charles Babbage').stream()
db.collection('users').where('associates', 'array_contains_any', ['Charles Babbage', 'Michael Faraday']).stream()
# Transforms
from google.cloud import firestore
db.collection('users').document('alovelace').update({'likes': firestore.Increment(1)})
db.collection('users').document('alovelace').update({'associates': firestore.ArrayUnion(['Andrew Cross', 'Charles Wheatstone'])})
db.collection('users').document('alovelace').update({firestore.DELETE_FIELD: "born"})
db.collection('users').document('alovelace').update({'associates': firestore.ArrayRemove(['Andrew Cross'])})
# Cursors
db.collection('users').start_after({'id': 'alovelace'}).stream()
db.collection('users').end_before({'id': 'alovelace'}).stream()
db.collection('users').end_at({'id': 'alovelace'}).stream()
db.collection('users').start_after(db.collection('users').document('alovelace')).stream()
# Transactions
transaction = db.transaction()
transaction.id
transaction.in_progress
transaction.get(db.collection('users').where('born', '==', 1815))
transaction.get(db.collection('users').document('alovelace'))
transaction.get_all([db.collection('users').document('alovelace')])
transaction.set(db.collection('users').document('alovelace'), {'born': 1815})
transaction.update(db.collection('users').document('alovelace'), {'born': 1815})
transaction.delete(db.collection('users').document('alovelace'))
transaction.commit()
Running the tests
poetry install
poetry run pytest
Contract tests with Firestore emulator
Contract tests live under tests/contract/ and can be run against the Firestore
emulator by setting environment variables and choosing the backend:
export FIRESTORE_BACKEND=emulator
export FIRESTORE_EMULATOR_HOST=localhost:8080
export GOOGLE_CLOUD_PROJECT=demo-test
poetry run pytest tests/contract
To run the same contract tests against the in-memory fake:
export FIRESTORE_BACKEND=fake
poetry run pytest tests/contract
You can also use the helper script to run contract tests against the emulator:
chmod +x scripts/run_contract_emulator.sh
export FIRESTORE_EMULATOR_HOST=localhost:8080
export GOOGLE_CLOUD_PROJECT=demo-test
export FIRESTORE_EMULATOR_LOG=/tmp/firestore-emulator.log
./scripts/run_contract_emulator.sh
Original Contributors
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fake_firestore-0.13.0.tar.gz.
File metadata
- Download URL: fake_firestore-0.13.0.tar.gz
- Upload date:
- Size: 16.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65cc4960cd4b7c440cd9ca30d7120b68f8eba1b22187a64f0f345236d161e50c
|
|
| MD5 |
57d86ba6dc3518b40119d8332f45b8dc
|
|
| BLAKE2b-256 |
37d71b4365a418bb89d7216bd1ee98234214faea63dfad5b74bda66ad9e4eb6b
|
File details
Details for the file fake_firestore-0.13.0-py3-none-any.whl.
File metadata
- Download URL: fake_firestore-0.13.0-py3-none-any.whl
- Upload date:
- Size: 22.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2845b300b75b32b096eb44810404ffd5b2242eef4227986ea7718928480d1234
|
|
| MD5 |
3942c55aa00996876fc3020df419bda7
|
|
| BLAKE2b-256 |
d0c61212908bdb9375b9cd16dd2b28cc9c707f3ff3a2e862a886748859af2d05
|