matrix_sdk_test/sync_builder/
bulk.rs

1use std::ops::Range;
2
3use ruma::{
4    events::{room::member::MembershipState, AnySyncStateEvent},
5    serde::Raw,
6};
7use serde_json::{from_value as from_json_value, json};
8
9/// Create `m.room.member` events in the given range.
10///
11/// The user IDs are generated as `@user_{idx}:{server}`, with `idx` being the
12/// current value in `range`, so providing the same range in several method
13/// calls will create events that replace the previous state.
14///
15/// The event IDs are generated as `$roommember_{batch}_{idx}` so it's important
16/// to increment `batch` between method calls to avoid having two events with
17/// the same event ID.
18///
19/// This method can be used as input for room builders with
20/// `add_timeline_state_bulk()` or `add_state_bulk()`.
21pub fn bulk_room_members<'a>(
22    batch: usize,
23    range: Range<usize>,
24    server: &'a str,
25    membership: &'a MembershipState,
26) -> impl Iterator<Item = Raw<AnySyncStateEvent>> + 'a {
27    range.map(move |idx| {
28        let user_id = format!("@user_{idx}:{server}");
29        let event_id = format!("$roommember_{batch}_{idx}");
30        let ts = 151800000 + batch * 100 + idx;
31        from_json_value(json!({
32            "content": {
33                "membership": membership,
34            },
35            "event_id": event_id,
36            "origin_server_ts": ts,
37            "sender": user_id,
38            "state_key": user_id,
39            "type": "m.room.member",
40        }))
41        .unwrap()
42    })
43}