Repository: firebase/firebase-admin-python

Issue:
[FR] Add multiple Firestore support
**Is your feature request related to a problem? Please describe.**
I have a Firebase project that utilised the recent feature to allow for multiple Firestores for a single project and am using Python to perform some firebase admin function, but it currently doesn't allow access to any non-default databases.

**Describe the solution you'd like**
I would like to be able to specify which Firestore to connect to when initializing the connection.

**Describe alternatives you've considered**
Cannot find any alternative to this feature with this package. The only other alternative would be to use Node.js SDK instead since it does have this feature.

Discussion:
@google-oss-bot: I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.@liamvdv: Update?@juansep17: Hello, are you working on this?

Solution patch:
diff --git a/firebase_admin/firestore.py b/firebase_admin/firestore.py
index 224ba3a..52ea906 100644
--- a/firebase_admin/firestore.py
+++ b/firebase_admin/firestore.py
@@ -18,59 +18,75 @@ This module contains utilities for accessing the Google Cloud Firestore database
 Firebase apps. This requires the ``google-cloud-firestore`` Python module.
 """
 
+from __future__ import annotations
+from typing import Optional, Dict
+from firebase_admin import App
+from firebase_admin import _utils
+
 try:
-    from google.cloud import firestore # pylint: disable=import-error,no-name-in-module
+    from google.cloud import firestore
+    from google.cloud.firestore_v1.base_client import DEFAULT_DATABASE
     existing = globals().keys()
     for key, value in firestore.__dict__.items():
         if not key.startswith('_') and key not in existing:
             globals()[key] = value
-except ImportError:
+except ImportError as error:
     raise ImportError('Failed to import the Cloud Firestore library for Python. Make sure '
-                      'to install the "google-cloud-firestore" module.')
-
-from firebase_admin import _utils
+                      'to install the "google-cloud-firestore" module.') from error
 
 
 _FIRESTORE_ATTRIBUTE = '_firestore'
 
 
-def client(app=None) -> firestore.Client:
+def client(app: Optional[App] = None, database_id: Optional[str] = None) -> firestore.Client:
     """Returns a client that can be used to interact with Google Cloud Firestore.
 
     Args:
-      app: An App instance (optional).
+        app: An App instance (optional).
+        database_id: The database ID of the Google Cloud Firestore database to be used.
+            Defaults to the default Firestore database ID if not specified or an empty string
+            (optional).
 
     Returns:
-      google.cloud.firestore.Firestore: A `Firestore Client`_.
+        google.cloud.firestore.Firestore: A `Firestore Client`_.
 
     Raises:
-      ValueError: If a project ID is not specified either via options, credentials or
-          environment variables, or if the specified project ID is not a valid string.
+        ValueError: If the specified database ID is not a valid string, or if a project ID is not
+            specified either via options, credentials or environment variables, or if the specified
+            project ID is not a valid string.
 
