Skip to content

Commit 9a5e9e8

Browse files
committed
test(sdk): add a mocking endpoint for listing threads and test Room::list_threads()
1 parent 69a0b78 commit 9a5e9e8

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

crates/matrix-sdk/src/room/mod.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4242,4 +4242,46 @@ mod tests {
42424242
assert!(ret.sender_info.is_some());
42434243
assert_eq!(ret.sender_info.unwrap().event().user_id(), sender_id);
42444244
}
4245+
4246+
#[async_test]
4247+
async fn test_list_threads() {
4248+
let server = MatrixMockServer::new().await;
4249+
let client = server.client_builder().build().await;
4250+
4251+
let room_id = room_id!("!a:b.c");
4252+
let sender_id = user_id!("@alice:b.c");
4253+
let f = EventFactory::new().room(room_id).sender(sender_id);
4254+
4255+
let eid1 = event_id!("$1");
4256+
let eid2 = event_id!("$2");
4257+
let batch1 = vec![f.text_msg("Thread root 1").event_id(eid1).into_raw_sync().cast()];
4258+
let batch2 = vec![f.text_msg("Thread root 2").event_id(eid2).into_raw_sync().cast()];
4259+
4260+
server
4261+
.mock_room_threads()
4262+
.ok(batch1.clone(), Some("prev_batch".to_owned()))
4263+
.mock_once()
4264+
.mount()
4265+
.await;
4266+
server
4267+
.mock_room_threads()
4268+
.match_from("prev_batch")
4269+
.ok(batch2, None)
4270+
.mock_once()
4271+
.mount()
4272+
.await;
4273+
4274+
let room = server.sync_joined_room(&client, room_id).await;
4275+
let result =
4276+
room.list_threads(ListThreadsOptions::default()).await.expect("Failed to list threads");
4277+
assert_eq!(result.chunk.len(), 1);
4278+
assert_eq!(result.chunk[0].event_id().unwrap(), eid1);
4279+
assert!(result.prev_batch_token.is_some());
4280+
4281+
let opts = ListThreadsOptions { from: result.prev_batch_token, ..Default::default() };
4282+
let result = room.list_threads(opts).await.expect("Failed to list threads");
4283+
assert_eq!(result.chunk.len(), 1);
4284+
assert_eq!(result.chunk[0].event_id().unwrap(), eid2);
4285+
assert!(result.prev_batch_token.is_none());
4286+
}
42454287
}

crates/matrix-sdk/src/test_utils/mocks/mod.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,14 @@ impl MatrixMockServer {
10011001
let mock = Mock::given(method("POST")).and(path("/_matrix/client/v3/logout"));
10021002
self.mock_endpoint(mock, LogoutEndpoint).expect_default_access_token()
10031003
}
1004+
1005+
/// Create a prebuilt mock for the endpoint used to get the list of thread
1006+
/// roots.
1007+
pub fn mock_room_threads(&self) -> MockEndpoint<'_, RoomThreadsEndpoint> {
1008+
let mock =
1009+
Mock::given(method("GET")).and(path_regex(r"^/_matrix/client/v1/rooms/.*/threads$"));
1010+
self.mock_endpoint(mock, RoomThreadsEndpoint).expect_default_access_token()
1011+
}
10041012
}
10051013

10061014
/// Parameter to [`MatrixMockServer::sync_room`].
@@ -2570,3 +2578,26 @@ impl<'a> MockEndpoint<'a, LogoutEndpoint> {
25702578
self.respond_with(ResponseTemplate::new(200).set_body_json(json!({})))
25712579
}
25722580
}
2581+
2582+
/// A prebuilt mock for a `GET /rooms/{roomId}/threads` request.
2583+
pub struct RoomThreadsEndpoint;
2584+
2585+
impl<'a> MockEndpoint<'a, RoomThreadsEndpoint> {
2586+
/// Expects an optional `from` to be set on the request.
2587+
pub fn match_from(self, from: &str) -> Self {
2588+
Self { mock: self.mock.and(query_param("from", from)), ..self }
2589+
}
2590+
2591+
/// Returns a successful response with some optional events and previous
2592+
/// batch token.
2593+
pub fn ok(
2594+
self,
2595+
chunk: Vec<Raw<AnyTimelineEvent>>,
2596+
next_batch: Option<String>,
2597+
) -> MatrixMock<'a> {
2598+
self.respond_with(ResponseTemplate::new(200).set_body_json(json!({
2599+
"chunk": chunk,
2600+
"next_batch": next_batch
2601+
})))
2602+
}
2603+
}

0 commit comments

Comments
 (0)