From 61258e823fc8dbd433de88c7380f097e4db41523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Tue, 5 Aug 2025 09:05:35 +0200 Subject: [PATCH] test: Fix and add tests for computing the push conditions requiring the room creation event --- .../tests/integration/notification_client.rs | 9 ++- crates/matrix-sdk/src/room/mod.rs | 68 ++++++++++++++++++- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/crates/matrix-sdk-ui/tests/integration/notification_client.rs b/crates/matrix-sdk-ui/tests/integration/notification_client.rs index a5880d1bf..2317ab07a 100644 --- a/crates/matrix-sdk-ui/tests/integration/notification_client.rs +++ b/crates/matrix-sdk-ui/tests/integration/notification_client.rs @@ -22,7 +22,7 @@ use matrix_sdk_ui::{ sync_service::SyncService, }; use ruma::{ - event_id, + RoomVersionId, event_id, events::{TimelineEventType, room::member::MembershipState}, mxc_uri, room_id, user_id, }; @@ -128,6 +128,8 @@ async fn test_notification_client_sliding_sync() { let event_factory = EventFactory::new().room(room_id); + let room_create_event = event_factory.create(sender, RoomVersionId::V1).into_raw_sync(); + let sender_member_event = event_factory .member(sender) .display_name(sender_display_name) @@ -173,6 +175,9 @@ async fn test_notification_client_sliding_sync() { "initial": true, "required_state": [ + // The room creation event. + room_create_event, + // Sender's member information. sender_member_event, @@ -230,6 +235,7 @@ async fn test_notification_client_sliding_sync() { ["m.room.power_levels", ""], ["m.room.join_rules", ""], ["org.matrix.msc3401.call.member", "*"], + ["m.room.create", ""], ], "filters": { "is_invite": true, @@ -248,6 +254,7 @@ async fn test_notification_client_sliding_sync() { ["m.room.power_levels", ""], ["m.room.join_rules", ""], ["org.matrix.msc3401.call.member", "*"], + ["m.room.create", ""], ], "timeline_limit": 16, }, diff --git a/crates/matrix-sdk/src/room/mod.rs b/crates/matrix-sdk/src/room/mod.rs index 50f6bfd02..119cb90d5 100644 --- a/crates/matrix-sdk/src/room/mod.rs +++ b/crates/matrix-sdk/src/room/mod.rs @@ -4083,6 +4083,8 @@ pub struct RoomMemberWithSenderInfo { #[cfg(all(test, not(target_family = "wasm")))] mod tests { + use std::collections::BTreeMap; + use matrix_sdk_base::{store::ComposerDraftType, ComposerDraft}; use matrix_sdk_test::{ async_test, event_factory::EventFactory, test_json, JoinedRoomBuilder, StateTestEvent, @@ -4091,7 +4093,7 @@ mod tests { use ruma::{ event_id, events::{relation::RelationType, room::member::MembershipState}, - int, owned_event_id, room_id, user_id, + int, owned_event_id, room_id, user_id, RoomVersionId, }; use wiremock::{ matchers::{header, method, path_regex}, @@ -4644,4 +4646,68 @@ mod tests { assert!(result.next_batch_token.is_none()); assert!(result.recursion_depth.is_none()); } + + #[async_test] + async fn test_power_levels_computation() { + let server = MatrixMockServer::new().await; + let client = server.client_builder().build().await; + + let room_id = room_id!("!a:b.c"); + let sender_id = client.user_id().expect("No session id"); + let f = EventFactory::new().room(room_id).sender(sender_id); + let mut user_map = BTreeMap::from([(sender_id.into(), 50.into())]); + + // Computing the power levels will need these 3 state events: + let room_create_event = f.create(sender_id, RoomVersionId::V1).state_key("").into_raw(); + let power_levels_event = f.power_levels(&mut user_map).state_key("").into_raw(); + let room_member_event = f.member(sender_id).into_raw(); + + // With only the room member event + let room = server + .sync_room( + &client, + JoinedRoomBuilder::new(room_id).add_state_bulk([room_member_event.clone()]), + ) + .await; + let ctx = room + .push_condition_room_ctx() + .await + .expect("Failed to get push condition context") + .expect("Could not get push condition context"); + + // The internal power levels couldn't be computed + assert!(ctx.power_levels.is_none()); + + // Adding the room creation event + let room = server + .sync_room( + &client, + JoinedRoomBuilder::new(room_id).add_state_bulk([room_create_event.clone()]), + ) + .await; + let ctx = room + .push_condition_room_ctx() + .await + .expect("Failed to get push condition context") + .expect("Could not get push condition context"); + + // The internal power levels still couldn't be computed + assert!(ctx.power_levels.is_none()); + + // With the room member, room creation and the power levels events + let room = server + .sync_room( + &client, + JoinedRoomBuilder::new(room_id).add_state_bulk([power_levels_event]), + ) + .await; + let ctx = room + .push_condition_room_ctx() + .await + .expect("Failed to get push condition context") + .expect("Could not get push condition context"); + + // The internal power levels can finally be computed + assert!(ctx.power_levels.is_some()); + } }