-    .. _Firestore Client: https://googlecloudplatform.github.io/google-cloud-python/latest\
-          /firestore/client.html
+    .. _Firestore Client: https://cloud.google.com/python/docs/reference/firestore/latest/\
+        google.cloud.firestore_v1.client.Client
     """
-    fs_client = _utils.get_app_service(app, _FIRESTORE_ATTRIBUTE, _FirestoreClient.from_app)
-    return fs_client.get()
-
-
-class _FirestoreClient:
-    """Holds a Google Cloud Firestore client instance."""
-
-    def __init__(self, credentials, project):
-        self._client = firestore.Client(credentials=credentials, project=project)
-
-    def get(self):
-        return self._client
-
-    @classmethod
-    def from_app(cls, app):
-        """Creates a new _FirestoreClient for the specified app."""
-        credentials = app.credential.get_credential()
-        project = app.project_id
-        if not project:
-            raise ValueError(
-                'Project ID is required to access Firestore. Either set the projectId option, '
-                'or use service account credentials. Alternatively, set the GOOGLE_CLOUD_PROJECT '
-                'environment variable.')
-        return _FirestoreClient(credentials, project)
+    # Validate database_id
+    if database_id is not None and not isinstance(database_id, str):
+        raise ValueError(f'database_id "{database_id}" must be a string or None.')
+    fs_service = _utils.get_app_service(app, _FIRESTORE_ATTRIBUTE, _FirestoreService)
+    return fs_service.get_client(database_id)
+
+
+class _FirestoreService:
+    """Service that maintains a collection of firestore clients."""
+
+    def __init__(self, app: App) -> None:
+        self._app: App = app
+        self._clients: Dict[str, firestore.Client] = {}
+
+    def get_client(self, database_id: Optional[str]) -> firestore.Client:
+        """Creates a client based on the database_id. These clients are cached."""
+        database_id = database_id or DEFAULT_DATABASE
+        if database_id not in self._clients:
+            # Create a new client and cache it in _clients
+            credentials = self._app.credential.get_credential()
+            project = self._app.project_id
+            if not project:
+                raise ValueError(
+                    'Project ID is required to access Firestore. Either set the projectId option, '
+                    'or use service account credentials. Alternatively, set the '
+                    'GOOGLE_CLOUD_PROJECT environment variable.')
+
+            fs_client = firestore.Client(
+                credentials=credentials, project=project, database=database_id)
+            self._clients[database_id] = fs_client
+
+        return self._clients[database_id]
diff --git a/firebase_admin/firestore_async.py b/firebase_admin/firestore_async.py
index a63d5a7..4a197e9 100644
--- a/firebase_admin/firestore_async.py
+++ b/firebase_admin/firestore_async.py
@@ -18,65 +18,75 @@ This module contains utilities for asynchronusly accessing the Google Cloud Fire
 associated with Firebase apps. This requires the ``google-cloud-firestore`` Python module.
 """
 
-from typing import Type
-
-from firebase_admin import (
-    App,
-    _utils,
-)
-from firebase_admin.credentials import Base
+from __future__ import annotations
+from typing import Optional, Dict
+from firebase_admin import App
+from firebase_admin import _utils
 
 try:
-    from google.cloud import firestore # type: ignore # pylint: disable=import-error,no-name-in-module
+    from google.cloud import firestore
+    from google.cloud.firestore_v1.base_client import DEFAULT_DATABASE
     existing = globals().keys()
     for key, value in firestore.__dict__.items():
         if not key.startswith('_') and key not in existing:
             globals()[key] = value
-except ImportError:
+except ImportError as error:
     raise ImportError('Failed to import the Cloud Firestore library for Python. Make sure '
-                      'to install the "google-cloud-firestore" module.')
+                      'to install the "google-cloud-firestore" module.') from error
+
 
 _FIRESTORE_ASYNC_ATTRIBUTE: str = '_firestore_async'
 
 
-def client(app: App = None) -> firestore.AsyncClient:
+def client(app: Optional[App] = None, database_id: Optional[str] = None) -> firestore.AsyncClient:
     """Returns an async client that can be used to interact with Google Cloud Firestore.
 
     Args:
-      app: An App instance (optional).
+        app: An App instance (optional).
+        database_id: The database ID of the Google Cloud Firestore database to be used.
+            Defaults to the default Firestore database ID if not specified or an empty string
+            (optional).
 
     Returns:
-      google.cloud.firestore.Firestore_Async: A `Firestore Async Client`_.
+        google.cloud.firestore.Firestore_Async: A `Firestore Async Client`_.
 
     Raises:
-      ValueError: If a project ID is not specified either via options, credentials or
-          environment variables, or if the specified project ID is not a valid string.
+        ValueError: If the specified database ID is not a valid string, or if a project ID is not
+            specified either via options, credentials or environment variables, or if the specified
+            project ID is not a valid string.
 
-    .. _Firestore Async Client: https://googleapis.dev/python/firestore/latest/client.html
+    .. _Firestore Async Client: https://cloud.google.com/python/docs/reference/firestore/latest/\
+        google.cloud.firestore_v1.async_client.AsyncClient
     """
