14
14
import json
15
15
import os
16
16
import tempfile
17
+ from typing import Any , Generator , List , Optional , cast
17
18
from unittest .mock import Mock
18
19
19
20
import yaml
20
21
21
22
from twisted .internet import defer
23
+ from twisted .internet .defer import Deferred
24
+ from twisted .test .proto_helpers import MemoryReactor
22
25
23
26
from synapse .appservice import ApplicationService , ApplicationServiceState
24
27
from synapse .config ._base import ConfigError
28
+ from synapse .events import EventBase
29
+ from synapse .server import HomeServer
25
30
from synapse .storage .database import DatabasePool , make_conn
26
31
from synapse .storage .databases .main .appservice import (
27
32
ApplicationServiceStore ,
28
33
ApplicationServiceTransactionStore ,
29
34
)
35
+ from synapse .util import Clock
30
36
31
37
from tests import unittest
32
38
from tests .test_utils import make_awaitable
36
42
class ApplicationServiceStoreTestCase (unittest .TestCase ):
37
43
@defer .inlineCallbacks
38
44
def setUp (self ):
39
- self .as_yaml_files = []
45
+ self .as_yaml_files : List [ str ] = []
40
46
hs = yield setup_test_homeserver (
41
47
self .addCleanup , federation_sender = Mock (), federation_client = Mock ()
42
48
)
@@ -58,15 +64,15 @@ def setUp(self):
58
64
database , make_conn (database ._database_config , database .engine , "test" ), hs
59
65
)
60
66
61
- def tearDown (self ):
67
+ def tearDown (self ) -> None :
62
68
# TODO: suboptimal that we need to create files for tests!
63
69
for f in self .as_yaml_files :
64
70
try :
65
71
os .remove (f )
66
72
except Exception :
67
73
pass
68
74
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 :
70
76
as_yaml = {
71
77
"url" : url ,
72
78
"as_token" : as_token ,
@@ -80,28 +86,29 @@ def _add_appservice(self, as_token, id, url, hs_token, sender):
80
86
outfile .write (yaml .dump (as_yaml ))
81
87
self .as_yaml_files .append (as_token )
82
88
83
- def test_retrieve_unknown_service_token (self ):
89
+ def test_retrieve_unknown_service_token (self ) -> None :
84
90
service = self .store .get_app_service_by_token ("invalid_token" )
85
91
self .assertEquals (service , None )
86
92
87
- def test_retrieval_of_service (self ):
93
+ def test_retrieval_of_service (self ) -> None :
88
94
stored_service = self .store .get_app_service_by_token (self .as_token )
95
+ assert stored_service is not None
89
96
self .assertEquals (stored_service .token , self .as_token )
90
97
self .assertEquals (stored_service .id , self .as_id )
91
98
self .assertEquals (stored_service .url , self .as_url )
92
99
self .assertEquals (stored_service .namespaces [ApplicationService .NS_ALIASES ], [])
93
100
self .assertEquals (stored_service .namespaces [ApplicationService .NS_ROOMS ], [])
94
101
self .assertEquals (stored_service .namespaces [ApplicationService .NS_USERS ], [])
95
102
96
- def test_retrieval_of_all_services (self ):
103
+ def test_retrieval_of_all_services (self ) -> None :
97
104
services = self .store .get_app_services ()
98
105
self .assertEquals (len (services ), 3 )
99
106
100
107
101
108
class ApplicationServiceTransactionStoreTestCase (unittest .TestCase ):
102
109
@defer .inlineCallbacks
103
110
def setUp (self ):
104
- self .as_yaml_files = []
111
+ self .as_yaml_files : List [ str ] = []
105
112
106
113
hs = yield setup_test_homeserver (
107
114
self .addCleanup , federation_sender = Mock (), federation_client = Mock ()
@@ -117,7 +124,7 @@ def setUp(self):
117
124
{"token" : "gamma_tok" , "url" : "https://gamma.com" , "id" : "id_gamma" },
118
125
]
119
126
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" ])
121
128
122
129
self .as_yaml_files = []
123
130
@@ -131,7 +138,7 @@ def setUp(self):
131
138
database , make_conn (db_config , self .engine , "test" ), hs
132
139
)
133
140
134
- def _add_service (self , url , as_token , id ):
141
+ def _add_service (self , url , as_token , id ) -> None :
135
142
as_yaml = {
136
143
"url" : url ,
137
144
"as_token" : as_token ,
@@ -145,13 +152,15 @@ def _add_service(self, url, as_token, id):
145
152
outfile .write (yaml .dump (as_yaml ))
146
153
self .as_yaml_files .append (as_token )
147
154
148
- def _set_state (self , id , state , txn = None ):
155
+ def _set_state (
156
+ self , id : str , state : ApplicationServiceState , txn : Optional [int ] = None
157
+ ):
149
158
return self .db_pool .runOperation (
150
159
self .engine .convert_param_style (
151
160
"INSERT INTO application_services_state(as_id, state, last_txn) "
152
161
"VALUES(?,?,?)"
153
162
),
154
- (id , state , txn ),
163
+ (id , state . value , txn ),
155
164
)
156
165
157
166
def _insert_txn (self , as_id , txn_id , events ):
@@ -169,24 +178,30 @@ def _set_last_txn(self, as_id, txn_id):
169
178
"INSERT INTO application_services_state(as_id, last_txn, state) "
170
179
"VALUES(?,?,?)"
171
180
),
172
- (as_id , txn_id , ApplicationServiceState .UP ),
181
+ (as_id , txn_id , ApplicationServiceState .UP . value ),
173
182
)
174
183
175
184
@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 ]:
177
188
service = Mock (id = "999" )
178
189
state = yield defer .ensureDeferred (self .store .get_appservice_state (service ))
179
190
self .assertEquals (None , state )
180
191
181
192
@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 ]:
183
196
yield self ._set_state (self .as_list [0 ]["id" ], ApplicationServiceState .UP )
184
197
service = Mock (id = self .as_list [0 ]["id" ])
185
198
state = yield defer .ensureDeferred (self .store .get_appservice_state (service ))
186
199
self .assertEquals (ApplicationServiceState .UP , state )
187
200
188
201
@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 ]:
190
205
yield self ._set_state (self .as_list [0 ]["id" ], ApplicationServiceState .UP )
191
206
yield self ._set_state (self .as_list [1 ]["id" ], ApplicationServiceState .DOWN )
192
207
yield self ._set_state (self .as_list [2 ]["id" ], ApplicationServiceState .DOWN )
@@ -195,14 +210,18 @@ def test_get_appservice_state_down(self):
195
210
self .assertEquals (ApplicationServiceState .DOWN , state )
196
211
197
212
@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 ]:
199
216
services = yield defer .ensureDeferred (
200
217
self .store .get_appservices_by_state (ApplicationServiceState .DOWN )
201
218
)
202
219
self .assertEquals (0 , len (services ))
203
220
204
221
@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 ]:
206
225
service = Mock (id = self .as_list [1 ]["id" ])
207
226
yield defer .ensureDeferred (
208
227
self .store .set_appservice_state (service , ApplicationServiceState .DOWN )
@@ -211,12 +230,14 @@ def test_set_appservices_state_down(self):
211
230
self .engine .convert_param_style (
212
231
"SELECT as_id FROM application_services_state WHERE state=?"
213
232
),
214
- (ApplicationServiceState .DOWN ,),
233
+ (ApplicationServiceState .DOWN . value ,),
215
234
)
216
235
self .assertEquals (service .id , rows [0 ][0 ])
217
236
218
237
@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 ]:
220
241
service = Mock (id = self .as_list [1 ]["id" ])
221
242
yield defer .ensureDeferred (
222
243
self .store .set_appservice_state (service , ApplicationServiceState .UP )
@@ -231,14 +252,16 @@ def test_set_appservices_state_multiple_up(self):
231
252
self .engine .convert_param_style (
232
253
"SELECT as_id FROM application_services_state WHERE state=?"
233
254
),
234
- (ApplicationServiceState .UP ,),
255
+ (ApplicationServiceState .UP . value ,),
235
256
)
236
257
self .assertEquals (service .id , rows [0 ][0 ])
237
258
238
259
@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 ]:
240
263
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" )])
242
265
txn = yield defer .ensureDeferred (
243
266
self .store .create_appservice_txn (service , events , [])
244
267
)
@@ -247,9 +270,11 @@ def test_create_appservice_txn_first(self):
247
270
self .assertEquals (txn .service , service )
248
271
249
272
@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 ]:
251
276
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" )])
253
278
yield self ._set_last_txn (service .id , 9643 ) # AS is falling behind
254
279
yield self ._insert_txn (service .id , 9644 , events )
255
280
yield self ._insert_txn (service .id , 9645 , events )
@@ -261,9 +286,11 @@ def test_create_appservice_txn_older_last_txn(self):
261
286
self .assertEquals (txn .service , service )
262
287
263
288
@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 ]:
265
292
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" )])
267
294
yield self ._set_last_txn (service .id , 9643 )
268
295
txn = yield defer .ensureDeferred (
269
296
self .store .create_appservice_txn (service , events , [])
@@ -273,9 +300,11 @@ def test_create_appservice_txn_up_to_date_last_txn(self):
273
300
self .assertEquals (txn .service , service )
274
301
275
302
@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 ]:
277
306
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" )])
279
308
yield self ._set_last_txn (service .id , 9643 )
280
309
281
310
# 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):
296
325
self .assertEquals (txn .service , service )
297
326
298
327
@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 ]:
300
331
service = Mock (id = self .as_list [0 ]["id" ])
301
332
events = [Mock (event_id = "e1" ), Mock (event_id = "e2" )]
302
333
txn_id = 1
@@ -324,7 +355,9 @@ def test_complete_appservice_txn_first_txn(self):
324
355
self .assertEquals (0 , len (res ))
325
356
326
357
@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 ]:
328
361
service = Mock (id = self .as_list [0 ]["id" ])
329
362
events = [Mock (event_id = "e1" ), Mock (event_id = "e2" )]
330
363
txn_id = 5
@@ -342,7 +375,7 @@ def test_complete_appservice_txn_existing_in_state_table(self):
342
375
)
343
376
self .assertEquals (1 , len (res ))
344
377
self .assertEquals (txn_id , res [0 ][0 ])
345
- self .assertEquals (ApplicationServiceState .UP , res [0 ][1 ])
378
+ self .assertEquals (ApplicationServiceState .UP . value , res [0 ][1 ])
346
379
347
380
res = yield self .db_pool .runQuery (
348
381
self .engine .convert_param_style (
@@ -353,20 +386,23 @@ def test_complete_appservice_txn_existing_in_state_table(self):
353
386
self .assertEquals (0 , len (res ))
354
387
355
388
@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 ]:
357
392
service = Mock (id = self .as_list [0 ]["id" ])
358
393
359
394
txn = yield defer .ensureDeferred (self .store .get_oldest_unsent_txn (service ))
360
395
self .assertEquals (None , txn )
361
396
362
397
@defer .inlineCallbacks
363
- def test_get_oldest_unsent_txn (self ):
398
+ def test_get_oldest_unsent_txn (self ) -> Generator [ "Deferred[object]" , Any , None ] :
364
399
service = Mock (id = self .as_list [0 ]["id" ])
365
400
events = [Mock (event_id = "e1" ), Mock (event_id = "e2" )]
366
401
other_events = [Mock (event_id = "e5" ), Mock (event_id = "e6" )]
367
402
368
403
# 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]
370
406
371
407
yield self ._insert_txn (self .as_list [1 ]["id" ], 9 , other_events )
372
408
yield self ._insert_txn (service .id , 10 , events )
@@ -379,7 +415,9 @@ def test_get_oldest_unsent_txn(self):
379
415
self .assertEquals (events , txn .events )
380
416
381
417
@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 ]:
383
421
yield self ._set_state (self .as_list [0 ]["id" ], ApplicationServiceState .DOWN )
384
422
yield self ._set_state (self .as_list [1 ]["id" ], ApplicationServiceState .UP )
385
423
@@ -390,7 +428,9 @@ def test_get_appservices_by_state_single(self):
390
428
self .assertEquals (self .as_list [0 ]["id" ], services [0 ].id )
391
429
392
430
@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 ]:
394
434
yield self ._set_state (self .as_list [0 ]["id" ], ApplicationServiceState .DOWN )
395
435
yield self ._set_state (self .as_list [1 ]["id" ], ApplicationServiceState .UP )
396
436
yield self ._set_state (self .as_list [2 ]["id" ], ApplicationServiceState .DOWN )
@@ -407,16 +447,20 @@ def test_get_appservices_by_state_multiple(self):
407
447
408
448
409
449
class ApplicationServiceStoreTypeStreamIds (unittest .HomeserverTestCase ):
410
- def make_homeserver (self , reactor , clock ):
450
+ def make_homeserver (self , reactor , clock ) -> "HomeServer" :
411
451
hs = self .setup_test_homeserver ()
412
452
return hs
413
453
414
- def prepare (self , hs , reactor , clock ):
454
+ def prepare (
455
+ self , reactor : MemoryReactor , clock : Clock , homeserver : HomeServer
456
+ ) -> None :
415
457
self .service = Mock (id = "foo" )
416
458
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
+ )
418
462
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 :
420
464
value = self .get_success (
421
465
self .store .get_type_stream_id_for_appservice (self .service , "read_receipt" )
422
466
)
@@ -427,13 +471,13 @@ def test_get_type_stream_id_for_appservice_no_value(self):
427
471
)
428
472
self .assertEquals (value , 0 )
429
473
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 :
431
475
self .get_failure (
432
476
self .store .get_type_stream_id_for_appservice (self .service , "foobar" ),
433
477
ValueError ,
434
478
)
435
479
436
- def test_set_type_stream_id_for_appservice (self ):
480
+ def test_set_type_stream_id_for_appservice (self ) -> None :
437
481
read_receipt_value = 1024
438
482
self .get_success (
439
483
self .store .set_type_stream_id_for_appservice (
@@ -455,7 +499,7 @@ def test_set_type_stream_id_for_appservice(self):
455
499
)
456
500
self .assertEqual (result , read_receipt_value )
457
501
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 :
459
503
self .get_failure (
460
504
self .store .set_type_stream_id_for_appservice (self .service , "foobar" , 1024 ),
461
505
ValueError ,
@@ -464,12 +508,12 @@ def test_set_type_stream_id_for_appservice_invalid_type(self):
464
508
465
509
# required for ApplicationServiceTransactionStoreTestCase tests
466
510
class TestTransactionStore (ApplicationServiceTransactionStore , ApplicationServiceStore ):
467
- def __init__ (self , database : DatabasePool , db_conn , hs ):
511
+ def __init__ (self , database : DatabasePool , db_conn , hs ) -> None :
468
512
super ().__init__ (database , db_conn , hs )
469
513
470
514
471
515
class ApplicationServiceStoreConfigTestCase (unittest .TestCase ):
472
- def _write_config (self , suffix , ** kwargs ):
516
+ def _write_config (self , suffix , ** kwargs ) -> str :
473
517
vals = {
474
518
"id" : "id" + suffix ,
475
519
"url" : "url" + suffix ,
@@ -486,7 +530,7 @@ def _write_config(self, suffix, **kwargs):
486
530
return path
487
531
488
532
@defer .inlineCallbacks
489
- def test_unique_works (self ):
533
+ def test_unique_works (self ) -> Generator [ "Deferred[object]" , Any , None ] :
490
534
f1 = self ._write_config (suffix = "1" )
491
535
f2 = self ._write_config (suffix = "2" )
492
536
@@ -503,7 +547,7 @@ def test_unique_works(self):
503
547
)
504
548
505
549
@defer .inlineCallbacks
506
- def test_duplicate_ids (self ):
550
+ def test_duplicate_ids (self ) -> Generator [ "Deferred[object]" , Any , None ] :
507
551
f1 = self ._write_config (id = "id" , suffix = "1" )
508
552
f2 = self ._write_config (id = "id" , suffix = "2" )
509
553
@@ -528,7 +572,7 @@ def test_duplicate_ids(self):
528
572
self .assertIn ("id" , str (e ))
529
573
530
574
@defer .inlineCallbacks
531
- def test_duplicate_as_tokens (self ):
575
+ def test_duplicate_as_tokens (self ) -> Generator [ "Deferred[object]" , Any , None ] :
532
576
f1 = self ._write_config (as_token = "as_token" , suffix = "1" )
533
577
f2 = self ._write_config (as_token = "as_token" , suffix = "2" )
534
578
0 commit comments