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

Add type hints to tests/rest #12146

Merged
merged 3 commits into from
Mar 3, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/12146.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add type hints to `tests/rest`.
7 changes: 1 addition & 6 deletions mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,6 @@ exclude = (?x)
|tests/push/test_presentable_names.py
|tests/push/test_push_rule_evaluator.py
|tests/rest/client/test_transactions.py
|tests/rest/key/v2/test_remote_key_resource.py
|tests/rest/media/v1/test_base.py
|tests/rest/media/v1/test_media_storage.py
|tests/rest/media/v1/test_url_preview.py
|tests/scripts/test_new_matrix_user.py
Expand Down Expand Up @@ -254,10 +252,7 @@ disallow_untyped_defs = True
[mypy-tests.storage.test_user_directory]
disallow_untyped_defs = True

[mypy-tests.rest.admin.*]
disallow_untyped_defs = True

[mypy-tests.rest.client.*]
[mypy-tests.rest.*]
disallow_untyped_defs = True

[mypy-tests.federation.transport.test_client]
Expand Down
44 changes: 29 additions & 15 deletions tests/rest/key/v2/test_remote_key_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,24 @@
# limitations under the License.
import urllib.parse
from io import BytesIO, StringIO
from typing import Any, Dict, Optional, Union
from unittest.mock import Mock

import signedjson.key
from canonicaljson import encode_canonical_json
from nacl.signing import SigningKey
from signedjson.sign import sign_json

from twisted.web.resource import NoResource
from twisted.test.proto_helpers import MemoryReactor
from twisted.web.resource import NoResource, Resource

from synapse.crypto.keyring import PerspectivesKeyFetcher
from synapse.http.site import SynapseRequest
from synapse.rest.key.v2 import KeyApiV2Resource
from synapse.server import HomeServer
from synapse.storage.keys import FetchKeyResult
from synapse.types import JsonDict
from synapse.util import Clock
from synapse.util.httpresourcetree import create_resource_tree
from synapse.util.stringutils import random_string

Expand All @@ -35,11 +40,11 @@


class BaseRemoteKeyResourceTestCase(unittest.HomeserverTestCase):
def make_homeserver(self, reactor, clock):
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
self.http_client = Mock()
return self.setup_test_homeserver(federation_http_client=self.http_client)