-    fs_client = _utils.get_app_service(
-        app, _FIRESTORE_ASYNC_ATTRIBUTE, _FirestoreAsyncClient.from_app)
-    return fs_client.get()
-
-
-class _FirestoreAsyncClient:
-    """Holds a Google Cloud Firestore Async Client instance."""
-
-    def __init__(self, credentials: Type[Base], project: str) -> None:
-        self._client = firestore.AsyncClient(credentials=credentials, project=project)
-
-    def get(self) -> firestore.AsyncClient:
-        return self._client
-
-    @classmethod
-    def from_app(cls, app: App) -> "_FirestoreAsyncClient":
-        # Replace remove future reference quotes by importing annotations in Python 3.7+ b/238779406
-        """Creates a new _FirestoreAsyncClient for the specified app."""
-        credentials = app.credential.get_credential()
-        project = app.project_id
-        if not project:
-            raise ValueError(
-                'Project ID is required to access Firestore. Either set the projectId option, '
-                'or use service account credentials. Alternatively, set the GOOGLE_CLOUD_PROJECT '
-                'environment variable.')
-        return _FirestoreAsyncClient(credentials, project)
+    # Validate database_id
+    if database_id is not None and not isinstance(database_id, str):
+        raise ValueError(f'database_id "{database_id}" must be a string or None.')
+
+    fs_service = _utils.get_app_service(app, _FIRESTORE_ASYNC_ATTRIBUTE, _FirestoreAsyncService)
+    return fs_service.get_client(database_id)
+
+class _FirestoreAsyncService:
+    """Service that maintains a collection of firestore async clients."""
+
+    def __init__(self, app: App) -> None:
+        self._app: App = app
+        self._clients: Dict[str, firestore.AsyncClient] = {}
+
+    def get_client(self, database_id: Optional[str]) -> firestore.AsyncClient:
+        """Creates an async client based on the database_id. These clients are cached."""
+        database_id = database_id or DEFAULT_DATABASE
+        if database_id not in self._clients:
+            # Create a new client and cache it in _clients
+            credentials = self._app.credential.get_credential()
+            project = self._app.project_id
+            if not project:
+                raise ValueError(
+                    'Project ID is required to access Firestore. Either set the projectId option, '
+                    'or use service account credentials. Alternatively, set the '
+                    'GOOGLE_CLOUD_PROJECT environment variable.')
+
+            fs_client = firestore.AsyncClient(
+                credentials=credentials, project=project, database=database_id)
+            self._clients[database_id] = fs_client
+
+        return self._clients[database_id]


Test patch:
diff --git a/integration/test_firestore.py b/integration/test_firestore.py
index 2bc3d19..fd39d9b 100644
--- a/integration/test_firestore.py
+++ b/integration/test_firestore.py
@@ -17,6 +17,20 @@ import datetime
 
 from firebase_admin import firestore
 
+_CITY = {
+        'name': u'Mountain View',
+        'country': u'USA',
+        'population': 77846,
+        'capital': False
+    }
+
+_MOVIE = {
+        'Name': u'Interstellar',
+        'Year': 2014,
+        'Runtime': u'2h 49m',
+        'Academy Award Winner': True
+    }
+
 
 def test_firestore():
     client = firestore.client()
@@ -35,6 +49,47 @@ def test_firestore():
     doc.delete()
     assert doc.get().exists is False
 
