widget: Add integration tests for sending events

This commit is contained in:
Jonas Platte
2023-10-19 14:27:58 +02:00
committed by Jonas Platte
parent 4982f87c59
commit 561db87b64

View File

@@ -35,7 +35,7 @@ use wiremock::{
Mock, MockServer, ResponseTemplate,
};
use crate::{logged_in_client, mock_sync};
use crate::{logged_in_client, mock_encryption_state, mock_sync};
/// Create a JSON string from a [`json!`][serde_json::json] "literal".
#[macro_export]
@@ -67,6 +67,8 @@ async fn run_test_driver(init_on_content_load: bool) -> (MockServer, WidgetDrive
let _response = client.sync_once(sync_settings.clone()).await.unwrap();
mock_server.reset().await;
mock_encryption_state(&mock_server, false).await;
let room = client.get_room(&ROOM_ID).unwrap();
let (driver, handle) = WidgetDriver::new(
@@ -287,6 +289,87 @@ async fn read_room_members() {
}
}
#[async_test]
async fn send_room_message() {
let (mock_server, driver_handle) = run_test_driver(false).await;
negotiate_capabilities(&driver_handle, json!(["org.matrix.msc2762.send.event:m.room.message"]))
.await;
Mock::given(method("PUT"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/m.room.message/.*$"))
.respond_with(ResponseTemplate::new(200).set_body_json(json!({ "event_id": "$foobar" })))
.expect(1)
.mount(&mock_server)
.await;
send_request(
&driver_handle,
"send-room-message",
"send_event",
json!({
"type": "m.room.message",
"content": {
"msgtype": "m.text",
"body": "Message from a widget!",
},
}),
)
.await;
// Receive the response
let msg = recv_message(&driver_handle).await;
assert_eq!(msg["api"], "fromWidget");
assert_eq!(msg["action"], "send_event");
let event_id = msg["response"]["event_id"].as_str().unwrap();
assert_eq!(event_id, "$foobar");
// Make sure the event-sending endpoint was hit exactly once
mock_server.verify().await;
}
#[async_test]
async fn send_room_name() {
let (mock_server, driver_handle) = run_test_driver(false).await;
negotiate_capabilities(
&driver_handle,
json!(["org.matrix.msc2762.send.state_event:m.room.name#"]),
)
.await;
Mock::given(method("PUT"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/state/m.room.name/?$"))
.respond_with(ResponseTemplate::new(200).set_body_json(json!({ "event_id": "$foobar" })))
.expect(1)
.mount(&mock_server)
.await;
send_request(
&driver_handle,
"send-room-name",
"send_event",
json!({
"type": "m.room.name",
"state_key": "",
"content": {
"name": "Room Name set by Widget",
},
}),
)
.await;
// Receive the response
let msg = recv_message(&driver_handle).await;
assert_eq!(msg["api"], "fromWidget");
assert_eq!(msg["action"], "send_event");
let event_id = msg["response"]["event_id"].as_str().unwrap();
assert_eq!(event_id, "$foobar");
// Make sure the event-sending endpoint was hit exactly once
mock_server.verify().await;
}
async fn negotiate_capabilities(driver_handle: &WidgetDriverHandle, caps: JsonValue) {
{
// Receive toWidget capabilities request