test(room_preview): Add tests for where get_room_preview gets its data from for each room state

This commit is contained in:
Jorge Martín
2025-02-03 14:28:40 +01:00
committed by Ivan Enderlin
parent 648d527f2f
commit b077f45e78
2 changed files with 135 additions and 0 deletions

View File

@@ -3186,4 +3186,114 @@ pub(crate) mod tests {
.await;
assert_matches!(ret, Ok(()));
}
#[async_test]
async fn test_room_preview_for_invited_room_hits_summary_endpoint() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let room_id = room_id!("!a-room:matrix.org");
// Make sure the summary endpoint is called once
server.mock_room_summary().ok(room_id).mock_once().mount().await;
// We create a locally cached invited room
let invited_room = client.inner.base_client.get_or_create_room(room_id, RoomState::Invited);
// And we get a preview, the server endpoint was reached
let preview = client
.get_room_preview(room_id.into(), Vec::new())
.await
.expect("Room preview should be retrieved");
assert_eq!(invited_room.room_id().to_owned(), preview.room_id);
}
#[async_test]
async fn test_room_preview_for_left_room_hits_summary_endpoint() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let room_id = room_id!("!a-room:matrix.org");
// Make sure the summary endpoint is called once
server.mock_room_summary().ok(room_id).mock_once().mount().await;
// We create a locally cached left room
let left_room = client.inner.base_client.get_or_create_room(room_id, RoomState::Left);
// And we get a preview, the server endpoint was reached
let preview = client
.get_room_preview(room_id.into(), Vec::new())
.await
.expect("Room preview should be retrieved");
assert_eq!(left_room.room_id().to_owned(), preview.room_id);
}
#[async_test]
async fn test_room_preview_for_knocked_room_hits_summary_endpoint() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let room_id = room_id!("!a-room:matrix.org");
// Make sure the summary endpoint is called once
server.mock_room_summary().ok(room_id).mock_once().mount().await;
// We create a locally cached knocked room
let knocked_room = client.inner.base_client.get_or_create_room(room_id, RoomState::Knocked);
// And we get a preview, the server endpoint was reached
let preview = client
.get_room_preview(room_id.into(), Vec::new())
.await
.expect("Room preview should be retrieved");
assert_eq!(knocked_room.room_id().to_owned(), preview.room_id);
}
#[async_test]
async fn test_room_preview_for_joined_room_retrieves_local_room_info() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let room_id = room_id!("!a-room:matrix.org");
// Make sure the summary endpoint is not called
server.mock_room_summary().ok(room_id).never().mount().await;
// We create a locally cached joined room
let joined_room = client.inner.base_client.get_or_create_room(room_id, RoomState::Joined);
// And we get a preview, no server endpoint was reached
let preview = client
.get_room_preview(room_id.into(), Vec::new())
.await
.expect("Room preview should be retrieved");
assert_eq!(joined_room.room_id().to_owned(), preview.room_id);
}
#[async_test]
async fn test_room_preview_for_banned_room_retrieves_local_room_info() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let room_id = room_id!("!a-room:matrix.org");
// Make sure the summary endpoint is not called
server.mock_room_summary().ok(room_id).never().mount().await;
// We create a locally cached banned room
let banned_room = client.inner.base_client.get_or_create_room(room_id, RoomState::Banned);
// And we get a preview, no server endpoint was reached
let preview = client
.get_room_preview(room_id.into(), Vec::new())
.await
.expect("Room preview should be retrieved");
assert_eq!(banned_room.room_id().to_owned(), preview.room_id);
}
}

View File

@@ -924,6 +924,13 @@ impl MatrixMockServer {
let mock = Mock::given(method("GET")).and(path_regex(r"^/_matrix/client/versions"));
MockEndpoint { mock, server: &self.server, endpoint: VersionsEndpoint }
}
/// Creates a prebuilt mock for the room summary endpoint [MSC3266](https://github.com/matrix-org/matrix-spec-proposals/pull/3266).
pub fn mock_room_summary(&self) -> MockEndpoint<'_, RoomSummaryEndpoint> {
let mock = Mock::given(method("GET"))
.and(path_regex(r"^/_matrix/client/unstable/im.nheko.summary/rooms/.*/summary"));
MockEndpoint { mock, server: &self.server, endpoint: RoomSummaryEndpoint }
}
}
/// Parameter to [`MatrixMockServer::sync_room`].
@@ -2286,3 +2293,21 @@ impl<'a> MockEndpoint<'a, VersionsEndpoint> {
MatrixMock { server: self.server, mock }
}
}
/// A prebuilt mock for the room summary endpoint.
pub struct RoomSummaryEndpoint;
impl<'a> MockEndpoint<'a, RoomSummaryEndpoint> {
/// Returns a successful response with some default data for the given room
/// id.
pub fn ok(self, room_id: &RoomId) -> MatrixMock<'a> {
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(json!({
"room_id": room_id,
"guest_can_join": true,
"num_joined_members": 1,
"world_readable": true,
"join_rule": "public",
})));
MatrixMock { server: self.server, mock }
}
}