@@ -1015,6 +1015,78 @@ def test_lazy_members_across_multiple_rooms(self) -> None:
10151015 exact = True ,
10161016 )
10171017
1018+ def test_lazy_members_forked_position (self ) -> None :
1019+ """Test that lazy loading room members are tracked correctly when a
1020+ connection position is reused"""
1021+
1022+ user1_id = self .register_user ("user1" , "pass" )
1023+ user1_tok = self .login (user1_id , "pass" )
1024+ user2_id = self .register_user ("user2" , "pass" )
1025+ user2_tok = self .login (user2_id , "pass" )
1026+
1027+ room_id1 = self .helper .create_room_as (user2_id , tok = user2_tok )
1028+ self .helper .join (room_id1 , user1_id , tok = user1_tok )
1029+
1030+ self .helper .send (room_id1 , "1" , tok = user2_tok )
1031+
1032+ # Make a sync with lazy loading for the room members to establish
1033+ # a position
1034+ sync_body = {
1035+ "lists" : {
1036+ "foo-list" : {
1037+ "ranges" : [[0 , 1 ]],
1038+ "required_state" : [
1039+ [EventTypes .Member , StateValues .LAZY ],
1040+ ],
1041+ "timeline_limit" : 1 ,
1042+ }
1043+ }
1044+ }
1045+ response_body , from_token = self .do_sync (sync_body , tok = user1_tok )
1046+
1047+ # We expect to see only user2's membership in the room
1048+ state_map = self .get_success (
1049+ self .storage_controllers .state .get_current_state (room_id1 )
1050+ )
1051+ self ._assertRequiredStateIncludes (
1052+ response_body ["rooms" ][room_id1 ]["required_state" ],
1053+ {
1054+ state_map [(EventTypes .Member , user2_id )],
1055+ },
1056+ exact = True ,
1057+ )
1058+
1059+ # Send a message in room1 from user1
1060+ self .helper .send (room_id1 , "2" , tok = user1_tok )
1061+
1062+ # Make an incremental Sliding Sync request and check that we get user1's
1063+ # membership.
1064+ response_body , _ = self .do_sync (sync_body , since = from_token , tok = user1_tok )
1065+ state_map = self .get_success (
1066+ self .storage_controllers .state .get_current_state (room_id1 )
1067+ )
1068+ self ._assertRequiredStateIncludes (
1069+ response_body ["rooms" ][room_id1 ]["required_state" ],
1070+ {
1071+ state_map [(EventTypes .Member , user1_id )],
1072+ },
1073+ exact = True ,
1074+ )
1075+
1076+ # Now, reuse the original position and check we still get user1's
1077+ # membership.
1078+ response_body , _ = self .do_sync (sync_body , since = from_token , tok = user1_tok )
1079+ state_map = self .get_success (
1080+ self .storage_controllers .state .get_current_state (room_id1 )
1081+ )
1082+ self ._assertRequiredStateIncludes (
1083+ response_body ["rooms" ][room_id1 ]["required_state" ],
1084+ {
1085+ state_map [(EventTypes .Member , user1_id )],
1086+ },
1087+ exact = True ,
1088+ )
1089+
10181090 def test_rooms_required_state_me (self ) -> None :
10191091 """
10201092 Test `rooms.required_state` correctly handles $ME.
0 commit comments