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

Commit 901b264

Browse files
authored
Add type hints to tests/rest/admin (#11851)
1 parent 0da2301 commit 901b264

File tree

5 files changed

+184
-232
lines changed

5 files changed

+184
-232
lines changed

changelog.d/11851.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add type hints to `tests/rest/admin`.

mypy.ini

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,6 @@ exclude = (?x)
7777
|tests/push/test_http.py
7878
|tests/push/test_presentable_names.py
7979
|tests/push/test_push_rule_evaluator.py
80-
|tests/rest/admin/test_admin.py
81-
|tests/rest/admin/test_user.py
82-
|tests/rest/admin/test_username_available.py
8380
|tests/rest/client/test_account.py
8481
|tests/rest/client/test_events.py
8582
|tests/rest/client/test_filter.py

tests/rest/admin/test_admin.py

Lines changed: 40 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,20 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import os
1615
import urllib.parse
1716
from 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

2223
import synapse.rest.admin
2324
from synapse.http.server import JsonResource
24-
from synapse.logging.context import make_deferred_yieldable
2525
from synapse.rest.admin import VersionServlet
2626
from synapse.rest.client import groups, login, room
27+
from synapse.server import HomeServer
28+
from synapse.util import Clock
2729

2830
from tests import unittest
2931
from tests.server import FakeSite, make_request
@@ -33,12 +35,12 @@
3335
class 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

Comments
 (0)