@@ -31,6 +31,7 @@ use ruma::{
31
31
directory:: PublicRoomsChunk ,
32
32
events:: { AnyStateEvent , AnyTimelineEvent , MessageLikeEventType , StateEventType } ,
33
33
serde:: Raw ,
34
+ time:: Duration ,
34
35
MxcUri , OwnedEventId , OwnedRoomId , RoomId , ServerName ,
35
36
} ;
36
37
use serde:: Deserialize ;
@@ -952,6 +953,72 @@ impl<'a> MockEndpoint<'a, RoomSendEndpoint> {
952
953
}
953
954
}
954
955
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
+
955
1022
/// Returns a send endpoint that emulates success, i.e. the event has been
956
1023
/// sent with the given event id.
957
1024
///
@@ -1117,6 +1184,69 @@ impl<'a> MockEndpoint<'a, RoomSendStateEndpoint> {
1117
1184
Self { mock : self . mock . and ( path_regex ( Self :: generate_path_regexp ( & self . endpoint ) ) ) , ..self }
1118
1185
}
1119
1186
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
+
1120
1250
///
1121
1251
/// ```
1122
1252
/// # tokio_test::block_on(async {
0 commit comments