@@ -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