Skip to content

Commit 07abab6

Browse files
bnjbvrpoljar
authored andcommitted
test(sdk): add a mocking endpoint for listing threads and test Room::list_threads()
1 parent ee0e22f commit 07abab6

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

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)