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

Commit fe9be3c

Browse files
committed
add some tests
1 parent a950d5e commit fe9be3c

File tree

2 files changed

+157
-15
lines changed

2 files changed

+157
-15
lines changed

tests/handlers/test_device.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
from synapse.api.errors import NotFoundError, SynapseError
2525
from synapse.appservice import ApplicationService
2626
from synapse.handlers.device import MAX_DEVICE_DISPLAY_NAME_LEN, DeviceHandler
27+
from synapse.rest import admin
28+
from synapse.rest.client import devices, login, register
2729
from synapse.server import HomeServer
2830
from synapse.storage.databases.main.appservice import _make_exclusive_regex
29-
from synapse.types import create_requester, JsonDict
31+
from synapse.types import JsonDict, create_requester
3032
from synapse.util import Clock
3133

3234
from tests import unittest
@@ -401,11 +403,19 @@ def test_on_federation_query_user_devices_appservice(self) -> None:
401403

402404

403405
class DehydrationTestCase(unittest.HomeserverTestCase):
406+
servlets = [
407+
admin.register_servlets_for_client_rest_resource,
408+
login.register_servlets,
409+
register.register_servlets,
410+
devices.register_servlets,
411+
]
412+
404413
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
405414
hs = self.setup_test_homeserver("server", federation_http_client=None)
406415
handler = hs.get_device_handler()
407416
assert isinstance(handler, DeviceHandler)
408417
self.handler = handler
418+
self.message_handler = hs.get_device_message_handler()
409419
self.registration = hs.get_registration_handler()
410420
self.auth = hs.get_auth()
411421
self.store = hs.get_datastores().main
@@ -501,10 +511,11 @@ def test_dehydrate_v2_and_fetch_events(self) -> None:
501511
)
502512
)
503513

504-
retrieved_device_id, device_data = self.get_success(
514+
device_info = self.get_success(
505515
self.handler.get_dehydrated_device(user_id=user_id)
506516
)
507-
517+
assert device_info is not None
518+
retrieved_device_id, device_data = device_info
508519
self.assertEqual(retrieved_device_id, stored_dehydrated_device_id)
509520
self.assertEqual(device_data, {"device_data": {"foo": "bar"}})
510521

@@ -566,21 +577,20 @@ def test_dehydrate_v2_and_fetch_events(self) -> None:
566577
self.assertTrue(len(res["next_batch"]) > 1)
567578
self.assertEqual(len(res["events"]), 0)
568579

569-
# Fetching messages without since should return nothing, since the messages got deleted
570-
res = self.get_success(
580+
# Fetching messages again should fail, since the messages and dehydrated device
581+
# were deleted
582+
self.get_failure(
571583
self.message_handler.get_events_for_dehydrated_device(
572584
requester=requester,
573585
device_id=stored_dehydrated_device_id,
574586
since_token=None,
575587
limit=10,
576-
)
588+
),
589+
SynapseError,
577590
)
578-
self.assertTrue(len(res["next_batch"]) > 1)
579-
self.assertEqual(len(res["events"]), 0)
580591

581-
# We don't delete the device when fetch messages for now.
582-
# # make sure that the device ID that we were initially assigned no longer exists
583-
# self.get_failure(
584-
# self.handler.get_device(user_id, device_id),
585-
# NotFoundError,
586-
# )
592+
# make sure that the dehydrated device ID is deleted after fetching messages
593+
res2 = self.get_success(
594+
self.handler.get_dehydrated_device(requester.user.to_string()),
595+
)
596+
self.assertEqual(res2, None)

tests/rest/client/test_devices.py

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
# limitations under the License.
1414
from http import HTTPStatus
1515

16+
from twisted.internet.defer import ensureDeferred
1617
from twisted.test.proto_helpers import MemoryReactor
1718

1819
from synapse.api.errors import NotFoundError
1920
from synapse.rest import admin, devices, room, sync
20-
from synapse.rest.client import account, login, register
21+
from synapse.rest.client import account, keys, login, register
2122
from synapse.server import HomeServer
23+
from synapse.types import JsonDict, create_requester
2224
from synapse.util import Clock
2325

2426
from tests import unittest
@@ -208,8 +210,13 @@ class DehydratedDeviceTestCase(unittest.HomeserverTestCase):
208210
login.register_servlets,
209211
register.register_servlets,
210212
devices.register_servlets,
213+
keys.register_servlets,
211214
]
212215

