@@ -631,8 +631,7 @@ def test_rooms_required_state_combine_superset(self) -> None:
631631
632632 def test_rooms_required_state_partial_state (self ) -> None :
633633 """
634- Test partially-stated room are excluded unless `rooms.required_state` is
635- lazy-loading room members.
634+ Test partially-stated room are excluded if they require full state.
636635 """
637636 user1_id = self .register_user ("user1" , "pass" )
638637 user1_tok = self .login (user1_id , "pass" )
@@ -649,59 +648,195 @@ def test_rooms_required_state_partial_state(self) -> None:
649648 mark_event_as_partial_state (self .hs , join_response2 ["event_id" ], room_id2 )
650649 )
651650
652- # Make the Sliding Sync request (NOT lazy-loading room members)
651+ # Make the Sliding Sync request with examples where `must_await_full_state()` is
652+ # `False`
653653 sync_body = {
654654 "lists" : {
655- "foo-list" : {
655+ "no-state-list" : {
656+ "ranges" : [[0 , 1 ]],
657+ "required_state" : [],
658+ "timeline_limit" : 0 ,
659+ },
660+ "other-state-list" : {
656661 "ranges" : [[0 , 1 ]],
657662 "required_state" : [
658663 [EventTypes .Create , "" ],
659664 ],
660665 "timeline_limit" : 0 ,
661666 },
667+ "lazy-load-list" : {
668+ "ranges" : [[0 , 1 ]],
669+ "required_state" : [
670+ [EventTypes .Create , "" ],
671+ # Lazy-load room members
672+ [EventTypes .Member , StateValues .LAZY ],
673+ # Local member
674+ [EventTypes .Member , user2_id ],
675+ ],
676+ "timeline_limit" : 0 ,
677+ },
678+ "local-members-only-list" : {
679+ "ranges" : [[0 , 1 ]],
680+ "required_state" : [
681+ # Own user ID
682+ [EventTypes .Member , user1_id ],
683+ # Local member
684+ [EventTypes .Member , user2_id ],
685+ ],
686+ "timeline_limit" : 0 ,
687+ },
688+ "me-list" : {
689+ "ranges" : [[0 , 1 ]],
690+ "required_state" : [
691+ # Own user ID
692+ [EventTypes .Member , StateValues .ME ],
693+ # Local member
694+ [EventTypes .Member , user2_id ],
695+ ],
696+ "timeline_limit" : 0 ,
697+ },
698+ "wildcard-type-local-state-key-list" : {
699+ "ranges" : [[0 , 1 ]],
700+ "required_state" : [
701+ ["*" , user1_id ],
702+ # Not a user ID
703+ ["*" , "foobarbaz" ],
704+ # Not a user ID
705+ ["*" , "foo.bar.baz" ],
706+ # Not a user ID
707+ ["*" , "@foo" ],
708+ ],
709+ "timeline_limit" : 0 ,
710+ },
662711 }
663712 }
664713 response_body , _ = self .do_sync (sync_body , tok = user1_tok )
665714
666- # Make sure the list includes room1 but room2 is excluded because it's still
667- # partially-stated
668- self .assertListEqual (
669- list (response_body ["lists" ]["foo-list" ]["ops" ]),
670- [
671- {
672- "op" : "SYNC" ,
673- "range" : [0 , 1 ],
674- "room_ids" : [room_id1 ],
715+ # The list should include both rooms now because we don't need full state
716+ for list_key in response_body ["lists" ].keys ():
717+ self .assertIncludes (
718+ set (response_body ["lists" ][list_key ]["ops" ][0 ]["room_ids" ]),
719+ {room_id2 , room_id1 },
720+ exact = True ,
721+ message = f"Expected all rooms to show up for list_key={ list_key } . Response "
722+ + str (response_body ["lists" ][list_key ]),
723+ )
724+
725+ # Take each of the list variants and apply them to room subscriptions to make
726+ # sure the same rules apply
727+ for list_key in sync_body ["lists" ].keys ():
728+ sync_body_for_subscriptions = {
729+ "room_subscriptions" : {
730+ room_id1 : {
731+ "required_state" : sync_body ["lists" ][list_key ][
732+ "required_state"
733+ ],
734+ "timeline_limit" : 0 ,
735+ },
736+ room_id2 : {
737+ "required_state" : sync_body ["lists" ][list_key ][
738+ "required_state"
739+ ],
740+ "timeline_limit" : 0 ,
741+ },
675742 }
676- ],
677- response_body ["lists" ]["foo-list" ],
678- )
743+ }
744+ response_body , _ = self .do_sync (sync_body_for_subscriptions , tok = user1_tok )
745+
746+ self .assertIncludes (
747+ set (response_body ["rooms" ].keys ()),
748+ {room_id2 , room_id1 },
749+ exact = True ,
750+ message = f"Expected all rooms to show up for test_key={ list_key } ." ,
751+ )
679752
680- # Make the Sliding Sync request (with lazy-loading room members)
753+ # =====================================================================
754+
755+ # Make the Sliding Sync request with examples where `must_await_full_state()` is
756+ # `True`
681757 sync_body = {
682758 "lists" : {
683- "foo-list" : {
759+ "wildcard-list" : {
760+ "ranges" : [[0 , 1 ]],
761+ "required_state" : [
762+ ["*" , "*" ],
763+ ],
764+ "timeline_limit" : 0 ,
765+ },
766+ "wildcard-type-remote-state-key-list" : {
767+ "ranges" : [[0 , 1 ]],
768+ "required_state" : [
769+ ["*" , "@some:remote" ],
770+ # Not a user ID
771+ ["*" , "foobarbaz" ],
772+ # Not a user ID
773+ ["*" , "foo.bar.baz" ],
774+ # Not a user ID
775+ ["*" , "@foo" ],
776+ ],
777+ "timeline_limit" : 0 ,
778+ },
779+ "remote-member-list" : {
780+ "ranges" : [[0 , 1 ]],
781+ "required_state" : [
782+ # Own user ID
783+ [EventTypes .Member , user1_id ],
784+ # Remote member
785+ [EventTypes .Member , "@some:remote" ],
786+ # Local member
787+ [EventTypes .Member , user2_id ],
788+ ],
789+ "timeline_limit" : 0 ,
790+ },
791+ "lazy-but-remote-member-list" : {
684792 "ranges" : [[0 , 1 ]],
685793 "required_state" : [
686- [EventTypes .Create , "" ],
687794 # Lazy-load room members
688795 [EventTypes .Member , StateValues .LAZY ],
796+ # Remote member
797+ [EventTypes .Member , "@some:remote" ],
689798 ],
690799 "timeline_limit" : 0 ,
691800 },
692801 }
693802 }
694803 response_body , _ = self .do_sync (sync_body , tok = user1_tok )
695804
696- # The list should include both rooms now because we're lazy-loading room members
697- self .assertListEqual (
698- list (response_body ["lists" ]["foo-list" ]["ops" ]),
699- [
700- {
701- "op" : "SYNC" ,
702- "range" : [0 , 1 ],
703- "room_ids" : [room_id2 , room_id1 ],
805+ # Make sure the list includes room1 but room2 is excluded because it's still
806+ # partially-stated
807+ for list_key in response_body ["lists" ].keys ():
808+ self .assertIncludes (
809+ set (response_body ["lists" ][list_key ]["ops" ][0 ]["room_ids" ]),
810+ {room_id1 },
811+ exact = True ,
812+ message = f"Expected only fully-stated rooms to show up for list_key={ list_key } . Response "
813+ + str (response_body ["lists" ][list_key ]),
814+ )
815+
816+ # Take each of the list variants and apply them to room subscriptions to make
817+ # sure the same rules apply
818+ for list_key in sync_body ["lists" ].keys ():
819+ sync_body_for_subscriptions = {
820+ "room_subscriptions" : {
821+ room_id1 : {
822+ "required_state" : sync_body ["lists" ][list_key ][
823+ "required_state"
824+ ],
825+ "timeline_limit" : 0 ,
826+ },
827+ room_id2 : {
828+ "required_state" : sync_body ["lists" ][list_key ][
829+ "required_state"
830+ ],
831+ "timeline_limit" : 0 ,
832+ },
704833 }
705- ],
706- response_body ["lists" ]["foo-list" ],
707- )
834+ }
835+ response_body , _ = self .do_sync (sync_body_for_subscriptions , tok = user1_tok )
836+
837+ self .assertIncludes (
838+ set (response_body ["rooms" ].keys ()),
839+ {room_id1 },
840+ exact = True ,
841+ message = f"Expected only fully-stated rooms to show up for test_key={ list_key } ." ,
842+ )
0 commit comments