# Python Mock Firestore
An in-memory implementation of the [Python client library](https://github.com/googleapis/python-firestore) for Google Cloud Firestore, intended for use in tests to replace the real thing. This project is only a partial implementation of the real client library.
To install:
`pip install mock-firestore`
Python 3.6+ is required for it to work.
## Usage
### Sync
```python
db = firestore.Client()
mock_db = MockFirestore()
# Can be used in the same way as a firestore.Client() object would be, e.g.:
db.collection('users').get()
mock_db.collection('users').get()
```
### Async
```python
db = firestore.AsyncClient()
mock_db = AsyncMockFirestore()
await db.collection('users').get()
await mock_db.collection('users').get()
```
To reset the store to an empty state, use the `reset()` method:
```python
mock_db = MockFirestore()
mock_db.reset()
```
or the equivalent method of `AsyncMockFirestore`
## Supported operations
### Sync
```python
mock_db = MockFirestore()
# Collections
mock_db.collections()
mock_db.collection('users')
mock_db.collection('users').get()
mock_db.collection('users').list_documents()
mock_db.collection('users').stream()
# Documents
mock_db.collection('users').document()
mock_db.collection('users').document('alovelace')
mock_db.collection('users').document('alovelace').id
mock_db.collection('users').document('alovelace').parent
mock_db.collection('users').document('alovelace').update_time
mock_db.collection('users').document('alovelace').read_time
mock_db.collection('users').document('alovelace').get()
mock_db.collection('users').document('alovelace').get().exists
mock_db.collection('users').document('alovelace').get().to_dict()
mock_db.collection('users').document('alovelace').set({
'first': 'Ada',
'last': 'Lovelace'
})
mock_db.collection('users').document('alovelace').set({'first': 'Augusta Ada'}, merge=True)
mock_db.collection('users').document('alovelace').update({'born': 1815})
mock_db.collection('users').document('alovelace').update({'favourite.color': 'red'})
mock_db.collection('users').document('alovelace').update({'associates': ['Charles Babbage', 'Michael Faraday']})
mock_db.collection('users').document('alovelace').collection('friends')
mock_db.collection('users').document('alovelace').delete()
mock_db.collection('users').document('alovelace').delete()
mock_db.collection('users').add({'first': 'Ada', 'last': 'Lovelace'}, 'alovelace')
mock_db.get_all([mock_db.collection('users').document('alovelace')])
mock_db.document('users/alovelace')
mock_db.document('users/alovelace').update({'born': 1815})
mock_db.collection('users/alovelace/friends')
# Querying
mock_db.collection('users').order_by('born').get()
mock_db.collection('users').order_by('born', direction='DESCENDING').get()
mock_db.collection('users').limit(5).get()
mock_db.collection('users').where('born', '==', 1815).get()
mock_db.collection('users').where('born', '!=', 1815).get()
mock_db.collection('users').where('born', '<', 1815).get()
mock_db.collection('users').where('born', '>', 1815).get()
mock_db.collection('users').where('born', '<=', 1815).get()
mock_db.collection('users').where('born', '>=', 1815).get()
mock_db.collection('users').where('born', 'in', [1815, 1900]).stream()
mock_db.collection('users').where('born', 'in', [1815, 1900]).stream()
mock_db.collection('users').where('associates', 'array_contains', 'Charles Babbage').stream()
mock_db.collection('users').where('associates', 'array_contains_any', ['Charles Babbage', 'Michael Faraday']).stream()
# Transforms
mock_db.collection('users').document('alovelace').update({'likes': firestore.Increment(1)})
mock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayUnion(['Andrew Cross', 'Charles Wheatstone'])})
mock_db.collection('users').document('alovelace').update({firestore.DELETE_FIELD: "born"})
mock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayRemove(['Andrew Cross'])})
# Cursors
mock_db.collection('users').start_after({'id': 'alovelace'}).stream()
mock_db.collection('users').end_before({'id': 'alovelace'}).stream()
mock_db.collection('users').end_at({'id': 'alovelace'}).stream()
mock_db.collection('users').start_after(mock_db.collection('users').document('alovelace')).stream()
# Transactions
transaction = mock_db.transaction()
transaction.id
transaction.in_progress
transaction.get(mock_db.collection('users').where('born', '==', 1815))
transaction.get(mock_db.collection('users').document('alovelace'))
transaction.get_all([mock_db.collection('users').document('alovelace')])
transaction.set(mock_db.collection('users').document('alovelace'), {'born': 1815})
transaction.update(mock_db.collection('users').document('alovelace'), {'born': 1815})
transaction.delete(mock_db.collection('users').document('alovelace'))
transaction.commit()
```
### Async
*(Where usage of those differs from the above)*
*Note: all iterator methods like `stream` or `list_documents` in AsyncMockFirestore and its associated async classes
return asynchronous iterators, so when iterating over them,
`async for` syntax must be used.*
```python
mock_db = AsyncMockFirestore()
# Collections
await mock_db.collection('users').get()
# async iterators
[doc_ref async for doc_ref in mock_db.collection('users').list_documents()]
[doc_snapshot async for doc_snapshot in mock_db.collection('users').stream()]
# Documents
await mock_db.collection('users').document('alovelace').get()
doc_snapshot = await mock_db.collection('users').document('alovelace').get()
doc_snapshot.exists
doc_snapshot.to_dict()
await mock_db.collection('users').document('alovelace').set({
'first': 'Ada',
'last': 'Lovelace'
})
await mock_db.collection('users').document('alovelace').set({'first': 'Augusta Ada'}, merge=True)
await mock_db.collection('users').document('alovelace').update({'born': 1815})
await mock_db.collection('users').document('alovelace').update({'favourite.color': 'red'})
await mock_db.collection('users').document('alovelace').update({'associates': ['Charles Babbage', 'Michael Faraday']})
await mock_db.collection('users').document('alovelace').delete()
await mock_db.collection('users').document('alovelace').delete()
await mock_db.collection('users').add({'first': 'Ada', 'last': 'Lovelace'}, 'alovelace')
await mock_db.get_all([mock_db.collection('users').document('alovelace')])
await mock_db.document('users/alovelace').update({'born': 1815})
# Querying
await mock_db.collection('users').order_by('born').get()
await mock_db.collection('users').order_by('born', direction='DESCENDING').get()
await mock_db.collection('users').limit(5).get()
await mock_db.collection('users').where('born', '==', 1815).get()
await mock_db.collection('users').where('born', '!=', 1815).get()
await mock_db.collection('users').where('born', '<', 1815).get()
await mock_db.collection('users').where('born', '>', 1815).get()
await mock_db.collection('users').where('born', '<=', 1815).get()
await mock_db.collection('users').where('born', '>=', 1815).get()
# async iterators
mock_db.collection('users').where('born', 'in', [1815, 1900]).stream()
mock_db.collection('users').where('born', 'in', [1815, 1900]).stream()
mock_db.collection('users').where('associates', 'array_contains', 'Charles Babbage').stream()
mock_db.collection('users').where('associates', 'array_contains_any', ['Charles Babbage', 'Michael Faraday']).stream()
# Transforms
await mock_db.collection('users').document('alovelace').update({'likes': firestore.Increment(1)})
await mock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayUnion(['Andrew Cross', 'Charles Wheatstone'])})
await mock_db.collection('users').document('alovelace').update({firestore.DELETE_FIELD: "born"})
await mock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayRemove(['Andrew Cross'])})
# Transactions
transaction = mock_db.transaction()
transaction.id
transaction.in_progress
await transaction.get(mock_db.collection('users').where('born', '==', 1815))
await transaction.get(mock_db.collection('users').document('alovelace'))
await transaction.get_all([mock_db.collection('users').document('alovelace')])
transaction.set(mock_db.collection('users').document('alovelace'), {'born': 1815})
transaction.update(mock_db.collection('users').document('alovelace'), {'born': 1815})
transaction.delete(mock_db.collection('users').document('alovelace'))
await transaction.commit()
```
## Running the tests
* Create and activate a virtualenv with a Python version of at least 3.6
* Install dependencies with `pip install -r requirements-dev-minimal.txt`
* Run tests with `python -m unittest discover tests -t /`
## Contributors
* [Matt Dowds](https://github.com/mdowds)
* [Chris Tippett](https://github.com/christippett)
* [Anna Melnikov](https://github.com/anna-hope)
* [Ben Riggleman](https://github.com/briggleman)
* [Steve Atwell](https://github.com/satwell)
* [ahti123](https://github.com/ahti123)
* [Billcountry Mwaniki](https://github.com/Billcountry)
* [Lucas Moura](https://github.com/lsantosdemoura)
* [Kamil Romaszko](https://github.com/kromash)
* [Anna Melnikov](https://github.com/notnami)
* [Carl Chipperfield](https://github.com/carl-chipperfield)
* [Aaron Loo](https://github.com/domanchi)
* [Kristof Krenn](https://github.com/KrennKristof)
* [Ben Phillips](https://github.com/tavva)
* [Rene Delgado](https://github.com/RDelg)
* [klanderson](https://github.com/klanderson)
* [William Li](https://github.com/wli)
* [Ugo Marchand](https://github.com/UgoM)
* [Bryce Thornton](https://github.com/brycethornton)
Raw data
{
"_id": null,
"home_page": "https://github.com/mdowds/mock-firestore",
"name": "mock-firestore-async",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "Matt Dowds",
"author_email": "",
"download_url": "",
"platform": null,
"description": "# Python Mock Firestore\n\nAn in-memory implementation of the [Python client library](https://github.com/googleapis/python-firestore) for Google Cloud Firestore, intended for use in tests to replace the real thing. This project is only a partial implementation of the real client library.\n\nTo install:\n\n`pip install mock-firestore`\n\nPython 3.6+ is required for it to work.\n\n## Usage\n\n### Sync\n\n```python\ndb = firestore.Client()\nmock_db = MockFirestore()\n\n# Can be used in the same way as a firestore.Client() object would be, e.g.:\ndb.collection('users').get()\nmock_db.collection('users').get()\n```\n\n### Async\n\n```python\ndb = firestore.AsyncClient()\nmock_db = AsyncMockFirestore()\n\nawait db.collection('users').get()\nawait mock_db.collection('users').get()\n```\n\nTo reset the store to an empty state, use the `reset()` method:\n```python\nmock_db = MockFirestore()\nmock_db.reset()\n```\n\nor the equivalent method of `AsyncMockFirestore`\n\n## Supported operations\n\n### Sync\n\n```python\nmock_db = MockFirestore()\n\n# Collections\nmock_db.collections()\nmock_db.collection('users')\nmock_db.collection('users').get()\nmock_db.collection('users').list_documents()\nmock_db.collection('users').stream()\n\n# Documents\nmock_db.collection('users').document()\nmock_db.collection('users').document('alovelace')\nmock_db.collection('users').document('alovelace').id\nmock_db.collection('users').document('alovelace').parent\nmock_db.collection('users').document('alovelace').update_time\nmock_db.collection('users').document('alovelace').read_time\nmock_db.collection('users').document('alovelace').get()\nmock_db.collection('users').document('alovelace').get().exists\nmock_db.collection('users').document('alovelace').get().to_dict()\nmock_db.collection('users').document('alovelace').set({\n 'first': 'Ada',\n 'last': 'Lovelace'\n})\nmock_db.collection('users').document('alovelace').set({'first': 'Augusta Ada'}, merge=True)\nmock_db.collection('users').document('alovelace').update({'born': 1815})\nmock_db.collection('users').document('alovelace').update({'favourite.color': 'red'})\nmock_db.collection('users').document('alovelace').update({'associates': ['Charles Babbage', 'Michael Faraday']})\nmock_db.collection('users').document('alovelace').collection('friends')\nmock_db.collection('users').document('alovelace').delete()\nmock_db.collection('users').document('alovelace').delete()\nmock_db.collection('users').add({'first': 'Ada', 'last': 'Lovelace'}, 'alovelace')\nmock_db.get_all([mock_db.collection('users').document('alovelace')])\nmock_db.document('users/alovelace')\nmock_db.document('users/alovelace').update({'born': 1815})\nmock_db.collection('users/alovelace/friends')\n\n# Querying\nmock_db.collection('users').order_by('born').get()\nmock_db.collection('users').order_by('born', direction='DESCENDING').get()\nmock_db.collection('users').limit(5).get()\nmock_db.collection('users').where('born', '==', 1815).get()\nmock_db.collection('users').where('born', '!=', 1815).get()\nmock_db.collection('users').where('born', '<', 1815).get()\nmock_db.collection('users').where('born', '>', 1815).get()\nmock_db.collection('users').where('born', '<=', 1815).get()\nmock_db.collection('users').where('born', '>=', 1815).get()\nmock_db.collection('users').where('born', 'in', [1815, 1900]).stream()\nmock_db.collection('users').where('born', 'in', [1815, 1900]).stream()\nmock_db.collection('users').where('associates', 'array_contains', 'Charles Babbage').stream()\nmock_db.collection('users').where('associates', 'array_contains_any', ['Charles Babbage', 'Michael Faraday']).stream()\n\n# Transforms\nmock_db.collection('users').document('alovelace').update({'likes': firestore.Increment(1)})\nmock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayUnion(['Andrew Cross', 'Charles Wheatstone'])})\nmock_db.collection('users').document('alovelace').update({firestore.DELETE_FIELD: \"born\"})\nmock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayRemove(['Andrew Cross'])})\n\n# Cursors\nmock_db.collection('users').start_after({'id': 'alovelace'}).stream()\nmock_db.collection('users').end_before({'id': 'alovelace'}).stream()\nmock_db.collection('users').end_at({'id': 'alovelace'}).stream()\nmock_db.collection('users').start_after(mock_db.collection('users').document('alovelace')).stream()\n\n# Transactions\ntransaction = mock_db.transaction()\ntransaction.id\ntransaction.in_progress\ntransaction.get(mock_db.collection('users').where('born', '==', 1815))\ntransaction.get(mock_db.collection('users').document('alovelace'))\ntransaction.get_all([mock_db.collection('users').document('alovelace')])\ntransaction.set(mock_db.collection('users').document('alovelace'), {'born': 1815})\ntransaction.update(mock_db.collection('users').document('alovelace'), {'born': 1815})\ntransaction.delete(mock_db.collection('users').document('alovelace'))\ntransaction.commit()\n```\n\n### Async\n*(Where usage of those differs from the above)*\n\n*Note: all iterator methods like `stream` or `list_documents` in AsyncMockFirestore and its associated async classes \nreturn asynchronous iterators, so when iterating over them,\n`async for` syntax must be used.*\n\n```python\nmock_db = AsyncMockFirestore()\n\n# Collections\nawait mock_db.collection('users').get()\n\n# async iterators\n[doc_ref async for doc_ref in mock_db.collection('users').list_documents()]\n[doc_snapshot async for doc_snapshot in mock_db.collection('users').stream()]\n\n# Documents\nawait mock_db.collection('users').document('alovelace').get()\ndoc_snapshot = await mock_db.collection('users').document('alovelace').get()\ndoc_snapshot.exists\ndoc_snapshot.to_dict()\nawait mock_db.collection('users').document('alovelace').set({\n 'first': 'Ada',\n 'last': 'Lovelace'\n})\nawait mock_db.collection('users').document('alovelace').set({'first': 'Augusta Ada'}, merge=True)\nawait mock_db.collection('users').document('alovelace').update({'born': 1815})\nawait mock_db.collection('users').document('alovelace').update({'favourite.color': 'red'})\nawait mock_db.collection('users').document('alovelace').update({'associates': ['Charles Babbage', 'Michael Faraday']})\nawait mock_db.collection('users').document('alovelace').delete()\nawait mock_db.collection('users').document('alovelace').delete()\nawait mock_db.collection('users').add({'first': 'Ada', 'last': 'Lovelace'}, 'alovelace')\nawait mock_db.get_all([mock_db.collection('users').document('alovelace')])\nawait mock_db.document('users/alovelace').update({'born': 1815})\n\n# Querying\nawait mock_db.collection('users').order_by('born').get()\nawait mock_db.collection('users').order_by('born', direction='DESCENDING').get()\nawait mock_db.collection('users').limit(5).get()\nawait mock_db.collection('users').where('born', '==', 1815).get()\nawait mock_db.collection('users').where('born', '!=', 1815).get()\nawait mock_db.collection('users').where('born', '<', 1815).get()\nawait mock_db.collection('users').where('born', '>', 1815).get()\nawait mock_db.collection('users').where('born', '<=', 1815).get()\nawait mock_db.collection('users').where('born', '>=', 1815).get()\n\n# async iterators\nmock_db.collection('users').where('born', 'in', [1815, 1900]).stream()\nmock_db.collection('users').where('born', 'in', [1815, 1900]).stream()\nmock_db.collection('users').where('associates', 'array_contains', 'Charles Babbage').stream()\nmock_db.collection('users').where('associates', 'array_contains_any', ['Charles Babbage', 'Michael Faraday']).stream()\n\n# Transforms\nawait mock_db.collection('users').document('alovelace').update({'likes': firestore.Increment(1)})\nawait mock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayUnion(['Andrew Cross', 'Charles Wheatstone'])})\nawait mock_db.collection('users').document('alovelace').update({firestore.DELETE_FIELD: \"born\"})\nawait mock_db.collection('users').document('alovelace').update({'associates': firestore.ArrayRemove(['Andrew Cross'])})\n\n\n# Transactions\ntransaction = mock_db.transaction()\ntransaction.id\ntransaction.in_progress\nawait transaction.get(mock_db.collection('users').where('born', '==', 1815))\nawait transaction.get(mock_db.collection('users').document('alovelace'))\nawait transaction.get_all([mock_db.collection('users').document('alovelace')])\n\ntransaction.set(mock_db.collection('users').document('alovelace'), {'born': 1815})\ntransaction.update(mock_db.collection('users').document('alovelace'), {'born': 1815})\ntransaction.delete(mock_db.collection('users').document('alovelace'))\nawait transaction.commit()\n```\n\n\n## Running the tests\n* Create and activate a virtualenv with a Python version of at least 3.6\n* Install dependencies with `pip install -r requirements-dev-minimal.txt`\n* Run tests with `python -m unittest discover tests -t /`\n\n## Contributors\n\n* [Matt Dowds](https://github.com/mdowds)\n* [Chris Tippett](https://github.com/christippett)\n* [Anna Melnikov](https://github.com/anna-hope)\n* [Ben Riggleman](https://github.com/briggleman)\n* [Steve Atwell](https://github.com/satwell)\n* [ahti123](https://github.com/ahti123)\n* [Billcountry Mwaniki](https://github.com/Billcountry)\n* [Lucas Moura](https://github.com/lsantosdemoura)\n* [Kamil Romaszko](https://github.com/kromash)\n* [Anna Melnikov](https://github.com/notnami)\n* [Carl Chipperfield](https://github.com/carl-chipperfield)\n* [Aaron Loo](https://github.com/domanchi)\n* [Kristof Krenn](https://github.com/KrennKristof)\n* [Ben Phillips](https://github.com/tavva)\n* [Rene Delgado](https://github.com/RDelg)\n* [klanderson](https://github.com/klanderson)\n* [William Li](https://github.com/wli)\n* [Ugo Marchand](https://github.com/UgoM)\n* [Bryce Thornton](https://github.com/brycethornton)\n",
"bugtrack_url": null,
"license": "",
"summary": "In-memory implementation of Google Cloud Firestore for use in tests",
"version": "0.11.3",
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "cb467498ba3068d18e33ce2260348e3f",
"sha256": "4c0497dd1c3b1de253fe1e855a195ca52784b4a80bb9a6d23bbe66dfde16dd4a"
},
"downloads": -1,
"filename": "mock_firestore_async-0.11.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cb467498ba3068d18e33ce2260348e3f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 27620,
"upload_time": "2022-12-12T08:21:04",
"upload_time_iso_8601": "2022-12-12T08:21:04.089728Z",
"url": "https://files.pythonhosted.org/packages/3e/f5/8f1a69983f15366cecdc0ec1b23516675ffcff3231d9d40fcb09a42c8f84/mock_firestore_async-0.11.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-12-12 08:21:04",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "mdowds",
"github_project": "mock-firestore",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "mock-firestore-async"
}