Skip to content

Commit 043c9ac

Browse files
committed
add integration test for futures.
1 parent 1d3b270 commit 043c9ac

File tree

2 files changed

+133
-21
lines changed

2 files changed

+133
-21
lines changed

crates/matrix-sdk/src/widget/machine/from_widget.rs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,30 +134,30 @@ pub(super) struct ReadEventResponse {
134134
}
135135

136136
#[derive(Serialize, Debug)]
137-
pub struct SendEventResponse {
137+
pub(crate) struct SendEventResponse {
138138
/// The room id for the send event.
139-
pub room_id: Option<OwnedRoomId>,
139+
pub(crate) room_id: Option<OwnedRoomId>,
140140
/// The event id of the send event. Its optional because if its a future one
141141
/// does not get the event_id at this point.
142-
pub event_id: Option<OwnedEventId>,
142+
pub(crate) event_id: Option<OwnedEventId>,
143143
/// A token to send/insert the future into the DAG.
144-
pub send_token: Option<String>,
144+
pub(crate) send_token: Option<String>,
145145
/// A token to cancel this future. It will never be send if this is called.
146-
pub cancel_token: Option<String>,
146+
pub(crate) cancel_token: Option<String>,
147147
/// The `future_group_id` generated for this future. Used to connect
148148
/// multiple futures only one of the connected futures will be sent and
149149
/// inserted into the DAG.
150-
pub future_group_id: Option<String>,
150+
pub(crate) future_group_id: Option<String>,
151151
/// A token used to refresh the timer of the future. This allows
152152
/// to implement heartbeat like capabilities. An event is only sent once
153153
/// a refresh in the timeout interval is missed.
154154
///
155155
/// If the future does not have a timeout this will be `None`.
156-
pub refresh_token: Option<String>,
156+
pub(crate) refresh_token: Option<String>,
157157
}
158158

159159
impl SendEventResponse {
160-
pub fn from_event_id(event_id: OwnedEventId) -> Self {
160+
pub(crate) fn from_event_id(event_id: OwnedEventId) -> Self {
161161
SendEventResponse {
162162
room_id: None,
163163
event_id: Some(event_id),
@@ -167,32 +167,33 @@ impl SendEventResponse {
167167
refresh_token: None,
168168
}
169169
}
170-
pub fn set_room_id(&mut self, room_id: OwnedRoomId) {
170+
pub(crate) fn set_room_id(&mut self, room_id: OwnedRoomId) {
171171
self.room_id = Some(room_id);
172172
}
173173
}
174-
impl Into<SendEventResponse> for future::send_future_message_event::unstable::Response {
175-
fn into(self) -> SendEventResponse {
174+
175+
impl From<future::send_future_message_event::unstable::Response> for SendEventResponse {
176+
fn from(val: future::send_future_message_event::unstable::Response) -> Self {
176177
SendEventResponse {
177178
room_id: None,
178179
event_id: None,
179-
send_token: Some(self.send_token),
180-
cancel_token: Some(self.cancel_token),
181-
future_group_id: Some(self.future_group_id),
182-
refresh_token: self.refresh_token,
180+
send_token: Some(val.send_token),
181+
cancel_token: Some(val.cancel_token),
182+
future_group_id: Some(val.future_group_id),
183+
refresh_token: val.refresh_token,
183184
}
184185
}
185186
}
186187

187-
impl Into<SendEventResponse> for future::send_future_state_event::unstable::Response {
188-
fn into(self) -> SendEventResponse {
188+
impl From<future::send_future_state_event::unstable::Response> for SendEventResponse {
189+
fn from(val: future::send_future_state_event::unstable::Response) -> Self {
189190
SendEventResponse {
190191
room_id: None,
191192
event_id: None,
192-
send_token: Some(self.send_token),
193-
cancel_token: Some(self.cancel_token),
194-
future_group_id: Some(self.future_group_id),
195-
refresh_token: self.refresh_token,
193+
send_token: Some(val.send_token),
194+
cancel_token: Some(val.cancel_token),
195+
future_group_id: Some(val.future_group_id),
196+
refresh_token: val.refresh_token,
196197
}
197198
}
198199
}

crates/matrix-sdk/tests/integration/widget.rs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,117 @@ async fn send_room_name() {
600600
mock_server.verify().await;
601601
}
602602

603+
#[async_test]
604+
async fn send_future_room_message() {
605+
let (_, mock_server, driver_handle) = run_test_driver(false).await;
606+
607+
// let a= "{\"action\":\"send_event\",\"api\":\"fromWidget\",\"data\":{\"content\":{\"body\":\"Message from a widget!\",\"msgtype\":\"m.text\"},\"type\":\"m.room.message\"},\"future_timeout\":1000,\"requestId\":\"send-room-message\",\"widgetId\":\"test-widget\"}";
608+
609+
negotiate_capabilities(&driver_handle, json!(["org.matrix.msc2762.send.event:m.room.message"]))
610+
.await;
611+
612+
Mock::given(method("PUT"))
613+
.and(path_regex(
614+
r"^/_matrix/client/unstable/org.matrix.msc4140/rooms/.*/send_future/m.room.message/.*$",
615+
))
616+
.respond_with(ResponseTemplate::new(200).set_body_json(json!({
617+
"future_group_id": "1234",
618+
"send_token": "my_send_token",
619+
"refresh_token":"my_refresh_token",
620+
"cancel_token": "my_cancel_token"
621+
})))
622+
.expect(1)
623+
.mount(&mock_server)
624+
.await;
625+
626+
send_request(
627+
&driver_handle,
628+
"send-room-message",
629+
"send_event",
630+
json!({
631+
"type": "m.room.message",
632+
"content": {
633+
"msgtype": "m.text",
634+
"body": "Message from a widget!",
635+
},
636+
"future_timeout":1000,
637+
}),
638+
)
639+
.await;
640+
641+
// Receive the response
642+
let msg = recv_message(&driver_handle).await;
643+
assert_eq!(msg["api"], "fromWidget");
644+
assert_eq!(msg["action"], "send_event");
645+
let future_group_id = msg["response"]["future_group_id"].as_str().unwrap();
646+
assert_eq!(future_group_id, "1234");
647+
let cancel_token = msg["response"]["cancel_token"].as_str().unwrap();
648+
assert_eq!(cancel_token, "my_cancel_token");
649+
let refresh_token = msg["response"]["refresh_token"].as_str().unwrap();
650+
assert_eq!(refresh_token, "my_refresh_token");
651+
let send_token = msg["response"]["send_token"].as_str().unwrap();
652+
assert_eq!(send_token, "my_send_token");
653+
654+
// Make sure the event-sending endpoint was hit exactly once
655+
mock_server.verify().await;
656+
}
657+
658+
#[async_test]
659+
async fn send_future_state() {
660+
let (_, mock_server, driver_handle) = run_test_driver(false).await;
661+
662+
negotiate_capabilities(
663+
&driver_handle,
664+
json!(["org.matrix.msc2762.send.state_event:m.room.name#"]),
665+
)
666+
.await;
667+
668+
Mock::given(method("PUT"))
669+
.and(path_regex(
670+
r"^/_matrix/client/unstable/org.matrix.msc4140/rooms/.*/state_future/m.room.name/?$",
671+
))
672+
.respond_with(ResponseTemplate::new(200).set_body_json(json!({
673+
"future_group_id": "1234",
674+
"send_token": "my_send_token",
675+
"refresh_token":"my_refresh_token",
676+
"cancel_token": "my_cancel_token"
677+
})))
678+
.expect(1)
679+
.mount(&mock_server)
680+
.await;
681+
682+
send_request(
683+
&driver_handle,
684+
"send-room-message",
685+
"send_event",
686+
json!({
687+
"type": "m.room.name",
688+
"state_key": "",
689+
"content": {
690+
"name": "Room Name set by Widget",
691+
},
692+
"future_timeout":1000,
693+
}),
694+
)
695+
.await;
696+
697+
// Receive the response
698+
let msg = recv_message(&driver_handle).await;
699+
assert_eq!(msg["api"], "fromWidget");
700+
assert_eq!(msg["action"], "send_event");
701+
let future_group_id = msg["response"]["future_group_id"].as_str().unwrap();
702+
assert_eq!(future_group_id, "1234");
703+
let cancel_token = msg["response"]["cancel_token"].as_str().unwrap();
704+
assert_eq!(cancel_token, "my_cancel_token");
705+
let refresh_token = msg["response"]["refresh_token"].as_str().unwrap();
706+
assert_eq!(refresh_token, "my_refresh_token");
707+
let send_token = msg["response"]["send_token"].as_str().unwrap();
708+
assert_eq!(send_token, "my_send_token");
709+
710+
// Make sure the event-sending endpoint was hit exactly once
711+
mock_server.verify().await;
712+
}
713+
603714
async fn negotiate_capabilities(driver_handle: &WidgetDriverHandle, caps: JsonValue) {
604715
{
605716
// Receive toWidget capabilities request

0 commit comments

Comments
 (0)