216+
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
217+
self.registration = hs.get_registration_handler()
218+
self.message_handler = hs.get_device_message_handler()
219+
213220
def test_PUT(self) -> None:
214221
"""Sanity-check that we can PUT a dehydrated device.
215222
@@ -234,3 +241,128 @@ def test_PUT(self) -> None:
234241
self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body)
235242
device_id = channel.json_body.get("device_id")
236243
self.assertIsInstance(device_id, str)
244+
245+
@unittest.override_config(
246+
{"experimental_features": {"msc2697_enabled": False, "msc3814_enabled": True}}
247+
)
248+
def test_dehydrate_msc3814(self) -> None:
249+
user = self.register_user("mikey", "pass")
250+
token = self.login(user, "pass", device_id="device1")
251+
content: JsonDict = {
252+
"device_data": {
253+
"algorithm": "m.dehydration.v1.olm",
254+
},
255+
"initial_device_display_name": "foo bar",
256+
}
257+
channel = self.make_request(
258+
"PUT",
259+
"_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device",
260+
content=content,
261+
access_token=token,
262+
shorthand=False,
263+
)
264+
self.assertEqual(channel.code, 200)
265+
device_id = channel.json_body.get("device_id")
266+
assert device_id is not None
267+
self.assertIsInstance(device_id, str)
268+
269+
# test that you can upload keys for this device
270+
content = {
271+
"device_keys": {
272+
"algorithms": ["m.olm.v1.curve25519-aes-sha2", "m.megolm.v1.aes-sha2"],
273+
"device_id": f"{device_id}",
274+
"keys": {
275+
"curve25519:JLAFKJWSCS": "3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI",
276+
"ed25519:JLAFKJWSCS": "lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI",
277+
},
278+
"signatures": {
279+
"@alice:example.com": {
280+
"ed25519:JLAFKJWSCS": "dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA"
281+
}
282+
},
283+
"user_id": f"{user}",
284+
},
285+
}
286+
channel = self.make_request(
287+
"POST",
288+
f"/_matrix/client/r0/keys/upload/{device_id}",
289+
content=content,
290+
access_token=token,
291+
)
292+
self.assertEqual(channel.code, 200)
293+
294+
# test that we can now GET the dehydrated device info
295+
channel = self.make_request(
296+
"GET",
297+
"_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device",
298+
access_token=token,
299+
shorthand=False,
300+
)
301+
self.assertEqual(channel.code, 200)
302+
returned_device_id = channel.json_body.get("device_id")
303+
self.assertEqual(returned_device_id, device_id)
304+
device_data = channel.json_body.get("device_data")
305+
expected_device_data = {
306+
"algorithm": "m.dehydration.v1.olm",
307+
}
308+
self.assertEqual(device_data, expected_device_data)
309+
310+
# create another device for the user
311+
(
312+
new_device_id,
313+
_,
314+
_,
315+
_,
316+
) = self.get_success(
317+
self.registration.register_device(
318+
user_id=user,
319+
device_id=None,
320+
initial_display_name="new device",
321+
)
322+
)
323+
requester = create_requester(user, device_id=new_device_id)
324+
325+
# Send a message to the dehydrated device
326+
ensureDeferred(
327+
self.message_handler.send_device_message(
328+
requester=requester,
329+
message_type="test.message",
330+
messages={user: {device_id: {"body": "test_message"}}},
331+
)
332+
)
333+
self.pump()
334+
335+
# make sure we can fetch the message with our dehydrated device id
336+
channel = self.make_request(
337+
"POST",
338+
f"_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device/{device_id}/events",
339+
content={},
340+
access_token=token,
341+
shorthand=False,
342+
)
343+
self.assertEqual(channel.code, 200)
344+
expected_content = {"body": "test_message"}
345+
self.assertEqual(channel.json_body["events"][0]["content"], expected_content)
346+
next_batch_token = channel.json_body.get("next_batch")
347+
348+
# fetch messages again and make sure that the message was deleted and we are returned an
349+
# empty array
350+
content = {"next_batch": next_batch_token}
351+
channel = self.make_request(
352+
"POST",
353+
f"_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device/{device_id}/events",
354+
content=content,
355+
access_token=token,
356+
shorthand=False,
357+
)
358+
self.assertEqual(channel.code, 200)
359+
self.assertEqual(channel.json_body["events"], [])
360+
361+
# make sure that the dehydrated device id is deleted after we received the messages
362+
channel = self.make_request(
363+
"GET",
364+
"_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device",
365+
access_token=token,
366+
shorthand=False,
367+
)
368+
self.assertEqual(channel.code, 404)

0 commit comments

Comments
 (0)