@@ -751,9 +751,10 @@ def test_rooms_required_state_me(self) -> None:
751751 self .assertIsNone (response_body ["rooms" ][room_id1 ].get ("invite_state" ))
752752
753753 @parameterized .expand ([(Membership .LEAVE ,), (Membership .BAN ,)])
754- def test_rooms_required_state_leave_ban (self , stop_membership : str ) -> None :
754+ def test_rooms_required_state_leave_ban_initial (self , stop_membership : str ) -> None :
755755 """
756- Test `rooms.required_state` should not return state past a leave/ban event.
756+ Test `rooms.required_state` should not return state past a leave/ban event when
757+ it's the first "initial" time the room is being sent down the connection.
757758 """
758759 user1_id = self .register_user ("user1" , "pass" )
759760 user1_tok = self .login (user1_id , "pass" )
@@ -788,6 +789,13 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
788789 body = {"foo" : "bar" },
789790 tok = user2_tok ,
790791 )
792+ self .helper .send_state (
793+ room_id1 ,
794+ event_type = "org.matrix.bar_state" ,
795+ state_key = "" ,
796+ body = {"bar" : "bar" },
797+ tok = user2_tok ,
798+ )
791799
792800 if stop_membership == Membership .LEAVE :
793801 # User 1 leaves
@@ -796,6 +804,8 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
796804 # User 1 is banned
797805 self .helper .ban (room_id1 , src = user2_id , targ = user1_id , tok = user2_tok )
798806
807+ # Get the state_map before we change the state as this is the final state we
808+ # expect User1 to be able to see
799809 state_map = self .get_success (
800810 self .storage_controllers .state .get_current_state (room_id1 )
801811 )
@@ -808,12 +818,36 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
808818 body = {"foo" : "qux" },
809819 tok = user2_tok ,
810820 )
821+ self .helper .send_state (
822+ room_id1 ,
823+ event_type = "org.matrix.bar_state" ,
824+ state_key = "" ,
825+ body = {"bar" : "qux" },
826+ tok = user2_tok ,
827+ )
811828 self .helper .leave (room_id1 , user3_id , tok = user3_tok )
812829
813830 # Make an incremental Sliding Sync request
831+ #
832+ # Also expand the required state to include the `org.matrix.bar_state` event.
833+ # This is just an extra complication of the test.
834+ sync_body = {
835+ "lists" : {
836+ "foo-list" : {
837+ "ranges" : [[0 , 1 ]],
838+ "required_state" : [
839+ [EventTypes .Create , "" ],
840+ [EventTypes .Member , "*" ],
841+ ["org.matrix.foo_state" , "" ],
842+ ["org.matrix.bar_state" , "" ],
843+ ],
844+ "timeline_limit" : 3 ,
845+ }
846+ }
847+ }
814848 response_body , _ = self .do_sync (sync_body , since = from_token , tok = user1_tok )
815849
816- # Only user2 and user3 sent events in the 3 events we see in the `timeline`
850+ # We should only see the state up to the leave/ban event
817851 self ._assertRequiredStateIncludes (
818852 response_body ["rooms" ][room_id1 ]["required_state" ],
819853 {
@@ -822,6 +856,126 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
822856 state_map [(EventTypes .Member , user2_id )],
823857 state_map [(EventTypes .Member , user3_id )],
824858 state_map [("org.matrix.foo_state" , "" )],
859+ state_map [("org.matrix.bar_state" , "" )],
860+ },
861+ exact = True ,
862+ )
863+ self .assertIsNone (response_body ["rooms" ][room_id1 ].get ("invite_state" ))
864+
865+ @parameterized .expand ([(Membership .LEAVE ,), (Membership .BAN ,)])
866+ def test_rooms_required_state_leave_ban_incremental (
867+ self , stop_membership : str
868+ ) -> None :
869+ """
870+ Test `rooms.required_state` should not return state past a leave/ban event on
871+ incremental sync.
872+ """
873+ user1_id = self .register_user ("user1" , "pass" )
874+ user1_tok = self .login (user1_id , "pass" )
875+ user2_id = self .register_user ("user2" , "pass" )
876+ user2_tok = self .login (user2_id , "pass" )
877+ user3_id = self .register_user ("user3" , "pass" )
878+ user3_tok = self .login (user3_id , "pass" )
879+
880+ room_id1 = self .helper .create_room_as (user2_id , tok = user2_tok )
881+ self .helper .join (room_id1 , user1_id , tok = user1_tok )
882+ self .helper .join (room_id1 , user3_id , tok = user3_tok )
883+
884+ self .helper .send_state (
885+ room_id1 ,
886+ event_type = "org.matrix.foo_state" ,
887+ state_key = "" ,
888+ body = {"foo" : "bar" },
889+ tok = user2_tok ,
890+ )
891+ self .helper .send_state (
892+ room_id1 ,
893+ event_type = "org.matrix.bar_state" ,
894+ state_key = "" ,
895+ body = {"bar" : "bar" },
896+ tok = user2_tok ,
897+ )
898+
899+ sync_body = {
900+ "lists" : {
901+ "foo-list" : {
902+ "ranges" : [[0 , 1 ]],
903+ "required_state" : [
904+ [EventTypes .Create , "" ],
905+ [EventTypes .Member , "*" ],
906+ ["org.matrix.foo_state" , "" ],
907+ ],
908+ "timeline_limit" : 3 ,
909+ }
910+ }
911+ }
912+ _ , from_token = self .do_sync (sync_body , tok = user1_tok )
913+
914+ if stop_membership == Membership .LEAVE :
915+ # User 1 leaves
916+ self .helper .leave (room_id1 , user1_id , tok = user1_tok )
917+ elif stop_membership == Membership .BAN :
918+ # User 1 is banned
919+ self .helper .ban (room_id1 , src = user2_id , targ = user1_id , tok = user2_tok )
920+
921+ # Get the state_map before we change the state as this is the final state we
922+ # expect User1 to be able to see
923+ state_map = self .get_success (
924+ self .storage_controllers .state .get_current_state (room_id1 )
925+ )
926+
927+ # Change the state after user 1 leaves
928+ self .helper .send_state (
929+ room_id1 ,
930+ event_type = "org.matrix.foo_state" ,
931+ state_key = "" ,
932+ body = {"foo" : "qux" },
933+ tok = user2_tok ,
934+ )
935+ self .helper .send_state (
936+ room_id1 ,
937+ event_type = "org.matrix.bar_state" ,
938+ state_key = "" ,
939+ body = {"bar" : "qux" },
940+ tok = user2_tok ,
941+ )
942+ self .helper .leave (room_id1 , user3_id , tok = user3_tok )
943+
944+ # Make an incremental Sliding Sync request
945+ #
946+ # Also expand the required state to include the `org.matrix.bar_state` event.
947+ # This is just an extra complication of the test.
948+ sync_body = {
949+ "lists" : {
950+ "foo-list" : {
951+ "ranges" : [[0 , 1 ]],
952+ "required_state" : [
953+ [EventTypes .Create , "" ],
954+ [EventTypes .Member , "*" ],
955+ ["org.matrix.foo_state" , "" ],
956+ ["org.matrix.bar_state" , "" ],
957+ ],
958+ "timeline_limit" : 3 ,
959+ }
960+ }
961+ }
962+ response_body , _ = self .do_sync (sync_body , since = from_token , tok = user1_tok )
963+
964+ # User1 should only see the state up to the leave/ban event
965+ self ._assertRequiredStateIncludes (
966+ response_body ["rooms" ][room_id1 ]["required_state" ],
967+ {
968+ # User1 should see their leave/ban membership
969+ state_map [(EventTypes .Member , user1_id )],
970+ state_map [("org.matrix.bar_state" , "" )],
971+ # The commented out state events were already returned in the initial
972+ # sync so we shouldn't see them again on the incremental sync. And we
973+ # shouldn't see the state events that changed after the leave/ban event.
974+ #
975+ # state_map[(EventTypes.Create, "")],
976+ # state_map[(EventTypes.Member, user2_id)],
977+ # state_map[(EventTypes.Member, user3_id)],
978+ # state_map[("org.matrix.foo_state", "")],
825979 },
826980 exact = True ,
827981 )
0 commit comments