Skip to content

Commit 433471e

Browse files
committed
Added unit and integration tests
1 parent 6cb4b7c commit 433471e

File tree

4 files changed

+292
-4
lines changed

4 files changed

+292
-4
lines changed

integration/test_firestore.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,20 @@
1717

1818
from firebase_admin import firestore
1919

20+
_CITY = {
21+
'name': u'Mountain View',
22+
'country': u'USA',
23+
'population': 77846,
24+
'capital': False
25+
}
26+
27+
_MOVIE = {
28+
'Name': u'Interstellar',
29+
'Year': 2014,
30+
'Runtime': u'2h 49m',
31+
'Academy Award Winner': True
32+
}
33+
2034

2135
def test_firestore():
2236
client = firestore.client()
@@ -35,6 +49,47 @@ def test_firestore():
3549
doc.delete()
3650
assert doc.get().exists is False
3751

52+
def test_firestore_explicit_database_id():
53+
client = firestore.client(database_id='testing-database')
54+
expected = _CITY
55+
doc = client.collection('cities').document()
56+
doc.set(expected)
57+
58+
data = doc.get()
59+
assert data.to_dict() == expected
60+
61+
doc.delete()
62+
data = doc.get()
63+
assert data.exists is False
64+
65+
def test_firestore_multi_db():
66+
city_client = firestore.client()
67+
movie_client = firestore.client(database_id='testing-database')
68+
69+
expected_city = _CITY
70+
expected_movie = _MOVIE
71+
72+
city_doc = city_client.collection('cities').document()
73+
movie_doc = movie_client.collection('movies').document()
74+
75+
city_doc.set(expected_city)
76+
movie_doc.set(expected_movie)
77+
78+
city_data = city_doc.get()
79+
movie_data = movie_doc.get()
80+
81+
assert city_data.to_dict() == expected_city
82+
assert movie_data.to_dict() == expected_movie
83+
84+
city_doc.delete()
85+
movie_doc.delete()
86+
87+
city_data = city_doc.get()
88+
movie_data = movie_doc.get()
89+
90+
assert city_data.exists is False
91+
assert movie_data.exists is False
92+
3893
def test_server_timestamp():
3994
client = firestore.client()
4095
expected = {

integration/test_firestore_async.py

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,31 @@
1313
# limitations under the License.
1414

1515
"""Integration tests for firebase_admin.firestore_async module."""
16+
import asyncio
1617
import datetime
1718
import pytest
1819

1920
from firebase_admin import firestore_async
2021

21-
@pytest.mark.asyncio
22-
async def test_firestore_async():
23-
client = firestore_async.client()
24-
expected = {
22+
_CITY = {
2523
'name': u'Mountain View',
2624
'country': u'USA',
2725
'population': 77846,
2826
'capital': False
2927
}
28+
29+
_MOVIE = {
30+
'Name': u'Interstellar',
31+
'Year': 2014,
32+
'Runtime': u'2h 49m',
33+
'Academy Award Winner': True
34+
}
35+
36+
37+
@pytest.mark.asyncio
38+
async def test_firestore_async():
39+
client = firestore_async.client()
40+
expected = _CITY
3041
doc = client.collection('cities').document()
3142
await doc.set(expected)
3243

@@ -37,6 +48,56 @@ async def test_firestore_async():
3748
data = await doc.get()
3849
assert data.exists is False
3950

51+
@pytest.mark.asyncio
52+
async def test_firestore_async_explicit_database_id():
53+
client = firestore_async.client(database_id='testing-database')
54+
expected = _CITY
55+
doc = client.collection('cities').document()
56+
await doc.set(expected)
57+
58+
data = await doc.get()
59+
assert data.to_dict() == expected
60+
61+
await doc.delete()
62+
data = await doc.get()
63+
assert data.exists is False
64+
65+
@pytest.mark.asyncio
66+
async def test_firestore_async_multi_db():
67+
city_client = firestore_async.client()
68+
movie_client = firestore_async.client(database_id='testing-database')
69+
70+
expected_city = _CITY
71+
expected_movie = _MOVIE
72+
73+
city_doc = city_client.collection('cities').document()
74+
movie_doc = movie_client.collection('movies').document()
75+
76+
await asyncio.gather(
77+
city_doc.set(expected_city),
78+
movie_doc.set(expected_movie)
79+
)
80+
81+
data = await asyncio.gather(
82+
city_doc.get(),
83+
movie_doc.get()
84+
)
85+
86+
assert data[0].to_dict() == expected_city
87+
assert data[1].to_dict() == expected_movie
88+
89+
await asyncio.gather(
90+
city_doc.delete(),
91+
movie_doc.delete()
92+
)
93+
94+
data = await asyncio.gather(
95+
city_doc.get(),
96+
movie_doc.get()
97+
)
98+
assert data[0].exists is False
99+
assert data[1].exists is False
100+
40101
@pytest.mark.asyncio
41102
async def test_server_timestamp():
42103
client = firestore_async.client()

tests/test_firestore.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,27 +50,113 @@ def test_project_id(self):
5050
client = firestore.client()
5151
assert client is not None
5252
assert client.project == 'explicit-project-id'
53+
assert client._database == '(default)'
5354

5455
def test_project_id_with_explicit_app(self):
5556
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
5657
app = firebase_admin.initialize_app(cred, {'projectId': 'explicit-project-id'})
5758
client = firestore.client(app=app)
5859
assert client is not None
5960
assert client.project == 'explicit-project-id'
61+
assert client._database == '(default)'
6062

6163
def test_service_account(self):
6264
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
6365
firebase_admin.initialize_app(cred)
6466
client = firestore.client()
6567
assert client is not None
6668
assert client.project == 'mock-project-id'
69+
assert client._database == '(default)'
6770

6871
def test_service_account_with_explicit_app(self):
6972
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
7073
app = firebase_admin.initialize_app(cred)
7174
client = firestore.client(app=app)
7275
assert client is not None
7376
assert client.project == 'mock-project-id'
77+
assert client._database == '(default)'
78+
79+
@pytest.mark.parametrize('database_id', [123, False, True, {}, []])
80+
def test_invalid_database_id(self, database_id):
81+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
82+
firebase_admin.initialize_app(cred)
83+
with pytest.raises(ValueError) as excinfo:
84+
firestore.client(database_id=database_id)
85+
assert str(excinfo.value) == f'database_id "{database_id}" must be a string or None.'
86+
87+
def test_database_id(self):
88+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
89+
firebase_admin.initialize_app(cred)
90+
database_id = 'mock-database-id'
91+
client = firestore.client(database_id=database_id)
92+
assert client is not None
93+
assert client.project == 'mock-project-id'
94+
assert client._database == 'mock-database-id'
95+
96+
@pytest.mark.parametrize('database_id', ['', '(default)', None])
97+
def test_database_id_with_default_id(self, database_id):
98+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
99+
firebase_admin.initialize_app(cred)
100+
client = firestore.client(database_id=database_id)
101+
assert client is not None
102+
assert client.project == 'mock-project-id'
103+
assert client._database == '(default)'
104+
105+
def test_database_id_with_explicit_app(self):
106+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
107+
app = firebase_admin.initialize_app(cred)
108+
database_id = 'mock-database-id'
109+
client = firestore.client(app, database_id)
110+
assert client is not None
111+
assert client.project == 'mock-project-id'
112+
assert client._database == 'mock-database-id'
113+
114+
def test_database_id_with_multi_db(self):
115+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
116+
firebase_admin.initialize_app(cred)
117+
database_id_1 = 'mock-database-id-1'
118+
database_id_2 = 'mock-database-id-2'
119+
client_1 = firestore.client(database_id=database_id_1)
120+
client_2 = firestore.client(database_id=database_id_2)
121+
assert (client_1 is not None) and (client_2 is not None)
122+
assert client_1 is not client_2
123+
assert client_1.project == 'mock-project-id'
124+
assert client_2.project == 'mock-project-id'
125+
assert client_1._database == 'mock-database-id-1'
126+
assert client_2._database == 'mock-database-id-2'
127+
128+
def test_database_id_with_multi_db_uses_cache(self):
129+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
130+
firebase_admin.initialize_app(cred)
131+
database_id = 'mock-database-id'
132+
client_1 = firestore.client(database_id=database_id)
133+
client_2 = firestore.client(database_id=database_id)
134+
assert (client_1 is not None) and (client_2 is not None)
135+
assert client_1 is client_2
136+
assert client_1.project == 'mock-project-id'
137+
assert client_2.project == 'mock-project-id'
138+
assert client_1._database == 'mock-database-id'
139+
assert client_2._database == 'mock-database-id'
140+
141+
def test_database_id_with_multi_db_uses_cache_default(self):
142+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
143+
firebase_admin.initialize_app(cred)
144+
database_id_1 = ''
145+
database_id_2 = '(default)'
146+
client_1 = firestore.client(database_id=database_id_1)
147+
client_2 = firestore.client(database_id=database_id_2)
148+
client_3 = firestore.client()
149+
assert (client_1 is not None) and (client_2 is not None) and (client_3 is not None)
150+
assert client_1 is client_2
151+
assert client_1 is client_3
152+
assert client_2 is client_3
153+
assert client_1.project == 'mock-project-id'
154+
assert client_2.project == 'mock-project-id'
155+
assert client_3.project == 'mock-project-id'
156+
assert client_1._database == '(default)'
157+
assert client_2._database == '(default)'
158+
assert client_3._database == '(default)'
159+
74160

75161
def test_geo_point(self):
76162
geo_point = firestore.GeoPoint(10, 20) # pylint: disable=no-member

tests/test_firestore_async.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,27 +50,113 @@ def test_project_id(self):
5050
client = firestore_async.client()
5151
assert client is not None
5252
assert client.project == 'explicit-project-id'
53+
assert client._database == '(default)'
5354

5455
def test_project_id_with_explicit_app(self):
5556
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
5657
app = firebase_admin.initialize_app(cred, {'projectId': 'explicit-project-id'})
5758
client = firestore_async.client(app=app)
5859
assert client is not None
5960
assert client.project == 'explicit-project-id'
61+
assert client._database == '(default)'
6062

6163
def test_service_account(self):
6264
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
6365
firebase_admin.initialize_app(cred)
6466
client = firestore_async.client()
6567
assert client is not None
6668
assert client.project == 'mock-project-id'
69+
assert client._database == '(default)'
6770

6871
def test_service_account_with_explicit_app(self):
6972
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
7073
app = firebase_admin.initialize_app(cred)
7174
client = firestore_async.client(app=app)
7275
assert client is not None
7376
assert client.project == 'mock-project-id'
77+
assert client._database == '(default)'
78+
79+
@pytest.mark.parametrize('database_id', [123, False, True, {}, []])
80+
def test_invalid_database_id(self, database_id):
81+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
82+
firebase_admin.initialize_app(cred)
83+
with pytest.raises(ValueError) as excinfo:
84+
firestore_async.client(database_id=database_id)
85+
assert str(excinfo.value) == f'database_id "{database_id}" must be a string or None.'
86+
87+
def test_database_id(self):
88+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
89+
firebase_admin.initialize_app(cred)
90+
database_id = 'mock-database-id'
91+
client = firestore_async.client(database_id=database_id)
92+
assert client is not None
93+
assert client.project == 'mock-project-id'
94+
assert client._database == 'mock-database-id'
95+
96+
@pytest.mark.parametrize('database_id', ['', '(default)', None])
97+
def test_database_id_with_default_id(self, database_id):
98+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
99+
firebase_admin.initialize_app(cred)
100+
client = firestore_async.client(database_id=database_id)
101+
assert client is not None
102+
assert client.project == 'mock-project-id'
103+
assert client._database == '(default)'
104+
105+
def test_database_id_with_explicit_app(self):
106+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
107+
app = firebase_admin.initialize_app(cred)
108+
database_id = 'mock-database-id'
109+
client = firestore_async.client(app, database_id)
110+
assert client is not None
111+
assert client.project == 'mock-project-id'
112+
assert client._database == 'mock-database-id'
113+
114+
def test_database_id_with_multi_db(self):
115+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
116+
firebase_admin.initialize_app(cred)
117+
database_id_1 = 'mock-database-id-1'
118+
database_id_2 = 'mock-database-id-2'
119+
client_1 = firestore_async.client(database_id=database_id_1)
120+
client_2 = firestore_async.client(database_id=database_id_2)
121+
assert (client_1 is not None) and (client_2 is not None)
122+
assert client_1 is not client_2
123+
assert client_1.project == 'mock-project-id'
124+
assert client_2.project == 'mock-project-id'
125+
assert client_1._database == 'mock-database-id-1'
126+
assert client_2._database == 'mock-database-id-2'
127+
128+
def test_database_id_with_multi_db_uses_cache(self):
129+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
130+
firebase_admin.initialize_app(cred)
131+
database_id = 'mock-database-id'
132+
client_1 = firestore_async.client(database_id=database_id)
133+
client_2 = firestore_async.client(database_id=database_id)
134+
assert (client_1 is not None) and (client_2 is not None)
135+
assert client_1 is client_2
136+
assert client_1.project == 'mock-project-id'
137+
assert client_2.project == 'mock-project-id'
138+
assert client_1._database == 'mock-database-id'
139+
assert client_2._database == 'mock-database-id'
140+
141+
def test_database_id_with_multi_db_uses_cache_default(self):
142+
cred = credentials.Certificate(testutils.resource_filename('service_account.json'))
143+
firebase_admin.initialize_app(cred)
144+
database_id_1 = ''
145+
database_id_2 = '(default)'
146+
client_1 = firestore_async.client(database_id=database_id_1)
147+
client_2 = firestore_async.client(database_id=database_id_2)
148+
client_3 = firestore_async.client()
149+
assert (client_1 is not None) and (client_2 is not None) and (client_3 is not None)
150+
assert client_1 is client_2
151+
assert client_1 is client_3
152+
assert client_2 is client_3
153+
assert client_1.project == 'mock-project-id'
154+
assert client_2.project == 'mock-project-id'
155+
assert client_3.project == 'mock-project-id'
156+
assert client_1._database == '(default)'
157+
assert client_2._database == '(default)'
158+
assert client_3._database == '(default)'
159+
74160

75161
def test_geo_point(self):
76162
geo_point = firestore_async.GeoPoint(10, 20) # pylint: disable=no-member

0 commit comments

Comments
 (0)