Skip to content

Commit fbb6589

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

File tree

2 files changed

+131
-21
lines changed

2 files changed

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

0 commit comments

Comments
 (0)