@@ -31,6 +31,7 @@ use ruma::{
3131    directory:: PublicRoomsChunk , 
3232    events:: { AnyStateEvent ,  AnyTimelineEvent ,  MessageLikeEventType ,  StateEventType } , 
3333    serde:: Raw , 
34+     time:: Duration , 
3435    MxcUri ,  OwnedEventId ,  OwnedRoomId ,  RoomId ,  ServerName , 
3536} ; 
3637use  serde:: Deserialize ; 
@@ -952,6 +953,72 @@ impl<'a> MockEndpoint<'a, RoomSendEndpoint> {
952953        } 
953954    } 
954955
956+     /// Ensures the event was sent as a delayed event. 
957+      /// 
958+      /// Note: works with *any* room. 
959+      /// 
960+      /// # Examples 
961+      /// 
962+      /// see also [`MatrixMockServer::mock_room_send`] for more context. 
963+      /// 
964+      /// ``` 
965+      /// # tokio_test::block_on(async { 
966+      /// use matrix_sdk::{ 
967+      ///     ruma::{ 
968+      ///         api::client::delayed_events::{delayed_message_event, DelayParameters}, 
969+      ///         events::{message::MessageEventContent, AnyMessageLikeEventContent}, 
970+      ///         room_id, 
971+      ///         time::Duration, 
972+      ///         TransactionId, 
973+      ///     }, 
974+      ///     test_utils::mocks::MatrixMockServer, 
975+      /// }; 
976+      /// use serde_json::json; 
977+      /// use wiremock::ResponseTemplate; 
978+      /// 
979+      /// let mock_server = MatrixMockServer::new().await; 
980+      /// let client = mock_server.client_builder().build().await; 
981+      /// 
982+      /// mock_server.mock_room_state_encryption().plain().mount().await; 
983+      /// 
984+      /// let room = mock_server.sync_joined_room(&client, room_id!("!room_id:localhost")).await; 
985+      /// 
986+      /// mock_server 
987+      ///     .mock_room_send() 
988+      ///     .with_delay(Duration::from_millis(500)) 
989+      ///     .respond_with(ResponseTemplate::new(200).set_body_json(json!({"delay_id":"$some_id"}))) 
990+      ///     .mock_once() 
991+      ///     .mount() 
992+      ///     .await; 
993+      /// 
994+      /// let response_not_mocked = 
995+      ///     room.send_raw("m.room.message", json!({ "body": "Hello world" })).await; 
996+      /// 
997+      /// // A non delayed event should not be mocked by the server. 
998+      /// assert!(response_not_mocked.is_err()); 
999+      /// 
1000+      /// let r = delayed_message_event::unstable::Request::new( 
1001+      ///     room.room_id().to_owned(), 
1002+      ///     TransactionId::new(), 
1003+      ///     DelayParameters::Timeout { timeout: Duration::from_millis(500) }, 
1004+      ///     &AnyMessageLikeEventContent::Message(MessageEventContent::plain("hello world")), 
1005+      /// ) 
1006+      /// .unwrap(); 
1007+      /// 
1008+      /// let response = room.client().send(r, None).await.unwrap(); 
1009+      /// // The delayed `m.room.message` event type should be mocked by the server. 
1010+      /// assert_eq!("$some_id", response.delay_id);     
1011+      /// # anyhow::Ok(()) }); 
1012+      /// ``` 
1013+      pub  fn  with_delay ( self ,  delay :  Duration )  -> Self  { 
1014+         Self  { 
1015+             mock :  self 
1016+                 . mock 
1017+                 . and ( query_param ( "org.matrix.msc4140.delay" ,  delay. as_millis ( ) . to_string ( ) ) ) , 
1018+             ..self 
1019+         } 
1020+     } 
1021+ 
9551022    /// Returns a send endpoint that emulates success, i.e. the event has been 
9561023     /// sent with the given event id. 
9571024     /// 
@@ -1117,6 +1184,69 @@ impl<'a> MockEndpoint<'a, RoomSendStateEndpoint> {
11171184        Self  {  mock :  self . mock . and ( path_regex ( Self :: generate_path_regexp ( & self . endpoint ) ) ) ,  ..self  } 
11181185    } 
11191186
1187+     /// Ensures the event was sent as a delayed event. 
1188+      /// 
1189+      /// Note: works with *any* room. 
1190+      /// 
1191+      /// # Examples 
1192+      /// 
1193+      /// see also [`MatrixMockServer::mock_room_send`] for more context. 
1194+      /// 
1195+      /// ``` 
1196+      /// # tokio_test::block_on(async { 
1197+      /// use matrix_sdk::{ 
1198+      ///     ruma::{ 
1199+      ///         api::client::delayed_events::{delayed_state_event, DelayParameters}, 
1200+      ///         events::{room::create::RoomCreateEventContent, AnyStateEventContent}, 
1201+      ///         room_id, 
1202+      ///         time::Duration, 
1203+      ///     }, 
1204+      ///     test_utils::mocks::MatrixMockServer, 
1205+      /// }; 
1206+      /// use wiremock::ResponseTemplate; 
1207+      /// use serde_json::json; 
1208+      /// 
1209+      /// let mock_server = MatrixMockServer::new().await; 
1210+      /// let client = mock_server.client_builder().build().await; 
1211+      /// 
1212+      /// mock_server.mock_room_state_encryption().plain().mount().await; 
1213+      /// 
1214+      /// let room = mock_server.sync_joined_room(&client, room_id!("!room_id:localhost")).await; 
1215+      /// 
1216+      /// mock_server 
1217+      ///     .mock_room_send_state() 
1218+      ///     .with_delay(Duration::from_millis(500)) 
1219+      ///     .respond_with(ResponseTemplate::new(200).set_body_json(json!({"delay_id":"$some_id"}))) 
1220+      ///     .mock_once() 
1221+      ///     .mount() 
1222+      ///     .await; 
1223+      /// 
1224+      /// let response_not_mocked = room.send_state_event(RoomCreateEventContent::new_v11()).await; 
1225+      /// // A non delayed event should not be mocked by the server. 
1226+      /// assert!(response_not_mocked.is_err()); 
1227+      /// 
1228+      /// let r = delayed_state_event::unstable::Request::new( 
1229+      ///     room.room_id().to_owned(), 
1230+      ///     "".to_owned(), 
1231+      ///     DelayParameters::Timeout { timeout: Duration::from_millis(500) }, 
1232+      ///     &AnyStateEventContent::RoomCreate(RoomCreateEventContent::new_v11()), 
1233+      /// ) 
1234+      /// .unwrap(); 
1235+      /// let response = room.client().send(r, None).await.unwrap(); 
1236+      /// // The delayed `m.room.message` event type should be mocked by the server. 
1237+      /// assert_eq!("$some_id", response.delay_id); 
1238+      /// 
1239+      /// # anyhow::Ok(()) }); 
1240+      /// ``` 
1241+      pub  fn  with_delay ( self ,  delay :  Duration )  -> Self  { 
1242+         Self  { 
1243+             mock :  self 
1244+                 . mock 
1245+                 . and ( query_param ( "org.matrix.msc4140.delay" ,  delay. as_millis ( ) . to_string ( ) ) ) , 
1246+             ..self 
1247+         } 
1248+     } 
1249+ 
11201250    /// 
11211251     /// ``` 
11221252     /// # tokio_test::block_on(async { 
0 commit comments