@@ -751,9 +751,10 @@ def test_rooms_required_state_me(self) -> None:
751
751
self .assertIsNone (response_body ["rooms" ][room_id1 ].get ("invite_state" ))
752
752
753
753
@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 :
755
755
"""
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.
757
758
"""
758
759
user1_id = self .register_user ("user1" , "pass" )
759
760
user1_tok = self .login (user1_id , "pass" )
@@ -788,6 +789,13 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
788
789
body = {"foo" : "bar" },
789
790
tok = user2_tok ,
790
791
)
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
+ )
791
799
792
800
if stop_membership == Membership .LEAVE :
793
801
# User 1 leaves
@@ -796,6 +804,8 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
796
804
# User 1 is banned
797
805
self .helper .ban (room_id1 , src = user2_id , targ = user1_id , tok = user2_tok )
798
806
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
799
809
state_map = self .get_success (
800
810
self .storage_controllers .state .get_current_state (room_id1 )
801
811
)
@@ -808,12 +818,36 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
808
818
body = {"foo" : "qux" },
809
819
tok = user2_tok ,
810
820
)
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
+ )
811
828
self .helper .leave (room_id1 , user3_id , tok = user3_tok )
812
829
813
830
# 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
+ }
814
848
response_body , _ = self .do_sync (sync_body , since = from_token , tok = user1_tok )
815
849
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
817
851
self ._assertRequiredStateIncludes (
818
852
response_body ["rooms" ][room_id1 ]["required_state" ],
819
853
{
@@ -822,6 +856,126 @@ def test_rooms_required_state_leave_ban(self, stop_membership: str) -> None:
822
856
state_map [(EventTypes .Member , user2_id )],
823
857
state_map [(EventTypes .Member , user3_id )],
824
858
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", "")],
825
979
},
826
980
exact = True ,
827
981
)
0 commit comments