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

Commit 3f32c41

Browse files
clokephughns
authored andcommitted
Replace make_awaitable with AsyncMock (#16179)
Python 3.8 provides a native AsyncMock, we can replace the homegrown version we have.
1 parent a59cb59 commit 3f32c41

36 files changed

+507
-603
lines changed

changelog.d/16179.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Use `AsyncMock` instead of custom code.

tests/crypto/test_keyring.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414
import time
1515
from typing import Any, Dict, List, Optional, cast
16-
from unittest.mock import Mock
16+
from unittest.mock import AsyncMock, Mock
1717

1818
import attr
1919
import canonicaljson
@@ -45,7 +45,6 @@
4545
from synapse.util import Clock
4646

4747
from tests import unittest
48-
from tests.test_utils import make_awaitable
4948
from tests.unittest import logcontext_clean, override_config
5049

5150

@@ -291,7 +290,7 @@ def test_verify_json_for_server_with_null_valid_until_ms(self) -> None:
291290
with a null `ts_valid_until_ms`
292291
"""
293292
mock_fetcher = Mock()
294-
mock_fetcher.get_keys = Mock(return_value=make_awaitable({}))
293+
mock_fetcher.get_keys = AsyncMock(return_value={})
295294

296295
key1 = signedjson.key.generate_signing_key("1")
297296
r = self.hs.get_datastores().main.store_server_signature_keys(

tests/federation/test_complexity.py

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

15-
from unittest.mock import Mock
15+
from unittest.mock import AsyncMock
1616

1717
from synapse.api.errors import Codes, SynapseError
1818
from synapse.rest import admin
1919
from synapse.rest.client import login, room
2020
from synapse.types import JsonDict, UserID, create_requester
2121

2222
from tests import unittest
23-
from tests.test_utils import make_awaitable
2423

2524

2625
class RoomComplexityTests(unittest.FederatingHomeserverTestCase):
@@ -75,9 +74,9 @@ def test_join_too_large(self) -> None:
7574
fed_transport = self.hs.get_federation_transport_client()
7675

7776
# Mock out some things, because we don't want to test the whole join
78-
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999})) # type: ignore[assignment]
79-
handler.federation_handler.do_invite_join = Mock( # type: ignore[assignment]
80-
return_value=make_awaitable(("", 1))
77+
fed_transport.client.get_json = AsyncMock(return_value={"v1": 9999}) # type: ignore[assignment]
78+
handler.federation_handler.do_invite_join = AsyncMock( # type: ignore[assignment]
79+
return_value=("", 1)
8180
)
8281

8382
d = handler._remote_join(
@@ -106,9 +105,9 @@ def test_join_too_large_admin(self) -> None:
106105
fed_transport = self.hs.get_federation_transport_client()
107106

108107
# Mock out some things, because we don't want to test the whole join
109-
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999})) # type: ignore[assignment]
110-
handler.federation_handler.do_invite_join = Mock( # type: ignore[assignment]
111-
return_value=make_awaitable(("", 1))
108+
fed_transport.client.get_json = AsyncMock(return_value={"v1": 9999}) # type: ignore[assignment]
109+
handler.federation_handler.do_invite_join = AsyncMock( # type: ignore[assignment]
110+
return_value=("", 1)
112111
)
113112

114113
d = handler._remote_join(
@@ -143,9 +142,9 @@ def test_join_too_large_once_joined(self) -> None:
143142
fed_transport = self.hs.get_federation_transport_client()
144143

145144
# Mock out some things, because we don't want to test the whole join
146-
fed_transport.client.get_json = Mock(return_value=make_awaitable(None)) # type: ignore[assignment]
147-
handler.federation_handler.do_invite_join = Mock( # type: ignore[assignment]
148-
return_value=make_awaitable(("", 1))
145+
fed_transport.client.get_json = AsyncMock(return_value=None) # type: ignore[assignment]
146+
handler.federation_handler.do_invite_join = AsyncMock( # type: ignore[assignment]
147+
return_value=("", 1)
149148
)
150149

151150
# Artificially raise the complexity
@@ -200,9 +199,9 @@ def test_join_too_large_no_admin(self) -> None:
200199
fed_transport = self.hs.get_federation_transport_client()
201200

202201
# Mock out some things, because we don't want to test the whole join
203-
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999})) # type: ignore[assignment]
204-
handler.federation_handler.do_invite_join = Mock( # type: ignore[assignment]
205-
return_value=make_awaitable(("", 1))
202+
fed_transport.client.get_json = AsyncMock(return_value={"v1": 9999}) # type: ignore[assignment]
203+
handler.federation_handler.do_invite_join = AsyncMock( # type: ignore[assignment]
204+
return_value=("", 1)
206205
)
207206

208207
d = handler._remote_join(
@@ -230,9 +229,9 @@ def test_join_too_large_admin(self) -> None:
230229
fed_transport = self.hs.get_federation_transport_client()
231230

232231
# Mock out some things, because we don't want to test the whole join
233-
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999})) # type: ignore[assignment]
234-
handler.federation_handler.do_invite_join = Mock( # type: ignore[assignment]
235-
return_value=make_awaitable(("", 1))
232+
fed_transport.client.get_json = AsyncMock(return_value={"v1": 9999}) # type: ignore[assignment]
233+
handler.federation_handler.do_invite_join = AsyncMock( # type: ignore[assignment]
234+
return_value=("", 1)
236235
)
237236

238237
d = handler._remote_join(

tests/federation/test_federation_catch_up.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Callable, Collection, List, Optional, Tuple
22
from unittest import mock
3-
from unittest.mock import Mock
3+
from unittest.mock import AsyncMock, Mock
44

55
from twisted.test.proto_helpers import MemoryReactor
66

@@ -19,7 +19,7 @@
1919
from synapse.util import Clock
2020
from synapse.util.retryutils import NotRetryingDestination
2121

22-
from tests.test_utils import event_injection, make_awaitable
22+
from tests.test_utils import event_injection
2323
from tests.unittest import FederatingHomeserverTestCase
2424

2525

@@ -50,8 +50,8 @@ def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
5050
# This mock is crucial for destination_rooms to be populated.
5151
# TODO: this seems to no longer be the case---tests pass with this mock
5252
# commented out.
53-
state_storage_controller.get_current_hosts_in_room = Mock( # type: ignore[assignment]
54-
return_value=make_awaitable({"test", "host2"})
53+
state_storage_controller.get_current_hosts_in_room = AsyncMock( # type: ignore[assignment]
54+
return_value={"test", "host2"}
5555
)
5656

5757
# whenever send_transaction is called, record the pdu data

tests/federation/test_federation_sender.py

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
from typing import Callable, FrozenSet, List, Optional, Set
15-
from unittest.mock import Mock
15+
from unittest.mock import AsyncMock, Mock
1616

1717
from signedjson import key, sign
1818
from signedjson.types import BaseKey, SigningKey
@@ -29,7 +29,6 @@
2929
from synapse.types import JsonDict, ReadReceipt
3030
from synapse.util import Clock
3131

32-
from tests.test_utils import make_awaitable
3332
from tests.unittest import HomeserverTestCase
3433

3534

@@ -43,12 +42,13 @@ class FederationSenderReceiptsTestCases(HomeserverTestCase):
4342

4443
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
4544
self.federation_transport_client = Mock(spec=["send_transaction"])
45+
self.federation_transport_client.send_transaction = AsyncMock()
4646
hs = self.setup_test_homeserver(
4747
federation_transport_client=self.federation_transport_client,
4848
)
4949

50-
hs.get_storage_controllers().state.get_current_hosts_in_room = Mock( # type: ignore[assignment]
51-
return_value=make_awaitable({"test", "host2"})
50+
hs.get_storage_controllers().state.get_current_hosts_in_room = AsyncMock( # type: ignore[assignment]
51+
return_value={"test", "host2"}
5252
)
5353

5454
hs.get_storage_controllers().state.get_current_hosts_in_room_or_partial_state_approximation = ( # type: ignore[assignment]
@@ -64,7 +64,7 @@ def default_config(self) -> JsonDict:
6464

6565
def test_send_receipts(self) -> None:
6666
mock_send_transaction = self.federation_transport_client.send_transaction
67-
mock_send_transaction.return_value = make_awaitable({})
67+
mock_send_transaction.return_value = {}
6868

6969
sender = self.hs.get_federation_sender()
7070
receipt = ReadReceipt(
@@ -104,7 +104,7 @@ def test_send_receipts(self) -> None:
104104

105105
def test_send_receipts_thread(self) -> None:
106106
mock_send_transaction = self.federation_transport_client.send_transaction
107-
mock_send_transaction.return_value = make_awaitable({})
107+
mock_send_transaction.return_value = {}
108108

109109
# Create receipts for:
110110
#
@@ -180,7 +180,7 @@ def test_send_receipts_with_backoff(self) -> None:
180180
"""Send two receipts in quick succession; the second should be flushed, but
181181
only after 20ms"""
182182
mock_send_transaction = self.federation_transport_client.send_transaction
183-
mock_send_transaction.return_value = make_awaitable({})
183+
mock_send_transaction.return_value = {}
184184

185185
sender = self.hs.get_federation_sender()
186186
receipt = ReadReceipt(
@@ -276,6 +276,8 @@ def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
276276
self.federation_transport_client = Mock(
277277
spec=["send_transaction", "query_user_devices"]
278278
)
279+
self.federation_transport_client.send_transaction = AsyncMock()
280+
self.federation_transport_client.query_user_devices = AsyncMock()
279281
return self.setup_test_homeserver(
280282
federation_transport_client=self.federation_transport_client,
281283
)
@@ -317,13 +319,13 @@ async def get_current_hosts_in_room(room_id: str) -> Set[str]:
317319
self.record_transaction
318320
)
319321

320-
def record_transaction(
322+
async def record_transaction(
321323
self, txn: Transaction, json_cb: Optional[Callable[[], JsonDict]] = None
322-
) -> "defer.Deferred[JsonDict]":
324+
) -> JsonDict:
323325
assert json_cb is not None
324326
data = json_cb()
325327
self.edus.extend(data["edus"])
326-
return defer.succeed({})
328+
return {}
327329

328330
def test_send_device_updates(self) -> None:
329331
"""Basic case: each device update should result in an EDU"""
@@ -354,15 +356,11 @@ def test_dont_send_device_updates_for_remote_users(self) -> None:
354356

355357
# Send the server a device list EDU for the other user, this will cause
356358
# it to try and resync the device lists.
357-
self.federation_transport_client.query_user_devices.return_value = (
358-
make_awaitable(
359-
{
360-
"stream_id": "1",
361-
"user_id": "@user2:host2",
362-
"devices": [{"device_id": "D1"}],
363-
}
364-
)
365-
)
359+
self.federation_transport_client.query_user_devices.return_value = {
360+
"stream_id": "1",
361+
"user_id": "@user2:host2",
362+
"devices": [{"device_id": "D1"}],
363+
}
366364

367365
self.get_success(
368366
self.device_handler.device_list_updater.incoming_device_list_update(
@@ -533,7 +531,7 @@ def test_unreachable_server(self) -> None:
533531
recovery
534532
"""
535533
mock_send_txn = self.federation_transport_client.send_transaction
536-
mock_send_txn.side_effect = lambda t, cb: defer.fail(AssertionError("fail"))
534+
mock_send_txn.side_effect = AssertionError("fail")
537535

538536
# create devices
539537
u1 = self.register_user("user", "pass")
@@ -578,7 +576,7 @@ def test_prune_outbound_device_pokes1(self) -> None:
578576
This case tests the behaviour when the server has never been reachable.
579577
"""
580578
mock_send_txn = self.federation_transport_client.send_transaction
581-
mock_send_txn.side_effect = lambda t, cb: defer.fail(AssertionError("fail"))
579+
mock_send_txn.side_effect = AssertionError("fail")
582580

583581
# create devices
584582
u1 = self.register_user("user", "pass")
@@ -636,7 +634,7 @@ def test_prune_outbound_device_pokes2(self) -> None:
636634

637635
# now the server goes offline
638636
mock_send_txn = self.federation_transport_client.send_transaction
639-
mock_send_txn.side_effect = lambda t, cb: defer.fail(AssertionError("fail"))
637+
mock_send_txn.side_effect = AssertionError("fail")
640638

641639
self.login("user", "pass", device_id="D2")
642640
self.login("user", "pass", device_id="D3")

0 commit comments

Comments
 (0)