From b077f45e780f7ba4b263b999e8b65c8d67495e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 3 Feb 2025 14:28:40 +0100 Subject: [PATCH] test(room_preview): Add tests for where `get_room_preview` gets its data from for each room state --- crates/matrix-sdk/src/client/mod.rs | 110 ++++++++++++++++++++++ crates/matrix-sdk/src/test_utils/mocks.rs | 25 +++++ 2 files changed, 135 insertions(+) diff --git a/crates/matrix-sdk/src/client/mod.rs b/crates/matrix-sdk/src/client/mod.rs index 83ed4afce..e5adb792d 100644 --- a/crates/matrix-sdk/src/client/mod.rs +++ b/crates/matrix-sdk/src/client/mod.rs @@ -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); + } } diff --git a/crates/matrix-sdk/src/test_utils/mocks.rs b/crates/matrix-sdk/src/test_utils/mocks.rs index 5ddac1685..2d0834be2 100644 --- a/crates/matrix-sdk/src/test_utils/mocks.rs +++ b/crates/matrix-sdk/src/test_utils/mocks.rs @@ -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 } + } +}