Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 435f044

Browse files
authoredDec 2, 2021
Add type annotations to tests.storage.test_appservice. (#11488)
1 parent f61462e commit 435f044

File tree

5 files changed

+98
-53
lines changed

5 files changed

+98
-53
lines changed
 

Diff for: ‎changelog.d/11488.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add type annotations to `tests.storage.test_appservice`.

Diff for: ‎mypy.ini

-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ exclude = (?x)
111111
|tests/server_notices/test_resource_limits_server_notices.py
112112
|tests/state/test_v2.py
113113
|tests/storage/test_account_data.py
114-
|tests/storage/test_appservice.py
115114
|tests/storage/test_background_update.py
116115
|tests/storage/test_base.py
117116
|tests/storage/test_client_ips.py

Diff for: ‎synapse/appservice/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414
import logging
1515
import re
16+
from enum import Enum
1617
from typing import TYPE_CHECKING, Iterable, List, Match, Optional
1718

1819
from synapse.api.constants import EventTypes
@@ -27,7 +28,7 @@
2728
logger = logging.getLogger(__name__)
2829

2930

30-
class ApplicationServiceState:
31+
class ApplicationServiceState(Enum):
3132
DOWN = "down"
3233
UP = "up"
3334

Diff for: ‎synapse/storage/databases/main/appservice.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ async def get_appservices_by_state(
143143
A list of ApplicationServices, which may be empty.
144144
"""
145145
results = await self.db_pool.simple_select_list(
146-
"application_services_state", {"state": state}, ["as_id"]
146+
"application_services_state", {"state": state.value}, ["as_id"]
147147
)
148148
# NB: This assumes this class is linked with ApplicationServiceStore
149149
as_list = self.get_app_services()
@@ -173,7 +173,7 @@ async def get_appservice_state(
173173
desc="get_appservice_state",
174174
)
175175
if result:
176-
return result.get("state")
176+
return ApplicationServiceState(result.get("state"))
177177
return None
178178

179179
async def set_appservice_state(
@@ -186,7 +186,7 @@ async def set_appservice_state(
186186
state: The connectivity state to apply.
187187
"""
188188
await self.db_pool.simple_upsert(
189-
"application_services_state", {"as_id": service.id}, {"state": state}
189+
"application_services_state", {"as_id": service.id}, {"state": state.value}
190190
)
191191

192192
async def create_appservice_txn(

Diff for: ‎tests/storage/test_appservice.py

+92-48
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,25 @@
1414
import json
1515
import os
1616
import tempfile
17+
from typing import Any, Generator, List, Optional, cast
1718
from unittest.mock import Mock
1819

1920
import yaml
2021

2122
from twisted.internet import defer
23+
from twisted.internet.defer import Deferred
24+
from twisted.test.proto_helpers import MemoryReactor
2225

2326
from synapse.appservice import ApplicationService, ApplicationServiceState
2427
from synapse.config._base import ConfigError
28+
from synapse.events import EventBase
29+
from synapse.server import HomeServer
2530
from synapse.storage.database import DatabasePool, make_conn
2631
from synapse.storage.databases.main.appservice import (
2732
ApplicationServiceStore,
2833
ApplicationServiceTransactionStore,
2934
)
35+
from synapse.util import Clock
3036

3137
from tests import unittest
3238
from tests.test_utils import make_awaitable
@@ -36,7 +42,7 @@
3642
class ApplicationServiceStoreTestCase(unittest.TestCase):
3743
@defer.inlineCallbacks
3844
def setUp(self):
39-
self.as_yaml_files = []
45+
self.as_yaml_files: List[str] = []
4046
hs = yield setup_test_homeserver(
4147
self.addCleanup, federation_sender=Mock(), federation_client=Mock()
4248
)
@@ -58,15 +64,15 @@ def setUp(self):
5864
database, make_conn(database._database_config, database.engine, "test"), hs
5965
)
6066

61-
def tearDown(self):
67+
def tearDown(self) -> None:
6268
# TODO: suboptimal that we need to create files for tests!
6369
for f in self.as_yaml_files:
6470
try:
6571
os.remove(f)
6672
except Exception:
6773
pass
6874

69-
def _add_appservice(self, as_token, id, url, hs_token, sender):
75+
def _add_appservice(self, as_token, id, url, hs_token, sender) -> None:
7076
as_yaml = {
7177
"url": url,
7278
"as_token": as_token,
@@ -80,28 +86,29 @@ def _add_appservice(self, as_token, id, url, hs_token, sender):
8086
outfile.write(yaml.dump(as_yaml))
8187
self.as_yaml_files.append(as_token)
8288

83-
def test_retrieve_unknown_service_token(self):
89+
def test_retrieve_unknown_service_token(self) -> None:
8490
service = self.store.get_app_service_by_token("invalid_token")
8591
self.assertEquals(service, None)
8692

87-
def test_retrieval_of_service(self):
93+
def test_retrieval_of_service(self) -> None:
8894
stored_service = self.store.get_app_service_by_token(self.as_token)
95+
assert stored_service is not None
8996
self.assertEquals(stored_service.token, self.as_token)
9097
self.assertEquals(stored_service.id, self.as_id)
9198
self.assertEquals(stored_service.url, self.as_url)
9299
self.assertEquals(stored_service.namespaces[ApplicationService.NS_ALIASES], [])
93100
self.assertEquals(stored_service.namespaces[ApplicationService.NS_ROOMS], [])
94101
self.assertEquals(stored_service.namespaces[ApplicationService.NS_USERS], [])
95102

96-
def test_retrieval_of_all_services(self):
103+
def test_retrieval_of_all_services(self) -> None:
97104
services = self.store.get_app_services()
98105
self.assertEquals(len(services), 3)
99106

100107

101108
class ApplicationServiceTransactionStoreTestCase(unittest.TestCase):
102109
@defer.inlineCallbacks
103110
def setUp(self):
104-
self.as_yaml_files = []
111+
self.as_yaml_files: List[str] = []
105112

106113
hs = yield setup_test_homeserver(
107114
self.addCleanup, federation_sender=Mock(), federation_client=Mock()
@@ -117,7 +124,7 @@ def setUp(self):
117124
{"token": "gamma_tok", "url": "https://gamma.com", "id": "id_gamma"},
118125
]
119126
for s in self.as_list:
120-
yield self._add_service(s["url"], s["token"], s["id"])
127+
self._add_service(s["url"], s["token"], s["id"])
121128

122129
self.as_yaml_files = []
123130

@@ -131,7 +138,7 @@ def setUp(self):
131138
database, make_conn(db_config, self.engine, "test"), hs
132139
)
133140

134-
def _add_service(self, url, as_token, id):
141+
def _add_service(self, url, as_token, id) -> None:
135142
as_yaml = {
136143
"url": url,
137144
"as_token": as_token,
@@ -145,13 +152,15 @@ def _add_service(self, url, as_token, id):
145152
outfile.write(yaml.dump(as_yaml))
146153
self.as_yaml_files.append(as_token)
147154

148-
def _set_state(self, id, state, txn=None):
155+
def _set_state(
156+
self, id: str, state: ApplicationServiceState, txn: Optional[int] = None
157+
):
149158
return self.db_pool.runOperation(
150159
self.engine.convert_param_style(
151160
"INSERT INTO application_services_state(as_id, state, last_txn) "
152161
"VALUES(?,?,?)"
153162
),
154-
(id, state, txn),
163+
(id, state.value, txn),
155164
)
156165

157166
def _insert_txn(self, as_id, txn_id, events):
@@ -169,24 +178,30 @@ def _set_last_txn(self, as_id, txn_id):
169178
"INSERT INTO application_services_state(as_id, last_txn, state) "
170179
"VALUES(?,?,?)"
171180
),
172-
(as_id, txn_id, ApplicationServiceState.UP),
181+
(as_id, txn_id, ApplicationServiceState.UP.value),
173182
)
174183

175184
@defer.inlineCallbacks
176-
def test_get_appservice_state_none(self):
185+
def test_get_appservice_state_none(
186+
self,
187+
) -> Generator["Deferred[object]", object, None]:
177188
service = Mock(id="999")
178189
state = yield defer.ensureDeferred(self.store.get_appservice_state(service))
179190
self.assertEquals(None, state)
180191

181192
@defer.inlineCallbacks
182-
def test_get_appservice_state_up(self):
193+
def test_get_appservice_state_up(
194+
self,
195+
) -> Generator["Deferred[object]", object, None]:
183196
yield self._set_state(self.as_list[0]["id"], ApplicationServiceState.UP)
184197
service = Mock(id=self.as_list[0]["id"])
185198
state = yield defer.ensureDeferred(self.store.get_appservice_state(service))
186199
self.assertEquals(ApplicationServiceState.UP, state)
187200

188201
@defer.inlineCallbacks
189-
def test_get_appservice_state_down(self):
202+
def test_get_appservice_state_down(
203+
self,
204+
) -> Generator["Deferred[object]", object, None]:
190205
yield self._set_state(self.as_list[0]["id"], ApplicationServiceState.UP)
191206
yield self._set_state(self.as_list[1]["id"], ApplicationServiceState.DOWN)
192207
yield self._set_state(self.as_list[2]["id"], ApplicationServiceState.DOWN)
@@ -195,14 +210,18 @@ def test_get_appservice_state_down(self):
195210
self.assertEquals(ApplicationServiceState.DOWN, state)
196211

197212
@defer.inlineCallbacks
198-
def test_get_appservices_by_state_none(self):
213+
def test_get_appservices_by_state_none(
214+
self,
215+
) -> Generator["Deferred[object]", Any, None]:
199216
services = yield defer.ensureDeferred(
200217
self.store.get_appservices_by_state(ApplicationServiceState.DOWN)
201218
)
202219
self.assertEquals(0, len(services))
203220

204221
@defer.inlineCallbacks
205-
def test_set_appservices_state_down(self):
222+
def test_set_appservices_state_down(
223+
self,
224+
) -> Generator["Deferred[object]", Any, None]:
206225
service = Mock(id=self.as_list[1]["id"])
207226
yield defer.ensureDeferred(
208227
self.store.set_appservice_state(service, ApplicationServiceState.DOWN)
@@ -211,12 +230,14 @@ def test_set_appservices_state_down(self):
211230
self.engine.convert_param_style(
212231
"SELECT as_id FROM application_services_state WHERE state=?"
213232
),
214-
(ApplicationServiceState.DOWN,),
233+
(ApplicationServiceState.DOWN.value,),
215234
)
216235
self.assertEquals(service.id, rows[0][0])
217236

218237
@defer.inlineCallbacks
219-
def test_set_appservices_state_multiple_up(self):
238+
def test_set_appservices_state_multiple_up(
239+
self,
240+
) -> Generator["Deferred[object]", Any, None]:
220241
service = Mock(id=self.as_list[1]["id"])
221242
yield defer.ensureDeferred(
222243
self.store.set_appservice_state(service, ApplicationServiceState.UP)
@@ -231,14 +252,16 @@ def test_set_appservices_state_multiple_up(self):
231252
self.engine.convert_param_style(
232253
"SELECT as_id FROM application_services_state WHERE state=?"
233254
),
234-
(ApplicationServiceState.UP,),
255+
(ApplicationServiceState.UP.value,),
235256
)
236257
self.assertEquals(service.id, rows[0][0])
237258

238259
@defer.inlineCallbacks
239-
def test_create_appservice_txn_first(self):
260+
def test_create_appservice_txn_first(
261+
self,
262+
) -> Generator["Deferred[object]", Any, None]:
240263
service = Mock(id=self.as_list[0]["id"])
241-
events = [Mock(event_id="e1"), Mock(event_id="e2")]
264+
events = cast(List[EventBase], [Mock(event_id="e1"), Mock(event_id="e2")])
242265
txn = yield defer.ensureDeferred(
243266
self.store.create_appservice_txn(service, events, [])
244267
)
@@ -247,9 +270,11 @@ def test_create_appservice_txn_first(self):
247270
self.assertEquals(txn.service, service)
248271

249272
@defer.inlineCallbacks
250-
def test_create_appservice_txn_older_last_txn(self):
273+
def test_create_appservice_txn_older_last_txn(
274+
self,
275+
) -> Generator["Deferred[object]", Any, None]:
251276
service = Mock(id=self.as_list[0]["id"])
252-
events = [Mock(event_id="e1"), Mock(event_id="e2")]
277+
events = cast(List[EventBase], [Mock(event_id="e1"), Mock(event_id="e2")])
253278
yield self._set_last_txn(service.id, 9643) # AS is falling behind
254279
yield self._insert_txn(service.id, 9644, events)
255280
yield self._insert_txn(service.id, 9645, events)
@@ -261,9 +286,11 @@ def test_create_appservice_txn_older_last_txn(self):
261286
self.assertEquals(txn.service, service)
262287

263288
@defer.inlineCallbacks
264-
def test_create_appservice_txn_up_to_date_last_txn(self):
289+
def test_create_appservice_txn_up_to_date_last_txn(
290+
self,
291+
) -> Generator["Deferred[object]", Any, None]:
265292
service = Mock(id=self.as_list[0]["id"])
266-
events = [Mock(event_id="e1"), Mock(event_id="e2")]
293+
events = cast(List[EventBase], [Mock(event_id="e1"), Mock(event_id="e2")])
267294
yield self._set_last_txn(service.id, 9643)
268295
txn = yield defer.ensureDeferred(
269296
self.store.create_appservice_txn(service, events, [])
@@ -273,9 +300,11 @@ def test_create_appservice_txn_up_to_date_last_txn(self):
273300
self.assertEquals(txn.service, service)
274301

275302
@defer.inlineCallbacks
276-
def test_create_appservice_txn_up_fuzzing(self):
303+
def test_create_appservice_txn_up_fuzzing(
304+
self,
305+
) -> Generator["Deferred[object]", Any, None]:
277306
service = Mock(id=self.as_list[0]["id"])
278-
events = [Mock(event_id="e1"), Mock(event_id="e2")]
307+
events = cast(List[EventBase], [Mock(event_id="e1"), Mock(event_id="e2")])
279308
yield self._set_last_txn(service.id, 9643)
280309

281310
# dump in rows with higher IDs to make sure the queries aren't wrong.
@@ -296,7 +325,9 @@ def test_create_appservice_txn_up_fuzzing(self):
296325
self.assertEquals(txn.service, service)
297326

298327
@defer.inlineCallbacks
299-
def test_complete_appservice_txn_first_txn(self):
328+
def test_complete_appservice_txn_first_txn(
329+
self,
330+
) -> Generator["Deferred[object]", Any, None]:
300331
service = Mock(id=self.as_list[0]["id"])
301332
events = [Mock(event_id="e1"), Mock(event_id="e2")]
302333
txn_id = 1
@@ -324,7 +355,9 @@ def test_complete_appservice_txn_first_txn(self):
324355
self.assertEquals(0, len(res))
325356

326357
@defer.inlineCallbacks
327-
def test_complete_appservice_txn_existing_in_state_table(self):
358+
def test_complete_appservice_txn_existing_in_state_table(
359+
self,
360+
) -> Generator["Deferred[object]", Any, None]:
328361
service = Mock(id=self.as_list[0]["id"])
329362
events = [Mock(event_id="e1"), Mock(event_id="e2")]
330363
txn_id = 5
@@ -342,7 +375,7 @@ def test_complete_appservice_txn_existing_in_state_table(self):
342375
)
343376
self.assertEquals(1, len(res))
344377
self.assertEquals(txn_id, res[0][0])
345-
self.assertEquals(ApplicationServiceState.UP, res[0][1])
378+
self.assertEquals(ApplicationServiceState.UP.value, res[0][1])
346379

347380
res = yield self.db_pool.runQuery(
348381
self.engine.convert_param_style(
@@ -353,20 +386,23 @@ def test_complete_appservice_txn_existing_in_state_table(self):
353386
self.assertEquals(0, len(res))
354387

355388
@defer.inlineCallbacks
356-
def test_get_oldest_unsent_txn_none(self):
389+
def test_get_oldest_unsent_txn_none(
390+
self,
391+
) -> Generator["Deferred[object]", Any, None]:
357392
service = Mock(id=self.as_list[0]["id"])
358393

359394
txn = yield defer.ensureDeferred(self.store.get_oldest_unsent_txn(service))
360395
self.assertEquals(None, txn)
361396

362397
@defer.inlineCallbacks
363-
def test_get_oldest_unsent_txn(self):
398+
def test_get_oldest_unsent_txn(self) -> Generator["Deferred[object]", Any, None]:
364399
service = Mock(id=self.as_list[0]["id"])
365400
events = [Mock(event_id="e1"), Mock(event_id="e2")]
366401
other_events = [Mock(event_id="e5"), Mock(event_id="e6")]
367402

368403
# we aren't testing store._base stuff here, so mock this out
369-
self.store.get_events_as_list = Mock(return_value=make_awaitable(events))
404+
# (ignore needed because Mypy won't allow us to assign to a method otherwise)
405+
self.store.get_events_as_list = Mock(return_value=make_awaitable(events)) # type: ignore[assignment]
370406

371407
yield self._insert_txn(self.as_list[1]["id"], 9, other_events)
372408
yield self._insert_txn(service.id, 10, events)
@@ -379,7 +415,9 @@ def test_get_oldest_unsent_txn(self):
379415
self.assertEquals(events, txn.events)
380416

381417
@defer.inlineCallbacks
382-
def test_get_appservices_by_state_single(self):
418+
def test_get_appservices_by_state_single(
419+
self,
420+
) -> Generator["Deferred[object]", Any, None]:
383421
yield self._set_state(self.as_list[0]["id"], ApplicationServiceState.DOWN)
384422
yield self._set_state(self.as_list[1]["id"], ApplicationServiceState.UP)
385423

@@ -390,7 +428,9 @@ def test_get_appservices_by_state_single(self):
390428
self.assertEquals(self.as_list[0]["id"], services[0].id)
391429

392430
@defer.inlineCallbacks
393-
def test_get_appservices_by_state_multiple(self):
431+
def test_get_appservices_by_state_multiple(
432+
self,
433+
) -> Generator["Deferred[object]", Any, None]:
394434
yield self._set_state(self.as_list[0]["id"], ApplicationServiceState.DOWN)
395435
yield self._set_state(self.as_list[1]["id"], ApplicationServiceState.UP)
396436
yield self._set_state(self.as_list[2]["id"], ApplicationServiceState.DOWN)
@@ -407,16 +447,20 @@ def test_get_appservices_by_state_multiple(self):
407447

408448

409449
class ApplicationServiceStoreTypeStreamIds(unittest.HomeserverTestCase):
410-
def make_homeserver(self, reactor, clock):
450+
def make_homeserver(self, reactor, clock) -> "HomeServer":
411451
hs = self.setup_test_homeserver()
412452
return hs
413453

414-
def prepare(self, hs, reactor, clock):
454+
def prepare(
455+
self, reactor: MemoryReactor, clock: Clock, homeserver: HomeServer
456+
) -> None:
415457
self.service = Mock(id="foo")
416458
self.store = self.hs.get_datastore()
417-
self.get_success(self.store.set_appservice_state(self.service, "up"))
459+
self.get_success(
460+
self.store.set_appservice_state(self.service, ApplicationServiceState.UP)
461+
)
418462

419-
def test_get_type_stream_id_for_appservice_no_value(self):
463+
def test_get_type_stream_id_for_appservice_no_value(self) -> None:
420464
value = self.get_success(
421465
self.store.get_type_stream_id_for_appservice(self.service, "read_receipt")
422466
)
@@ -427,13 +471,13 @@ def test_get_type_stream_id_for_appservice_no_value(self):
427471
)
428472
self.assertEquals(value, 0)
429473

430-
def test_get_type_stream_id_for_appservice_invalid_type(self):
474+
def test_get_type_stream_id_for_appservice_invalid_type(self) -> None:
431475
self.get_failure(
432476
self.store.get_type_stream_id_for_appservice(self.service, "foobar"),
433477
ValueError,
434478
)
435479

436-
def test_set_type_stream_id_for_appservice(self):
480+
def test_set_type_stream_id_for_appservice(self) -> None:
437481
read_receipt_value = 1024
438482
self.get_success(
439483
self.store.set_type_stream_id_for_appservice(
@@ -455,7 +499,7 @@ def test_set_type_stream_id_for_appservice(self):
455499
)
456500
self.assertEqual(result, read_receipt_value)
457501

458-
def test_set_type_stream_id_for_appservice_invalid_type(self):
502+
def test_set_type_stream_id_for_appservice_invalid_type(self) -> None:
459503
self.get_failure(
460504
self.store.set_type_stream_id_for_appservice(self.service, "foobar", 1024),
461505
ValueError,
@@ -464,12 +508,12 @@ def test_set_type_stream_id_for_appservice_invalid_type(self):
464508

465509
# required for ApplicationServiceTransactionStoreTestCase tests
466510
class TestTransactionStore(ApplicationServiceTransactionStore, ApplicationServiceStore):
467-
def __init__(self, database: DatabasePool, db_conn, hs):
511+
def __init__(self, database: DatabasePool, db_conn, hs) -> None:
468512
super().__init__(database, db_conn, hs)
469513

470514

471515
class ApplicationServiceStoreConfigTestCase(unittest.TestCase):
472-
def _write_config(self, suffix, **kwargs):
516+
def _write_config(self, suffix, **kwargs) -> str:
473517
vals = {
474518
"id": "id" + suffix,
475519
"url": "url" + suffix,
@@ -486,7 +530,7 @@ def _write_config(self, suffix, **kwargs):
486530
return path
487531

488532
@defer.inlineCallbacks
489-
def test_unique_works(self):
533+
def test_unique_works(self) -> Generator["Deferred[object]", Any, None]:
490534
f1 = self._write_config(suffix="1")
491535
f2 = self._write_config(suffix="2")
492536

@@ -503,7 +547,7 @@ def test_unique_works(self):
503547
)
504548

505549
@defer.inlineCallbacks
506-
def test_duplicate_ids(self):
550+
def test_duplicate_ids(self) -> Generator["Deferred[object]", Any, None]:
507551
f1 = self._write_config(id="id", suffix="1")
508552
f2 = self._write_config(id="id", suffix="2")
509553

@@ -528,7 +572,7 @@ def test_duplicate_ids(self):
528572
self.assertIn("id", str(e))
529573

530574
@defer.inlineCallbacks
531-
def test_duplicate_as_tokens(self):
575+
def test_duplicate_as_tokens(self) -> Generator["Deferred[object]", Any, None]:
532576
f1 = self._write_config(as_token="as_token", suffix="1")
533577
f2 = self._write_config(as_token="as_token", suffix="2")
534578

0 commit comments

Comments
 (0)
This repository has been archived.