Skip to content

Commit

Permalink
refactor(widget, mocks): Use MockMatrixServer in the widget integra…
Browse files Browse the repository at this point in the history
…tion tests where appropriate.
  • Loading branch information
toger5 committed Nov 8, 2024
1 parent b8a61cf commit a628d83
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 38 deletions.
65 changes: 62 additions & 3 deletions crates/matrix-sdk/src/test_utils/mocks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@ use matrix_sdk_test::{
test_json, InvitedRoomBuilder, JoinedRoomBuilder, KnockedRoomBuilder, LeftRoomBuilder,
SyncResponseBuilder,
};
use ruma::{MxcUri, OwnedEventId, OwnedRoomId, RoomId};
use serde_json::json;
use ruma::{
events::{MessageLikeEventType, StateEventType},
MxcUri, OwnedEventId, OwnedRoomId, RoomId,
};
use serde_json::{json, Value};
use wiremock::{
matchers::{body_partial_json, header, method, path, path_regex},
Mock, MockBuilder, MockGuard, MockServer, Respond, ResponseTemplate, Times,
Expand Down Expand Up @@ -152,14 +155,46 @@ impl MatrixMockServer {

/// Creates a prebuilt mock for sending an event in a room.
///
/// Note: works with *any* room.
/// Note: works with *any* room.
/// Note: works with *any* event type.
pub fn mock_room_send(&self) -> MockRoomSend<'_> {
let mock = Mock::given(method("PUT"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*"))
.and(header("authorization", "Bearer 1234"));
MockRoomSend { mock, server: &self.server }
}

/// Creates a prebuilt mock for sending an event with a specific type in a room.
///
/// Note: works with *any* room.
pub fn mock_room_send_for_type(&self, event_type: MessageLikeEventType) -> MockRoomSend<'_> {
let mock = Mock::given(method("PUT"))
.and(path_regex(format!(r"^/_matrix/client/r0/rooms/.*/send/{}", event_type)))
.and(header("authorization", "Bearer 1234"));
MockRoomSend { mock, server: &self.server }
}

/// Creates a prebuilt mock for sending a state event in a room.
///
/// Note: works with *any* room.
/// Note: works with *any* event type.
pub fn mock_room_state(&self) -> MockRoomSend<'_> {
let mock = Mock::given(method("PUT"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/state/.*"))
.and(header("authorization", "Bearer 1234"));
MockRoomSend { mock, server: &self.server }
}

/// Creates a prebuilt mock for sending a state event with a specific type in a room.
///
/// Note: works with *any* room.
pub fn mock_room_state_for_type(&self, state_type: StateEventType) -> MockRoomSend<'_> {
let mock = Mock::given(method("PUT"))
.and(path_regex(format!(r"^/_matrix/client/r0/rooms/.*/state/{}", state_type)))
.and(header("authorization", "Bearer 1234"));
MockRoomSend { mock, server: &self.server }
}

/// Creates a prebuilt mock for asking whether *a* room is encrypted or not.
///
/// Note: Applies to all rooms.
Expand Down Expand Up @@ -194,6 +229,14 @@ impl MatrixMockServer {
MockRoomEvent { mock, server: &self.server, room: None, match_event_id: false }
}

/// Create a prebuilt mock for uploading media.
pub fn mock_room_messages(&self) -> MockRoomMessages<'_> {
let mock = Mock::given(method("GET"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/messages$"))
.and(header("authorization", "Bearer 1234"));
MockRoomMessages { mock, server: &self.server }
}

/// Create a prebuilt mock for uploading media.
pub fn mock_upload(&self) -> MockUpload<'_> {
let mock = Mock::given(method("POST"))
Expand Down Expand Up @@ -490,6 +533,22 @@ impl<'a> MockRoomEvent<'a> {
}
}

/// A prebuilt mock for getting a room messages in a room.
pub struct MockRoomMessages<'a> {
server: &'a MockServer,
mock: MockBuilder,
}

impl<'a> MockRoomMessages<'a> {
/// Returns a messages endpoint that emulates success, i.e. the messages
/// provided as `response` could be retrieved.
pub fn ok(self, response: impl Into<Value>) -> MatrixMock<'a> {
let body: Value = response.into();
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(body));
MatrixMock { server: self.server, mock }
}
}

