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

Commit 3336a23

Browse files
committed
Allow for make_awaitable's return value to be re-used.
1 parent 7513006 commit 3336a23

12 files changed

+56
-48
lines changed

changelog.d/8261.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Simplify tests that mock asynchronous functions.

tests/federation/test_complexity.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ def test_join_too_large(self):
7878

7979
# Mock out some things, because we don't want to test the whole join
8080
fed_transport.client.get_json = Mock(
81-
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
81+
return_value=make_awaitable({"v1": 9999})
8282
)
8383
handler.federation_handler.do_invite_join = Mock(
84-
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
84+
return_value=make_awaitable(("", 1))
8585
)
8686

8787
d = handler._remote_join(
@@ -111,10 +111,10 @@ def test_join_too_large_admin(self):
111111

112112
# Mock out some things, because we don't want to test the whole join
113113
fed_transport.client.get_json = Mock(
114-
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
114+
return_value=make_awaitable({"v1": 9999})
115115
)
116116
handler.federation_handler.do_invite_join = Mock(
117-
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
117+
return_value=make_awaitable(("", 1))
118118
)
119119

120120
d = handler._remote_join(
@@ -151,10 +151,10 @@ def test_join_too_large_once_joined(self):
151151

152152
# Mock out some things, because we don't want to test the whole join
153153
fed_transport.client.get_json = Mock(
154-
side_effect=lambda *args, **kwargs: make_awaitable(None)
154+
return_value=make_awaitable(None)
155155
)
156156
handler.federation_handler.do_invite_join = Mock(
157-
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
157+
return_value=make_awaitable(("", 1))
158158
)
159159

160160
# Artificially raise the complexity
@@ -209,10 +209,10 @@ def test_join_too_large_no_admin(self):
209209

210210
# Mock out some things, because we don't want to test the whole join
211211
fed_transport.client.get_json = Mock(
212-
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
212+
return_value=make_awaitable({"v1": 9999})
213213
)
214214
handler.federation_handler.do_invite_join = Mock(
215-
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
215+
return_value=make_awaitable(("", 1))
216216
)
217217

218218
d = handler._remote_join(
@@ -241,10 +241,10 @@ def test_join_too_large_admin(self):
241241

242242
# Mock out some things, because we don't want to test the whole join
243243
fed_transport.client.get_json = Mock(
244-
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
244+
return_value=make_awaitable({"v1": 9999})
245245
)
246246
handler.federation_handler.do_invite_join = Mock(
247-
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
247+
return_value=make_awaitable(("", 1))
248248
)
249249

250250
d = handler._remote_join(

tests/federation/test_federation_sender.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class FederationSenderReceiptsTestCases(HomeserverTestCase):
3434
def make_homeserver(self, reactor, clock):
3535
mock_state_handler = Mock(spec=["get_current_hosts_in_room"])
3636
# Ensure a new Awaitable is created for each call.
37-
mock_state_handler.get_current_hosts_in_room.side_effect = lambda room_Id: make_awaitable(
37+
mock_state_handler.get_current_hosts_in_room.return_value = make_awaitable(
3838
["test", "host2"]
3939
)
4040
return self.setup_test_homeserver(

tests/handlers/test_auth.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def test_mau_limits_disabled(self):
143143
def test_mau_limits_exceeded_large(self):
144144
self.auth_blocking._limit_usage_by_mau = True
145145
self.hs.get_datastore().get_monthly_active_count = Mock(
146-
side_effect=lambda: make_awaitable(self.large_number_of_users)
146+
return_value=make_awaitable(self.large_number_of_users)
147147
)
148148

149149
with self.assertRaises(ResourceLimitError):
@@ -154,7 +154,7 @@ def test_mau_limits_exceeded_large(self):
154154
)
155155

156156
self.hs.get_datastore().get_monthly_active_count = Mock(
157-
side_effect=lambda: make_awaitable(self.large_number_of_users)
157+
return_value=make_awaitable(self.large_number_of_users)
158158
)
159159
with self.assertRaises(ResourceLimitError):
160160
yield defer.ensureDeferred(
@@ -169,7 +169,7 @@ def test_mau_limits_parity(self):
169169

170170
# If not in monthly active cohort
171171
self.hs.get_datastore().get_monthly_active_count = Mock(
172-
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
172+
return_value=make_awaitable(self.auth_blocking._max_mau_value)
173173
)
174174
with self.assertRaises(ResourceLimitError):
175175
yield defer.ensureDeferred(
@@ -179,7 +179,7 @@ def test_mau_limits_parity(self):
179179
)
180180

181181
self.hs.get_datastore().get_monthly_active_count = Mock(
182-
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
182+
return_value=make_awaitable(self.auth_blocking._max_mau_value)
183183
)
184184
with self.assertRaises(ResourceLimitError):
185185
yield defer.ensureDeferred(
@@ -189,21 +189,21 @@ def test_mau_limits_parity(self):
189189
)
190190
# If in monthly active cohort
191191
self.hs.get_datastore().user_last_seen_monthly_active = Mock(
192-
side_effect=lambda user_id: make_awaitable(self.hs.get_clock().time_msec())
192+
return_value=make_awaitable(self.hs.get_clock().time_msec())
193193
)
194194
self.hs.get_datastore().get_monthly_active_count = Mock(
195-
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
195+
return_value=make_awaitable(self.auth_blocking._max_mau_value)
196196
)
197197
yield defer.ensureDeferred(
198198
self.auth_handler.get_access_token_for_user_id(
199199
"user_a", device_id=None, valid_until_ms=None
200200
)
201201
)
202202
self.hs.get_datastore().user_last_seen_monthly_active = Mock(
203-
side_effect=lambda user_id: make_awaitable(self.hs.get_clock().time_msec())
203+
return_value=make_awaitable(self.hs.get_clock().time_msec())
204204
)
205205
self.hs.get_datastore().get_monthly_active_count = Mock(
206-
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
206+
return_value=make_awaitable(self.auth_blocking._max_mau_value)
207207
)
208208
yield defer.ensureDeferred(
209209
self.auth_handler.validate_short_term_login_token_and_get_user_id(
@@ -216,7 +216,7 @@ def test_mau_limits_not_exceeded(self):
216216
self.auth_blocking._limit_usage_by_mau = True
217217

218218
self.hs.get_datastore().get_monthly_active_count = Mock(
219-
side_effect=lambda: make_awaitable(self.small_number_of_users)
219+
return_value=make_awaitable(self.small_number_of_users)
220220
)
221221
# Ensure does not raise exception
222222
yield defer.ensureDeferred(
@@ -226,7 +226,7 @@ def test_mau_limits_not_exceeded(self):
226226
)
227227

228228
self.hs.get_datastore().get_monthly_active_count = Mock(
229-
side_effect=lambda: make_awaitable(self.small_number_of_users)
229+
return_value=make_awaitable(self.small_number_of_users)
230230
)
231231
yield defer.ensureDeferred(
232232
self.auth_handler.validate_short_term_login_token_and_get_user_id(

tests/handlers/test_register.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -100,23 +100,23 @@ def test_mau_limits_when_disabled(self):
100100
def test_get_or_create_user_mau_not_blocked(self):
101101
self.hs.config.limit_usage_by_mau = True
102102
self.store.count_monthly_users = Mock(
103-
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value - 1)
103+
return_value=make_awaitable(self.hs.config.max_mau_value - 1)
104104
)
105105
# Ensure does not throw exception
106106
self.get_success(self.get_or_create_user(self.requester, "c", "User"))
107107

108108
def test_get_or_create_user_mau_blocked(self):
109109
self.hs.config.limit_usage_by_mau = True
110110
self.store.get_monthly_active_count = Mock(
111-
side_effect=lambda: make_awaitable(self.lots_of_users)
111+
return_value=make_awaitable(self.lots_of_users)
112112
)
113113
self.get_failure(
114114
self.get_or_create_user(self.requester, "b", "display_name"),
115115
ResourceLimitError,
116116
)
117117

118118
self.store.get_monthly_active_count = Mock(
119-
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
119+
return_value=make_awaitable(self.hs.config.max_mau_value)
120120
)
121121
self.get_failure(
122122
self.get_or_create_user(self.requester, "b", "display_name"),
@@ -126,14 +126,14 @@ def test_get_or_create_user_mau_blocked(self):
126126
def test_register_mau_blocked(self):
127127
self.hs.config.limit_usage_by_mau = True
128128
self.store.get_monthly_active_count = Mock(
129-
side_effect=lambda: make_awaitable(self.lots_of_users)
129+
return_value=make_awaitable(self.lots_of_users)
130130
)
131131
self.get_failure(
132132
self.handler.register_user(localpart="local_part"), ResourceLimitError
133133
)
134134

135135
self.store.get_monthly_active_count = Mock(
136-
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
136+
return_value=make_awaitable(self.hs.config.max_mau_value)
137137
)
138138
self.get_failure(
139139
self.handler.register_user(localpart="local_part"), ResourceLimitError

tests/handlers/test_typing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def prepare(self, reactor, clock, hs):
116116
retry_timings_res
117117
)
118118

119-
self.datastore.get_device_updates_by_remote.side_effect = lambda destination, from_stream_id, limit: make_awaitable(
119+
self.datastore.get_device_updates_by_remote.return_value = make_awaitable(
120120
(0, [])
121121
)
122122

tests/replication/test_federation_sender_shard.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def test_send_event_single_sender(self):
4545
new event.
4646
"""
4747
mock_client = Mock(spec=["put_json"])
48-
mock_client.put_json.side_effect = lambda *_, **__: make_awaitable({})
48+
mock_client.put_json.return_value = make_awaitable({})
4949

5050
self.make_worker_hs(
5151
"synapse.app.federation_sender",
@@ -73,7 +73,7 @@ def test_send_event_sharded(self):
7373
new events.
7474
"""
7575
mock_client1 = Mock(spec=["put_json"])
76-
mock_client1.put_json.side_effect = lambda *_, **__: make_awaitable({})
76+
mock_client1.put_json.return_value = make_awaitable({})
7777
self.make_worker_hs(
7878
"synapse.app.federation_sender",
7979
{
@@ -85,7 +85,7 @@ def test_send_event_sharded(self):
8585
)
8686

8787
mock_client2 = Mock(spec=["put_json"])
88-
mock_client2.put_json.side_effect = lambda *_, **__: make_awaitable({})
88+
mock_client2.put_json.return_value = make_awaitable({})
8989
self.make_worker_hs(
9090
"synapse.app.federation_sender",
9191
{
@@ -136,7 +136,7 @@ def test_send_typing_sharded(self):
136136
new typing EDUs.
137137
"""
138138
mock_client1 = Mock(spec=["put_json"])
139-
mock_client1.put_json.side_effect = lambda *_, **__: make_awaitable({})
139+
mock_client1.put_json.return_value = make_awaitable({})
140140
self.make_worker_hs(
141141
"synapse.app.federation_sender",
142142
{
@@ -148,7 +148,7 @@ def test_send_typing_sharded(self):
148148
)
149149

150150
mock_client2 = Mock(spec=["put_json"])
151-
mock_client2.put_json.side_effect = lambda *_, **__: make_awaitable({})
151+
mock_client2.put_json.return_value = make_awaitable({})
152152
self.make_worker_hs(
153153
"synapse.app.federation_sender",
154154
{

tests/rest/admin/test_user.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def test_register_mau_limit_reached(self):
337337

338338
# Set monthly active users to the limit
339339
store.get_monthly_active_count = Mock(
340-
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
340+
return_value=make_awaitable(self.hs.config.max_mau_value)
341341
)
342342
# Check that the blocking of monthly active users is working as expected
343343
# The registration of a new user fails due to the limit
@@ -591,7 +591,7 @@ def test_create_user_mau_limit_reached_active_admin(self):
591591

592592
# Set monthly active users to the limit
593593
self.store.get_monthly_active_count = Mock(
594-
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
594+
return_value=make_awaitable(self.hs.config.max_mau_value)
595595
)
596596
# Check that the blocking of monthly active users is working as expected
597597
# The registration of a new user fails due to the limit
@@ -631,7 +631,7 @@ def test_create_user_mau_limit_reached_passive_admin(self):
631631

632632
# Set monthly active users to the limit
633633
self.store.get_monthly_active_count = Mock(
634-
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
634+
return_value=make_awaitable(self.hs.config.max_mau_value)
635635
)
636636
# Check that the blocking of monthly active users is working as expected
637637
# The registration of a new user fails due to the limit

tests/server_notices/test_resource_limits_server_notices.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def prepare(self, reactor, clock, hs):
6767
raise Exception("Failed to find reference to ResourceLimitsServerNotices")
6868

6969
self._rlsn._store.user_last_seen_monthly_active = Mock(
70-
side_effect=lambda user_id: make_awaitable(1000)
70+
return_value=make_awaitable(1000)
7171
)
7272
self._rlsn._server_notices_manager.send_notice = Mock(
7373
return_value=defer.succeed(Mock())
@@ -81,7 +81,7 @@ def prepare(self, reactor, clock, hs):
8181
)
8282
self._rlsn._store.add_tag_to_room = Mock(return_value=defer.succeed(None))
8383
self._rlsn._store.get_tags_for_room = Mock(
84-
side_effect=lambda user_id, room_id: make_awaitable({})
84+
return_value=make_awaitable({})
8585
)
8686

8787
@override_config({"hs_disabled": True})
@@ -158,7 +158,7 @@ def test_maybe_send_server_notice_to_user_not_in_mau_cohort(self):
158158
"""
159159
self._rlsn._auth.check_auth_blocking = Mock(return_value=defer.succeed(None))
160160
self._rlsn._store.user_last_seen_monthly_active = Mock(
161-
side_effect=lambda user_id: make_awaitable(None)
161+
return_value=make_awaitable(None)
162162
)
163163
self.get_success(self._rlsn.maybe_send_server_notice_to_user(self.user_id))
164164

@@ -262,11 +262,11 @@ def prepare(self, reactor, clock, hs):
262262

263263
def test_server_notice_only_sent_once(self):
264264
self.store.get_monthly_active_count = Mock(
265-
side_effect=lambda: make_awaitable(1000)
265+
return_value=make_awaitable(1000)
266266
)
267267

268268
self.store.user_last_seen_monthly_active = Mock(
269-
side_effect=lambda user_id: make_awaitable(1000)
269+
return_value=make_awaitable(1000)
270270
)
271271

272272
# Call the function multiple times to ensure we only send the notice once

tests/storage/test_client_ips.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def test_adding_monthly_active_user_when_full(self):
154154
user_id = "@user:server"
155155

156156
self.store.get_monthly_active_count = Mock(
157-
side_effect=lambda: make_awaitable(lots_of_users)
157+
return_value=make_awaitable(lots_of_users)
158158
)
159159
self.get_success(
160160
self.store.insert_client_ip(

tests/storage/test_monthly_active_users.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def test_populate_monthly_users_is_guest(self):
232232
self.get_success(d)
233233

234234
self.store.upsert_monthly_active_user = Mock(
235-
side_effect=lambda user_id: make_awaitable(None)
235+
return_value=make_awaitable(None)
236236
)
237237

238238
d = self.store.populate_monthly_active_users(user_id)
@@ -242,7 +242,7 @@ def test_populate_monthly_users_is_guest(self):
242242

243243
def test_populate_monthly_users_should_update(self):
244244
self.store.upsert_monthly_active_user = Mock(
245-
side_effect=lambda user_id: make_awaitable(None)
245+
return_value=make_awaitable(None)
246246
)
247247

248248
self.store.is_trial_user = Mock(return_value=defer.succeed(False))
@@ -257,7 +257,7 @@ def test_populate_monthly_users_should_update(self):
257257

258258
def test_populate_monthly_users_should_not_update(self):
259259
self.store.upsert_monthly_active_user = Mock(
260-
side_effect=lambda user_id: make_awaitable(None)
260+
return_value=make_awaitable(None)
261261
)
262262

263263
self.store.is_trial_user = Mock(return_value=defer.succeed(False))
@@ -345,7 +345,7 @@ def test_track_monthly_users_without_cap(self):
345345
@override_config({"limit_usage_by_mau": False, "mau_stats_only": False})
346346
def test_no_users_when_not_tracking(self):
347347
self.store.upsert_monthly_active_user = Mock(
348-
side_effect=lambda user_id: make_awaitable(None)
348+
return_value=make_awaitable(None)
349349
)
350350

351351
self.get_success(self.store.populate_monthly_active_users("@user:sever"))

tests/test_utils/__init__.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"""
1818
Utilities for running the unit tests
1919
"""
20+
from asyncio import Future
2021
from typing import Any, Awaitable, TypeVar
2122

2223
TV = TypeVar("TV")
@@ -38,6 +39,12 @@ def get_awaitable_result(awaitable: Awaitable[TV]) -> TV:
3839
raise Exception("awaitable has not yet completed")
3940

4041

41-
async def make_awaitable(result: Any):
42-
"""Create an awaitable that just returns a result."""
43-
return result
42+
def make_awaitable(result: Any) -> Awaitable[Any]:
43+
"""
44+
Makes an awaitable, suitable for mocking an `async` function.
45+
This uses Futures as they can be awaited multiple times so can be returned
46+
to multiple callers.
47+
"""
48+
future = Future()
49+
future.set_result(result)
50+
return future

0 commit comments

Comments
 (0)