def create_test_resource(self):
def create_test_resource(self) -> Resource:
return create_resource_tree(
{"/_matrix/key/v2": KeyApiV2Resource(self.hs)}, root_resource=NoResource()
)
Expand All @@ -51,10 +56,15 @@ def expect_outgoing_key_request(
Tell the mock http client to expect an outgoing GET request for the given key
"""

async def get_json(destination, path, ignore_backoff=False, **kwargs):
async def get_json(
destination: str,
path: str,
ignore_backoff: bool = False,
**kwargs: Any,
) -> Union[JsonDict, list]:
self.assertTrue(ignore_backoff)
self.assertEqual(destination, server_name)
key_id = "%s:%s" % (signing_key.alg, signing_key.version)
key_id = "%s:%s" % (signing_key.alg, signing_key.version) # type: ignore[attr-defined]
DMRobertson marked this conversation as resolved.
Show resolved Hide resolved
self.assertEqual(
path, "/_matrix/key/v2/server/%s" % (urllib.parse.quote(key_id),)
)
Expand Down Expand Up @@ -84,7 +94,8 @@ def make_notary_request(self, server_name: str, key_id: str) -> dict:
Checks that the response is a 200 and returns the decoded json body.
"""
channel = FakeChannel(self.site, self.reactor)
req = SynapseRequest(channel, self.site)
# channel is a `FakeChannel` but `HTTPChannel` is expected
req = SynapseRequest(channel, self.site) # type: ignore[arg-type]
req.content = BytesIO(b"")
req.requestReceived(
b"GET",
Expand All @@ -97,7 +108,7 @@ def make_notary_request(self, server_name: str, key_id: str) -> dict:
resp = channel.json_body
return resp

def test_get_key(self):
def test_get_key(self) -> None:
"""Fetch a remote key"""
SERVER_NAME = "remote.server"
testkey = signedjson.key.generate_signing_key("ver1")
Expand All @@ -114,7 +125,7 @@ def test_get_key(self):
self.assertIn(SERVER_NAME, keys[0]["signatures"])
self.assertIn(self.hs.hostname, keys[0]["signatures"])

def test_get_own_key(self):
def test_get_own_key(self) -> None:
"""Fetch our own key"""
testkey = signedjson.key.generate_signing_key("ver1")
self.expect_outgoing_key_request(self.hs.hostname, testkey)
Expand All @@ -141,7 +152,7 @@ class EndToEndPerspectivesTests(BaseRemoteKeyResourceTestCase):
endpoint, to check that the two implementations are compatible.
"""

def default_config(self):
def default_config(self) -> Dict[str, Any]:
config = super().default_config()

# replace the signing key with our own
Expand All @@ -152,7 +163,7 @@ def default_config(self):

return config

def prepare(self, reactor, clock, homeserver):
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
# make a second homeserver, configured to use the first one as a key notary
self.http_client2 = Mock()
config = default_config(name="keyclient")
Expand All @@ -175,15 +186,18 @@ def prepare(self, reactor, clock, homeserver):

# wire up outbound POST /key/v2/query requests from hs2 so that they
# will be forwarded to hs1
async def post_json(destination, path, data):
async def post_json(
destination: str, path: str, data: Optional[JsonDict] = None
) -> Union[JsonDict, list]:
self.assertEqual(destination, self.hs.hostname)
self.assertEqual(
path,
"/_matrix/key/v2/query",
)

channel = FakeChannel(self.site, self.reactor)
req = SynapseRequest(channel, self.site)
# channel is a `FakeChannel` but `HTTPChannel` is expected
req = SynapseRequest(channel, self.site) # type: ignore[arg-type]
req.content = BytesIO(encode_canonical_json(data))

req.requestReceived(
Expand All @@ -198,7 +212,7 @@ async def post_json(destination, path, data):

self.http_client2.post_json.side_effect = post_json

def test_get_key(self):
def test_get_key(self) -> None:
"""Fetch a key belonging to a random server"""
# make up a key to be fetched.
testkey = signedjson.key.generate_signing_key("abc")
Expand All @@ -218,7 +232,7 @@ def test_get_key(self):
signedjson.key.encode_verify_key_base64(testkey.verify_key),
)

def test_get_notary_key(self):
def test_get_notary_key(self) -> None:
"""Fetch a key belonging to the notary server"""
# make up a key to be fetched. We randomise the keyid to try to get it to
# appear before the key server signing key sometimes (otherwise we bail out
Expand All @@ -240,7 +254,7 @@ def test_get_notary_key(self):
signedjson.key.encode_verify_key_base64(testkey.verify_key),
)

def test_get_notary_keyserver_key(self):
def test_get_notary_keyserver_key(self) -> None:
"""Fetch the notary's keyserver key"""
# we expect hs1 to make a regular key request to itself
self.expect_outgoing_key_request(self.hs.hostname, self.hs_signing_key)
Expand Down
4 changes: 2 additions & 2 deletions tests/rest/media/v1/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ class GetFileNameFromHeadersTests(unittest.TestCase):
b"inline; filename*=utf-8''foo%C2%A3bar": "foo£bar",
}

def tests(self):
def tests(self) -> None:
for hdr, expected in self.TEST_CASES.items():
res = get_filename_from_headers({b"Content-Disposition": [hdr]})
self.assertEqual(
res,
expected,
"expected output for %s to be %s but was %s" % (hdr, expected, res),
f"expected output for {hdr!r} to be {expected} but was {res}",
)
Loading