1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15- import os
1615import urllib .parse
1716from http import HTTPStatus
18- from unittest . mock import Mock
17+ from typing import List
1918
20- from twisted .internet .defer import Deferred
19+ from parameterized import parameterized
20+
21+ from twisted .test .proto_helpers import MemoryReactor
2122
2223import synapse .rest .admin
2324from synapse .http .server import JsonResource
24- from synapse .logging .context import make_deferred_yieldable
2525from synapse .rest .admin import VersionServlet
2626from synapse .rest .client import groups , login , room
27+ from synapse .server import HomeServer
28+ from synapse .util import Clock
2729
2830from tests import unittest
2931from tests .server import FakeSite , make_request
3335class VersionTestCase (unittest .HomeserverTestCase ):
3436 url = "/_synapse/admin/v1/server_version"
3537
36- def create_test_resource (self ):
38+ def create_test_resource (self ) -> JsonResource :
3739 resource = JsonResource (self .hs )
3840 VersionServlet (self .hs ).register (resource )
3941 return resource
4042
41- def test_version_string (self ):
43+ def test_version_string (self ) -> None :
4244 channel = self .make_request ("GET" , self .url , shorthand = False )
4345
4446 self .assertEqual (HTTPStatus .OK , channel .code , msg = channel .json_body )
@@ -54,14 +56,14 @@ class DeleteGroupTestCase(unittest.HomeserverTestCase):
5456 groups .register_servlets ,
5557 ]
5658
57- def prepare (self , reactor , clock , hs ) :
59+ def prepare (self , reactor : MemoryReactor , clock : Clock , hs : HomeServer ) -> None :
5860 self .admin_user = self .register_user ("admin" , "pass" , admin = True )
5961 self .admin_user_tok = self .login ("admin" , "pass" )
6062
6163 self .other_user = self .register_user ("user" , "pass" )
6264 self .other_user_token = self .login ("user" , "pass" )
6365
64- def test_delete_group (self ):
66+ def test_delete_group (self ) -> None :
6567 # Create a new group
6668 channel = self .make_request (
6769 "POST" ,
@@ -112,7 +114,7 @@ def test_delete_group(self):
112114 self .assertNotIn (group_id , self ._get_groups_user_is_in (self .admin_user_tok ))
113115 self .assertNotIn (group_id , self ._get_groups_user_is_in (self .other_user_token ))
114116
115- def _check_group (self , group_id , expect_code ) :
117+ def _check_group (self , group_id : str , expect_code : int ) -> None :
116118 """Assert that trying to fetch the given group results in the given
117119 HTTP status code
118120 """
@@ -124,7 +126,7 @@ def _check_group(self, group_id, expect_code):
124126
125127 self .assertEqual (expect_code , channel .code , msg = channel .json_body )
126128
127- def _get_groups_user_is_in (self , access_token ) :
129+ def _get_groups_user_is_in (self , access_token : str ) -> List [ str ] :
128130 """Returns the list of groups the user is in (given their access token)"""
129131 channel = self .make_request ("GET" , b"/joined_groups" , access_token = access_token )
130132
@@ -143,59 +145,15 @@ class QuarantineMediaTestCase(unittest.HomeserverTestCase):
143145 room .register_servlets ,
144146 ]
145147
146- def prepare (self , reactor , clock , hs ) :
148+ def prepare (self , reactor : MemoryReactor , clock : Clock , hs : HomeServer ) -> None :
147149 # Allow for uploading and downloading to/from the media repo
148150 self .media_repo = hs .get_media_repository_resource ()
149151 self .download_resource = self .media_repo .children [b"download" ]
150152 self .upload_resource = self .media_repo .children [b"upload" ]
151153
152- def make_homeserver (self , reactor , clock ):
153-
154- self .fetches = []
155-
156- async def get_file (destination , path , output_stream , args = None , max_size = None ):
157- """
158- Returns tuple[int,dict,str,int] of file length, response headers,
159- absolute URI, and response code.
160- """
161-
162- def write_to (r ):
163- data , response = r
164- output_stream .write (data )
165- return response
166-
167- d = Deferred ()
168- d .addCallback (write_to )
169- self .fetches .append ((d , destination , path , args ))
170- return await make_deferred_yieldable (d )
171-
172- client = Mock ()
173- client .get_file = get_file
174-
175- self .storage_path = self .mktemp ()
176- self .media_store_path = self .mktemp ()
177- os .mkdir (self .storage_path )
178- os .mkdir (self .media_store_path )
179-
180- config = self .default_config ()
181- config ["media_store_path" ] = self .media_store_path
182- config ["thumbnail_requirements" ] = {}
183- config ["max_image_pixels" ] = 2000000
184-
185- provider_config = {
186- "module" : "synapse.rest.media.v1.storage_provider.FileStorageProviderBackend" ,
187- "store_local" : True ,
188- "store_synchronous" : False ,
189- "store_remote" : True ,
190- "config" : {"directory" : self .storage_path },
191- }
192- config ["media_storage_providers" ] = [provider_config ]
193-
194- hs = self .setup_test_homeserver (config = config , federation_http_client = client )
195-
196- return hs
197-
198- def _ensure_quarantined (self , admin_user_tok , server_and_media_id ):
154+ def _ensure_quarantined (
155+ self , admin_user_tok : str , server_and_media_id : str
156+ ) -> None :
199157 """Ensure a piece of media is quarantined when trying to access it."""
200158 channel = make_request (
201159 self .reactor ,
@@ -216,12 +174,18 @@ def _ensure_quarantined(self, admin_user_tok, server_and_media_id):
216174 ),
217175 )
218176
219- def test_quarantine_media_requires_admin (self ):
177+ @parameterized .expand (
178+ [
179+ # Attempt quarantine media APIs as non-admin
180+ "/_synapse/admin/v1/media/quarantine/example.org/abcde12345" ,
181+ # And the roomID/userID endpoint
182+ "/_synapse/admin/v1/room/!room%3Aexample.com/media/quarantine" ,
183+ ]
184+ )
185+ def test_quarantine_media_requires_admin (self , url : str ) -> None :
220186 self .register_user ("nonadmin" , "pass" , admin = False )
221187 non_admin_user_tok = self .login ("nonadmin" , "pass" )
222188
223- # Attempt quarantine media APIs as non-admin
224- url = "/_synapse/admin/v1/media/quarantine/example.org/abcde12345"
225189 channel = self .make_request (
226190 "POST" ,
227191 url .encode ("ascii" ),
@@ -235,22 +199,7 @@ def test_quarantine_media_requires_admin(self):
235199 msg = "Expected forbidden on quarantining media as a non-admin" ,
236200 )
237201
238- # And the roomID/userID endpoint
239- url = "/_synapse/admin/v1/room/!room%3Aexample.com/media/quarantine"
240- channel = self .make_request (
241- "POST" ,
242- url .encode ("ascii" ),
243- access_token = non_admin_user_tok ,
244- )
245-
246- # Expect a forbidden error
247- self .assertEqual (
248- HTTPStatus .FORBIDDEN ,
249- channel .code ,
250- msg = "Expected forbidden on quarantining media as a non-admin" ,
251- )
252-
253- def test_quarantine_media_by_id (self ):
202+ def test_quarantine_media_by_id (self ) -> None :
254203 self .register_user ("id_admin" , "pass" , admin = True )
255204 admin_user_tok = self .login ("id_admin" , "pass" )
256205
@@ -295,7 +244,15 @@ def test_quarantine_media_by_id(self):
295244 # Attempt to access the media
296245 self ._ensure_quarantined (admin_user_tok , server_name_and_media_id )
297246
298- def test_quarantine_all_media_in_room (self , override_url_template = None ):
247+ @parameterized .expand (
248+ [
249+ # regular API path
250+ "/_synapse/admin/v1/room/%s/media/quarantine" ,
251+ # deprecated API path
252+ "/_synapse/admin/v1/quarantine_media/%s" ,
253+ ]
254+ )
255+ def test_quarantine_all_media_in_room (self , url : str ) -> None :
299256 self .register_user ("room_admin" , "pass" , admin = True )
300257 admin_user_tok = self .login ("room_admin" , "pass" )
301258
@@ -333,16 +290,9 @@ def test_quarantine_all_media_in_room(self, override_url_template=None):
333290 tok = non_admin_user_tok ,
334291 )
335292
336- # Quarantine all media in the room
337- if override_url_template :
338- url = override_url_template % urllib .parse .quote (room_id )
339- else :
340- url = "/_synapse/admin/v1/room/%s/media/quarantine" % urllib .parse .quote (
341- room_id
342- )
343293 channel = self .make_request (
344294 "POST" ,
345- url ,
295+ url % urllib . parse . quote ( room_id ) ,
346296 access_token = admin_user_tok ,
347297 )
348298 self .pump (1.0 )
@@ -359,11 +309,7 @@ def test_quarantine_all_media_in_room(self, override_url_template=None):
359309 self ._ensure_quarantined (admin_user_tok , server_and_media_id_1 )
360310 self ._ensure_quarantined (admin_user_tok , server_and_media_id_2 )
361311
362- def test_quarantine_all_media_in_room_deprecated_api_path (self ):
363- # Perform the above test with the deprecated API path
364- self .test_quarantine_all_media_in_room ("/_synapse/admin/v1/quarantine_media/%s" )
365-
366- def test_quarantine_all_media_by_user (self ):
312+ def test_quarantine_all_media_by_user (self ) -> None :
367313 self .register_user ("user_admin" , "pass" , admin = True )
368314 admin_user_tok = self .login ("user_admin" , "pass" )
369315
@@ -401,7 +347,7 @@ def test_quarantine_all_media_by_user(self):
401347 self ._ensure_quarantined (admin_user_tok , server_and_media_id_1 )
402348 self ._ensure_quarantined (admin_user_tok , server_and_media_id_2 )
403349
404- def test_cannot_quarantine_safe_media (self ):
350+ def test_cannot_quarantine_safe_media (self ) -> None :
405351 self .register_user ("user_admin" , "pass" , admin = True )
406352 admin_user_tok = self .login ("user_admin" , "pass" )
407353
@@ -475,7 +421,7 @@ class PurgeHistoryTestCase(unittest.HomeserverTestCase):
475421 room .register_servlets ,
476422 ]
477423
478- def prepare (self , reactor , clock , hs ) :
424+ def prepare (self , reactor : MemoryReactor , clock : Clock , hs : HomeServer ) -> None :
479425 self .admin_user = self .register_user ("admin" , "pass" , admin = True )
480426 self .admin_user_tok = self .login ("admin" , "pass" )
481427
@@ -488,7 +434,7 @@ def prepare(self, reactor, clock, hs):
488434 self .url = f"/_synapse/admin/v1/purge_history/{ self .room_id } "
489435 self .url_status = "/_synapse/admin/v1/purge_history_status/"
490436
491- def test_purge_history (self ):
437+ def test_purge_history (self ) -> None :
492438 """
493439 Simple test of purge history API.
494440 Test only that is is possible to call, get status HTTPStatus.OK and purge_id.
0 commit comments