/// A prebuilt mock for uploading media.
pub struct MockUpload<'a> {
server: &'a MockServer,
Expand Down
58 changes: 23 additions & 35 deletions crates/matrix-sdk/tests/integration/widget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@ use matrix_sdk_test::{
use once_cell::sync::Lazy;
use ruma::{
event_id,
events::room::{
member::{MembershipState, RoomMemberEventContent},
message::RoomMessageEventContent,
name::RoomNameEventContent,
topic::RoomTopicEventContent,
events::{
room::{
member::{MembershipState, RoomMemberEventContent},
message::RoomMessageEventContent,
name::RoomNameEventContent,
topic::RoomTopicEventContent,
},
StateEventType,
},
owned_room_id,
serde::JsonObject,
Expand All @@ -46,7 +49,7 @@ use serde::Serialize;
use serde_json::{json, Value as JsonValue};
use tracing::error;
use wiremock::{
matchers::{header, method, path_regex, query_param},
matchers::{method, path_regex, query_param},
Mock, ResponseTemplate,
};

Expand Down Expand Up @@ -245,14 +248,8 @@ async fn test_read_messages() {
"end": "t47409-4357353_219380_26003_2269",
"start": "t392-516_47314_0_7_1_1_1_11444_1"
});
Mock::given(method("GET"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/messages$"))
.and(header("authorization", "Bearer 1234"))
.and(query_param("limit", "2"))
.respond_with(ResponseTemplate::new(200).set_body_json(response_json))
.expect(1)
.mount(mock_server.server())
.await;

mock_server.mock_room_messages().ok(response_json).mock_once().mount().await;

// Ask the driver to read messages
send_request(
Expand Down Expand Up @@ -340,14 +337,8 @@ async fn test_read_messages_with_msgtype_capabilities() {
"end": "t47409-4357353_219380_26003_2269",
"start": "t392-516_47314_0_7_1_1_1_11444_1"
});
Mock::given(method("GET"))
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/messages$"))
.and(header("authorization", "Bearer 1234"))
.and(query_param("limit", "3"))
.respond_with(ResponseTemplate::new(200).set_body_json(response_json))
.expect(1)
.mount(mock_server.server())
.await;

mock_server.mock_room_messages().ok(response_json).mock_once().mount().await;

// Ask the driver to read messages
send_request(
Expand Down Expand Up @@ -517,12 +508,7 @@ async fn test_send_room_message() {
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.server())
.await;
mock_server.mock_room_send().ok(event_id!("$foobar")).mock_once().mount().await;

send_request(
&driver_handle,
Expand Down Expand Up @@ -558,11 +544,11 @@ async fn test_send_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.server())
mock_server
.mock_room_state_for_type(StateEventType::RoomName)
.ok(event_id!("$foobar"))
.mock_once()
.mount()
.await;

send_request(
Expand Down Expand Up @@ -603,7 +589,8 @@ async fn test_send_delayed_message_event() {
.await;

Mock::given(method("PUT"))
.and(path_regex(r"^/_matrix/client/v3/rooms/.*/send/m.room.message/.*$"))
.and(path_regex(r"^/_matrix/client/v3/rooms/.*/send/m.room.message/.*"))
.and(query_param("org.matrix.msc4140.delay", "1000"))
.respond_with(ResponseTemplate::new(200).set_body_json(json!({
"delay_id": "1234",
})))
Expand Down Expand Up @@ -650,7 +637,8 @@ async fn test_send_delayed_state_event() {
.await;

Mock::given(method("PUT"))
.and(path_regex(r"^/_matrix/client/v3/rooms/.*/state/m.room.name/?$"))
.and(path_regex(r"^/_matrix/client/v3/rooms/.*/state/m.room.name/.*"))
.and(query_param("org.matrix.msc4140.delay", "1000"))
.respond_with(ResponseTemplate::new(200).set_body_json(json!({
"delay_id": "1234",
})))
Expand Down

0 comments on commit a628d83

Please sign in to comment.