+def test_firestore_explicit_database_id():
+    client = firestore.client(database_id='testing-database')
+    expected = _CITY
+    doc = client.collection('cities').document()
+    doc.set(expected)
+
+    data = doc.get()
+    assert data.to_dict() == expected
+
+    doc.delete()
+    data = doc.get()
+    assert data.exists is False
+
+def test_firestore_multi_db():
+    city_client = firestore.client()
+    movie_client = firestore.client(database_id='testing-database')
+
+    expected_city = _CITY
+    expected_movie = _MOVIE
+
+    city_doc = city_client.collection('cities').document()
+    movie_doc = movie_client.collection('movies').document()
+
+    city_doc.set(expected_city)
+    movie_doc.set(expected_movie)
+
+    city_data = city_doc.get()
+    movie_data = movie_doc.get()
+
+    assert city_data.to_dict() == expected_city
+    assert movie_data.to_dict() == expected_movie
+
+    city_doc.delete()
+    movie_doc.delete()
+
+    city_data = city_doc.get()
+    movie_data = movie_doc.get()
+
+    assert city_data.exists is False
+    assert movie_data.exists is False
+
 def test_server_timestamp():
     client = firestore.client()
     expected = {
diff --git a/integration/test_firestore_async.py b/integration/test_firestore_async.py
index 2a5b932..8b73dda 100644
--- a/integration/test_firestore_async.py
+++ b/integration/test_firestore_async.py
@@ -13,20 +13,31 @@
 # limitations under the License.
 
 """Integration tests for firebase_admin.firestore_async module."""
+import asyncio
 import datetime
 import pytest
 
 from firebase_admin import firestore_async
 
-@pytest.mark.asyncio
-async def test_firestore_async():
-    client = firestore_async.client()
-    expected = {
+_CITY = {
         'name': u'Mountain View',
         'country': u'USA',
         'population': 77846,
         'capital': False
     }
+
+_MOVIE = {
+        'Name': u'Interstellar',
+        'Year': 2014,
+        'Runtime': u'2h 49m',
+        'Academy Award Winner': True
+    }
+
+
+@pytest.mark.asyncio
+async def test_firestore_async():
+    client = firestore_async.client()
+    expected = _CITY
     doc = client.collection('cities').document()
     await doc.set(expected)
 
@@ -37,6 +48,56 @@ async def test_firestore_async():
     data = await doc.get()
     assert data.exists is False
 
+@pytest.mark.asyncio
+async def test_firestore_async_explicit_database_id():
+    client = firestore_async.client(database_id='testing-database')
+    expected = _CITY
+    doc = client.collection('cities').document()
+    await doc.set(expected)
+
+    data = await doc.get()
+    assert data.to_dict() == expected
+
+    await doc.delete()
+    data = await doc.get()
+    assert data.exists is False
+
+@pytest.mark.asyncio
+async def test_firestore_async_multi_db():
+    city_client = firestore_async.client()
+    movie_client = firestore_async.client(database_id='testing-database')
+
+    expected_city = _CITY
+    expected_movie = _MOVIE
+
+    city_doc = city_client.collection('cities').document()
+    movie_doc = movie_client.collection('movies').document()
+
+    await asyncio.gather(
+        city_doc.set(expected_city),
+        movie_doc.set(expected_movie)
+    )
+
+    data = await asyncio.gather(
+        city_doc.get(),
+        movie_doc.get()
+    )
+
+    assert data[0].to_dict() == expected_city
+    assert data[1].to_dict() == expected_movie
+
+    await asyncio.gather(
+        city_doc.delete(),
+        movie_doc.delete()
+    )
+
+    data = await asyncio.gather(
+        city_doc.get(),
+        movie_doc.get()
+    )
+    assert data[0].exists is False
+    assert data[1].exists is False
+
 @pytest.mark.asyncio
 async def test_server_timestamp():
     client = firestore_async.client()
diff --git a/tests/test_firestore.py b/tests/test_firestore.py
index 768eb63..47debd5 100644
--- a/tests/test_firestore.py
+++ b/tests/test_firestore.py
@@ -50,6 +50,7 @@ class TestFirestore:
         client = firestore.client()
         assert client is not None
         assert client.project == 'explicit-project-id'
+        assert client._database == '(default)'
 
     def test_project_id_with_explicit_app(self):
         cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
@@ -57,6 +58,7 @@ class TestFirestore:
         client = firestore.client(app=app)
         assert client is not None
         assert client.project == 'explicit-project-id'
+        assert client._database == '(default)'
 
     def test_service_account(self):
         cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
@@ -64,6 +66,7 @@ class TestFirestore:
         client = firestore.client()
         assert client is not None
         assert client.project == 'mock-project-id'
+        assert client._database == '(default)'
 
     def test_service_account_with_explicit_app(self):
         cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
@@ -71,6 +74,89 @@ class TestFirestore:
         client = firestore.client(app=app)
         assert client is not None
         assert client.project == 'mock-project-id'
+        assert client._database == '(default)'
+
+    @pytest.mark.parametrize('database_id', [123, False, True, {}, []])
+    def test_invalid_database_id(self, database_id):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        with pytest.raises(ValueError) as excinfo:
+            firestore.client(database_id=database_id)
+        assert str(excinfo.value) == f'database_id "{database_id}" must be a string or None.'
+
+    def test_database_id(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id = 'mock-database-id'
+        client = firestore.client(database_id=database_id)
+        assert client is not None
+        assert client.project == 'mock-project-id'
+        assert client._database == 'mock-database-id'
+
+    @pytest.mark.parametrize('database_id', ['', '(default)', None])
+    def test_database_id_with_default_id(self, database_id):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        client = firestore.client(database_id=database_id)
+        assert client is not None
+        assert client.project == 'mock-project-id'
+        assert client._database == '(default)'
+
+    def test_database_id_with_explicit_app(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        app = firebase_admin.initialize_app(cred)
+        database_id = 'mock-database-id'
+        client = firestore.client(app, database_id)
+        assert client is not None
+        assert client.project == 'mock-project-id'
+        assert client._database == 'mock-database-id'
+
+    def test_database_id_with_multi_db(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id_1 = 'mock-database-id-1'
+        database_id_2 = 'mock-database-id-2'
+        client_1 = firestore.client(database_id=database_id_1)
+        client_2 = firestore.client(database_id=database_id_2)
+        assert (client_1 is not None) and (client_2 is not None)
+        assert client_1 is not client_2
+        assert client_1.project == 'mock-project-id'
+        assert client_2.project == 'mock-project-id'
+        assert client_1._database == 'mock-database-id-1'
+        assert client_2._database == 'mock-database-id-2'
+
+    def test_database_id_with_multi_db_uses_cache(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id = 'mock-database-id'
+        client_1 = firestore.client(database_id=database_id)
+        client_2 = firestore.client(database_id=database_id)
+        assert (client_1 is not None) and (client_2 is not None)
+        assert client_1 is client_2
+        assert client_1.project == 'mock-project-id'
+        assert client_2.project == 'mock-project-id'
+        assert client_1._database == 'mock-database-id'
+        assert client_2._database == 'mock-database-id'
+
+    def test_database_id_with_multi_db_uses_cache_default(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id_1 = ''
+        database_id_2 = '(default)'
+        client_1 = firestore.client(database_id=database_id_1)
+        client_2 = firestore.client(database_id=database_id_2)
+        client_3 = firestore.client()
+        assert (client_1 is not None) and (client_2 is not None) and (client_3 is not None)
+        assert client_1 is client_2
+        assert client_1 is client_3
+        assert client_2 is client_3
+        assert client_1.project == 'mock-project-id'
+        assert client_2.project == 'mock-project-id'
+        assert client_3.project == 'mock-project-id'
+        assert client_1._database == '(default)'
+        assert client_2._database == '(default)'
+        assert client_3._database == '(default)'
+
 
     def test_geo_point(self):
         geo_point = firestore.GeoPoint(10, 20) # pylint: disable=no-member
diff --git a/tests/test_firestore_async.py b/tests/test_firestore_async.py
index 0fb17c8..3d17cbf 100644
--- a/tests/test_firestore_async.py
+++ b/tests/test_firestore_async.py
@@ -50,6 +50,7 @@ class TestFirestoreAsync:
         client = firestore_async.client()
         assert client is not None
         assert client.project == 'explicit-project-id'
+        assert client._database == '(default)'
 
     def test_project_id_with_explicit_app(self):
         cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
@@ -57,6 +58,7 @@ class TestFirestoreAsync:
         client = firestore_async.client(app=app)
         assert client is not None
         assert client.project == 'explicit-project-id'
+        assert client._database == '(default)'
 
     def test_service_account(self):
         cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
@@ -64,6 +66,7 @@ class TestFirestoreAsync:
         client = firestore_async.client()
         assert client is not None
         assert client.project == 'mock-project-id'
+        assert client._database == '(default)'
 
     def test_service_account_with_explicit_app(self):
         cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
@@ -71,6 +74,89 @@ class TestFirestoreAsync:
         client = firestore_async.client(app=app)
         assert client is not None
         assert client.project == 'mock-project-id'
+        assert client._database == '(default)'
+
+    @pytest.mark.parametrize('database_id', [123, False, True, {}, []])
+    def test_invalid_database_id(self, database_id):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        with pytest.raises(ValueError) as excinfo:
+            firestore_async.client(database_id=database_id)
+        assert str(excinfo.value) == f'database_id "{database_id}" must be a string or None.'
+
+    def test_database_id(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id = 'mock-database-id'
+        client = firestore_async.client(database_id=database_id)
+        assert client is not None
+        assert client.project == 'mock-project-id'
+        assert client._database == 'mock-database-id'
+
+    @pytest.mark.parametrize('database_id', ['', '(default)', None])
+    def test_database_id_with_default_id(self, database_id):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        client = firestore_async.client(database_id=database_id)
+        assert client is not None
+        assert client.project == 'mock-project-id'
+        assert client._database == '(default)'
+
+    def test_database_id_with_explicit_app(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        app = firebase_admin.initialize_app(cred)
+        database_id = 'mock-database-id'
+        client = firestore_async.client(app, database_id)
+        assert client is not None
+        assert client.project == 'mock-project-id'
+        assert client._database == 'mock-database-id'
+
+    def test_database_id_with_multi_db(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id_1 = 'mock-database-id-1'
+        database_id_2 = 'mock-database-id-2'
+        client_1 = firestore_async.client(database_id=database_id_1)
+        client_2 = firestore_async.client(database_id=database_id_2)
+        assert (client_1 is not None) and (client_2 is not None)
+        assert client_1 is not client_2
+        assert client_1.project == 'mock-project-id'
+        assert client_2.project == 'mock-project-id'
+        assert client_1._database == 'mock-database-id-1'
+        assert client_2._database == 'mock-database-id-2'
+
+    def test_database_id_with_multi_db_uses_cache(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id = 'mock-database-id'
+        client_1 = firestore_async.client(database_id=database_id)
+        client_2 = firestore_async.client(database_id=database_id)
+        assert (client_1 is not None) and (client_2 is not None)
+        assert client_1 is client_2
+        assert client_1.project == 'mock-project-id'
+        assert client_2.project == 'mock-project-id'
+        assert client_1._database == 'mock-database-id'
+        assert client_2._database == 'mock-database-id'
+
+    def test_database_id_with_multi_db_uses_cache_default(self):
+        cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
+        firebase_admin.initialize_app(cred)
+        database_id_1 = ''
+        database_id_2 = '(default)'
+        client_1 = firestore_async.client(database_id=database_id_1)
+        client_2 = firestore_async.client(database_id=database_id_2)
+        client_3 = firestore_async.client()
+        assert (client_1 is not None) and (client_2 is not None) and (client_3 is not None)
+        assert client_1 is client_2
+        assert client_1 is client_3
+        assert client_2 is client_3
+        assert client_1.project == 'mock-project-id'
+        assert client_2.project == 'mock-project-id'
+        assert client_3.project == 'mock-project-id'
+        assert client_1._database == '(default)'
+        assert client_2._database == '(default)'
+        assert client_3._database == '(default)'
+
 
     def test_geo_point(self):
         geo_point = firestore_async.GeoPoint(10, 20) # pylint: disable=no-member