From bcd0d20e2fe83ea9690dfe951cb19696300afd3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 29 Nov 2024 12:53:44 +0100 Subject: [PATCH] test: Add a method to build `m.room.member` events in the EventFactory --- testing/matrix-sdk-test/src/event_factory.rs | 70 ++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/testing/matrix-sdk-test/src/event_factory.rs b/testing/matrix-sdk-test/src/event_factory.rs index 1a8b8dbe8..16787599c 100644 --- a/testing/matrix-sdk-test/src/event_factory.rs +++ b/testing/matrix-sdk-test/src/event_factory.rs @@ -35,6 +35,7 @@ use ruma::{ relation::{Annotation, InReplyTo, Replacement, Thread}, room::{ encrypted::{EncryptedEventScheme, RoomEncryptedEventContent}, + member::{MembershipState, RoomMemberEventContent}, message::{ FormattedBody, ImageMessageEventContent, MessageType, Relation, RoomMessageEventContent, RoomMessageEventContentWithoutRelation, @@ -175,6 +176,15 @@ where Raw::new(map).unwrap().cast() } + /// Build an event from the [`EventBuilder`] and convert it into a + /// serialized and [`Raw`] event. + /// + /// The generic argument `T` allows you to automatically cast the [`Raw`] + /// event into any desired type. + pub fn into_raw(self) -> Raw { + self.construct_json(true) + } + pub fn into_raw_timeline(self) -> Raw { self.construct_json(true) } @@ -343,6 +353,49 @@ impl EventFactory { self.event(RoomMessageEventContent::text_plain(content.into())) } + /// Create a new `m.room.member` event for the given member. + /// + /// The given member will be used as the `sender` as well as the `state_key` + /// of the `m.room.member` event, unless the `sender` was already using + /// [`EventFactory::sender()`], in that case only the state key will be + /// set to the given `member`. + /// + /// The `membership` field of the content is set to + /// [`MembershipState::Join`]. + /// + /// ``` + /// use matrix_sdk_test::event_factory::EventFactory; + /// use ruma::{ + /// events::{ + /// room::member::{MembershipState, RoomMemberEventContent}, + /// SyncStateEvent, + /// }, + /// room_id, + /// serde::Raw, + /// user_id, + /// }; + /// + /// let factory = EventFactory::new().room(room_id!("!test:localhost")); + /// + /// let event: Raw> = factory + /// .member(user_id!("@alice:localhost")) + /// .display_name("Alice") + /// .into_raw(); + /// ``` + pub fn member(&self, member: &UserId) -> EventBuilder { + let mut event = self.event(RoomMemberEventContent::new(MembershipState::Join)); + + if self.sender.is_some() { + event.sender = self.sender.clone(); + } else { + event.sender = Some(member.to_owned()); + } + + event.state_key = Some(member.to_string()); + + event + } + /// Create a new plain/html `m.room.message`. pub fn text_html( &self, @@ -463,3 +516,20 @@ impl EventFactory { self.next_ts.store(value, SeqCst); } } + +impl EventBuilder { + /// Set the `membership` of the `m.room.member` event to the given + /// [`MembershipState`]. + /// + /// The default is [`MembershipState::Join`]. + pub fn membership(mut self, state: MembershipState) -> Self { + self.content.membership = state; + self + } + + /// Set the display name of the `m.room.member` event. + pub fn display_name(mut self, display_name: impl Into) -> Self { + self.content.displayname = Some(display_name.into()); + self + } +}