2727import synapse .rest .admin
2828from synapse .api .errors import Codes
2929from synapse .handlers .device import DeviceHandler
30- from synapse .rest .client import login
30+ from synapse .rest .client import devices , login
3131from synapse .server import HomeServer
3232from synapse .util import Clock
3333
@@ -299,6 +299,7 @@ def test_delete_device(self) -> None:
299299class DevicesRestTestCase (unittest .HomeserverTestCase ):
300300 servlets = [
301301 synapse .rest .admin .register_servlets ,
302+ devices .register_servlets ,
302303 login .register_servlets ,
303304 ]
304305
@@ -390,15 +391,63 @@ def test_user_has_no_devices(self) -> None:
390391 self .assertEqual (0 , channel .json_body ["total" ])
391392 self .assertEqual (0 , len (channel .json_body ["devices" ]))
392393
394+ @unittest .override_config (
395+ {"experimental_features" : {"msc2697_enabled" : False , "msc3814_enabled" : True }}
396+ )
393397 def test_get_devices (self ) -> None :
394398 """
395399 Tests that a normal lookup for devices is successfully
396400 """
397401 # Create devices
398402 number_devices = 5
399- for _ in range (number_devices ):
403+ # we create 2 fewer devices in the loop, because we will create another
404+ # login after the loop, and we will create a dehydrated device
405+ for _ in range (number_devices - 2 ):
400406 self .login ("user" , "pass" )
401407
408+ other_user_token = self .login ("user" , "pass" )
409+ dehydrated_device_url = (
410+ "/_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device"
411+ )
412+ content = {
413+ "device_data" : {
414+ "algorithm" : "m.dehydration.v1.olm" ,
415+ },
416+ "device_id" : "dehydrated_device" ,
417+ "initial_device_display_name" : "foo bar" ,
418+ "device_keys" : {
419+ "user_id" : "@user:test" ,
420+ "device_id" : "dehydrated_device" ,
421+ "valid_until_ts" : "80" ,
422+ "algorithms" : [
423+ "m.olm.curve25519-aes-sha2" ,
424+ ],
425+ "keys" : {
426+ "<algorithm>:<device_id>" : "<key_base64>" ,
427+ },
428+ "signatures" : {
429+ "@user:test" : {"<algorithm>:<device_id>" : "<signature_base64>" }
430+ },
431+ },
432+ "fallback_keys" : {
433+ "alg1:device1" : "f4llb4ckk3y" ,
434+ "signed_<algorithm>:<device_id>" : {
435+ "fallback" : "true" ,
436+ "key" : "f4llb4ckk3y" ,
437+ "signatures" : {
438+ "@user:test" : {"<algorithm>:<device_id>" : "<key_base64>" }
439+ },
440+ },
441+ },
442+ "one_time_keys" : {"alg1:k1" : "0net1m3k3y" },
443+ }
444+ self .make_request (
445+ "PUT" ,
446+ dehydrated_device_url ,
447+ access_token = other_user_token ,
448+ content = content ,
449+ )
450+
402451 # Get devices
403452 channel = self .make_request (
404453 "GET" ,
@@ -410,13 +459,22 @@ def test_get_devices(self) -> None:
410459 self .assertEqual (number_devices , channel .json_body ["total" ])
411460 self .assertEqual (number_devices , len (channel .json_body ["devices" ]))
412461 self .assertEqual (self .other_user , channel .json_body ["devices" ][0 ]["user_id" ])
413- # Check that all fields are available
462+ # Check that all fields are available, and that the dehydrated device is marked as dehydrated
463+ found_dehydrated = False
414464 for d in channel .json_body ["devices" ]:
415465 self .assertIn ("user_id" , d )
416466 self .assertIn ("device_id" , d )
417467 self .assertIn ("display_name" , d )
418468 self .assertIn ("last_seen_ip" , d )
419469 self .assertIn ("last_seen_ts" , d )
470+ if d ["device_id" ] == "dehydrated_device" :
471+ self .assertTrue (d .get ("dehydrated" ))
472+ found_dehydrated = True
473+ else :
474+ # Either the field is not present, or set to False
475+ self .assertFalse (d .get ("dehydrated" ))
476+
477+ self .assertTrue (found_dehydrated )
420478
421479
422480class DeleteDevicesRestTestCase (unittest .HomeserverTestCase ):
0 commit comments