@@ -4083,6 +4083,8 @@ pub struct RoomMemberWithSenderInfo {
4083
4083
4084
4084
#[ cfg( all( test, not( target_family = "wasm" ) ) ) ]
4085
4085
mod tests {
4086
+ use std:: collections:: BTreeMap ;
4087
+
4086
4088
use matrix_sdk_base:: { store:: ComposerDraftType , ComposerDraft } ;
4087
4089
use matrix_sdk_test:: {
4088
4090
async_test, event_factory:: EventFactory , test_json, JoinedRoomBuilder , StateTestEvent ,
@@ -4091,7 +4093,7 @@ mod tests {
4091
4093
use ruma:: {
4092
4094
event_id,
4093
4095
events:: { relation:: RelationType , room:: member:: MembershipState } ,
4094
- int, owned_event_id, room_id, user_id,
4096
+ int, owned_event_id, room_id, user_id, RoomVersionId ,
4095
4097
} ;
4096
4098
use wiremock:: {
4097
4099
matchers:: { header, method, path_regex} ,
@@ -4644,4 +4646,68 @@ mod tests {
4644
4646
assert ! ( result. next_batch_token. is_none( ) ) ;
4645
4647
assert ! ( result. recursion_depth. is_none( ) ) ;
4646
4648
}
4649
+
4650
+ #[ async_test]
4651
+ async fn test_power_levels_computation ( ) {
4652
+ let server = MatrixMockServer :: new ( ) . await ;
4653
+ let client = server. client_builder ( ) . build ( ) . await ;
4654
+
4655
+ let room_id = room_id ! ( "!a:b.c" ) ;
4656
+ let sender_id = client. user_id ( ) . expect ( "No session id" ) ;
4657
+ let f = EventFactory :: new ( ) . room ( room_id) . sender ( sender_id) ;
4658
+ let mut user_map = BTreeMap :: from ( [ ( sender_id. into ( ) , 50 . into ( ) ) ] ) ;
4659
+
4660
+ // Computing the power levels will need these 3 state events:
4661
+ let room_create_event = f. create ( sender_id, RoomVersionId :: V1 ) . state_key ( "" ) . into_raw ( ) ;
4662
+ let power_levels_event = f. power_levels ( & mut user_map) . state_key ( "" ) . into_raw ( ) ;
4663
+ let room_member_event = f. member ( sender_id) . into_raw ( ) ;
4664
+
4665
+ // With only the room member event
4666
+ let room = server
4667
+ . sync_room (
4668
+ & client,
4669
+ JoinedRoomBuilder :: new ( room_id) . add_state_bulk ( [ room_member_event. clone ( ) ] ) ,
4670
+ )
4671
+ . await ;
4672
+ let ctx = room
4673
+ . push_condition_room_ctx ( )
4674
+ . await
4675
+ . expect ( "Failed to get push condition context" )
4676
+ . expect ( "Could not get push condition context" ) ;
4677
+
4678
+ // The internal power levels couldn't be computed
4679
+ assert ! ( ctx. power_levels. is_none( ) ) ;
4680
+
4681
+ // Adding the room creation event
4682
+ let room = server
4683
+ . sync_room (
4684
+ & client,
4685
+ JoinedRoomBuilder :: new ( room_id) . add_state_bulk ( [ room_create_event. clone ( ) ] ) ,
4686
+ )
4687
+ . await ;
4688
+ let ctx = room
4689
+ . push_condition_room_ctx ( )
4690
+ . await
4691
+ . expect ( "Failed to get push condition context" )
4692
+ . expect ( "Could not get push condition context" ) ;
4693
+
4694
+ // The internal power levels still couldn't be computed
4695
+ assert ! ( ctx. power_levels. is_none( ) ) ;
4696
+
4697
+ // With the room member, room creation and the power levels events
4698
+ let room = server
4699
+ . sync_room (
4700
+ & client,
4701
+ JoinedRoomBuilder :: new ( room_id) . add_state_bulk ( [ power_levels_event] ) ,
4702
+ )
4703
+ . await ;
4704
+ let ctx = room
4705
+ . push_condition_room_ctx ( )
4706
+ . await
4707
+ . expect ( "Failed to get push condition context" )
4708
+ . expect ( "Could not get push condition context" ) ;
4709
+
4710
+ // The internal power levels can finally be computed
4711
+ assert ! ( ctx. power_levels. is_some( ) ) ;
4712
+ }
4647
4713
}
0 commit comments