atagen

macltok

public
Star0
Watch0
f12377bce9b9427ca9b557bbf34679a4bd6fae14
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
tests/members.rsRust204 lines6.7 KB
1
use macltok::{Engine, EngineConfig, ErrorKind, MemberFilter, MemberMembership};
2
use matrix_sdk::{
3
    ruma::{
4
        api::client::sync::sync_events::v5, events::room::member::MembershipState, room_id, user_id,
5
    },
6
    test_utils::mocks::MatrixMockServer,
7
};
8
use matrix_sdk_test::{ALICE, JoinedRoomBuilder, event_factory::EventFactory};
9
10
#[tokio::test]
11
async fn members_filters_and_normalises_synced_room_members() {
12
    let server = MatrixMockServer::new().await;
13
    server
14
        .mock_sliding_sync()
15
        .ok(v5::Response::new("1".to_owned()))
16
        .mount()
17
        .await;
18
    let client = server.client_builder().build().await;
19
    let room_id = room_id!("!members:localhost");
20
    server.mock_room_state_encryption().plain().mount().await;
21
22
    let factory = EventFactory::new().room(room_id);
23
    let own = factory
24
        .member(user_id!("@example:localhost"))
25
        .display_name("Example")
26
        .into_raw_sync_state();
27
    let joined = factory
28
        .member(user_id!("@bob:localhost"))
29
        .display_name("Bobby")
30
        .into_raw_sync_state();
31
    let invited = factory
32
        .member(user_id!("@carol:localhost"))
33
        .membership(MembershipState::Invite)
34
        .sender(&ALICE)
35
        .state_key(user_id!("@carol:localhost"))
36
        .display_name("Carol")
37
        .into_raw_sync_state();
38
39
    let own_member = factory
40
        .member(user_id!("@example:localhost"))
41
        .display_name("Example")
42
        .into_raw();
43
    let joined_member = factory
44
        .member(user_id!("@bob:localhost"))
45
        .display_name("Bobby")
46
        .into_raw();
47
    let invited_member = factory
48
        .member(user_id!("@carol:localhost"))
49
        .membership(MembershipState::Invite)
50
        .sender(&ALICE)
51
        .state_key(user_id!("@carol:localhost"))
52
        .display_name("Carol")
53
        .into_raw();
54
55
    server
56
        .sync_room(
57
            &client,
58
            JoinedRoomBuilder::new(room_id)
59
                .add_state_event(own.clone())
60
                .add_state_event(joined.clone())
61
                .add_state_event(invited.clone()),
62
        )
63
        .await;
64
    server
65
        .mock_get_members()
66
        .ok(vec![own_member, joined_member, invited_member])
67
        .mock_once()
68
        .mount()
69
        .await;
70
    let (engine, handle, _events) = Engine::from_client(client, EngineConfig::default())
71
        .await
72
        .unwrap();
73
    let joined_members = handle.members(room_id, MemberFilter::Joined).await.unwrap();
74
    assert_eq!(joined_members.len(), 2);
75
    let own_member = joined_members
76
        .iter()
77
        .find(|member| member.own)
78
        .expect("own member missing");
79
    assert_eq!(own_member.user_id, user_id!("@example:localhost"));
80
    assert_eq!(own_member.name, "Example");
81
    assert_eq!(own_member.display_name.as_deref(), Some("Example"));
82
    assert_eq!(own_member.membership, MemberMembership::Joined);
83
    assert!(own_member.own);
84
85
    let bob = joined_members
86
        .iter()
87
        .find(|member| member.user_id == user_id!("@bob:localhost"))
88
        .expect("joined member missing");
89
    assert_eq!(bob.name, "Bobby");
90
    assert_eq!(bob.display_name.as_deref(), Some("Bobby"));
91
    assert_eq!(bob.membership, MemberMembership::Joined);
92
    assert!(!bob.own);
93
94
    let invited_members = handle
95
        .members(room_id, MemberFilter::Invited)
96
        .await
97
        .unwrap();
98
    assert_eq!(invited_members.len(), 1);
99
    let carol = &invited_members[0];
100
    assert_eq!(carol.user_id, user_id!("@carol:localhost"));
101
    assert_eq!(carol.name, "Carol");
102
    assert_eq!(carol.display_name.as_deref(), Some("Carol"));
103
    assert_eq!(carol.membership, MemberMembership::Invited);
104
    assert!(!carol.own);
105
106
    drop(engine);
107
}
108
109
#[tokio::test]
110
async fn members_all_includes_custom_membership_states() {
111
    let server = MatrixMockServer::new().await;
112
    server
113
        .mock_sliding_sync()
114
        .ok(v5::Response::new("1".to_owned()))
115
        .mount()
116
        .await;
117
    let client = server.client_builder().build().await;
118
    let room_id = room_id!("!members-custom:localhost");
119
    server.mock_room_state_encryption().plain().mount().await;
120
121
    let factory = EventFactory::new().room(room_id);
122
    let joined = factory
123
        .member(user_id!("@bob:localhost"))
124
        .display_name("Bobby")
125
        .into_raw_sync_state();
126
    let custom = factory
127
        .member(user_id!("@dave:localhost"))
128
        .membership(MembershipState::from("flying"))
129
        .sender(user_id!("@bob:localhost"))
130
        .state_key(user_id!("@dave:localhost"))
131
        .display_name("Dave")
132
        .into_raw_sync_state();
133
134
    let joined_member = factory
135
        .member(user_id!("@bob:localhost"))
136
        .display_name("Bobby")
137
        .into_raw();
138
    let custom_member = factory
139
        .member(user_id!("@dave:localhost"))
140
        .membership(MembershipState::from("flying"))
141
        .sender(user_id!("@bob:localhost"))
142
        .state_key(user_id!("@dave:localhost"))
143
        .display_name("Dave")
144
        .into_raw();
145
146
    server
147
        .sync_room(
148
            &client,
149
            JoinedRoomBuilder::new(room_id)
150
                .add_state_event(joined)
151
                .add_state_event(custom),
152
        )
153
        .await;
154
    server
155
        .mock_get_members()
156
        .ok(vec![joined_member, custom_member])
157
        .mock_once()
158
        .mount()
159
        .await;
160
    let (engine, handle, _events) = Engine::from_client(client, EngineConfig::default())
161
        .await
162
        .unwrap();
163
164
    // `All` maps to the SDK's unfiltered empty mask, so custom states are included.
165
    let all_members = handle.members(room_id, MemberFilter::All).await.unwrap();
166
    assert_eq!(all_members.len(), 2);
167
    let dave = all_members
168
        .iter()
169
        .find(|member| member.user_id == user_id!("@dave:localhost"))
170
        .expect("custom member missing");
171
    assert!(
172
        matches!(&dave.membership, MemberMembership::Custom(state) if state == "flying"),
173
        "unexpected membership: {:?}",
174
        dave.membership
175
    );
176
177
    // Narrow filters still exclude the custom state.
178
    let joined_members = handle.members(room_id, MemberFilter::Joined).await.unwrap();
179
    assert_eq!(joined_members.len(), 1);
180
    assert_eq!(joined_members[0].user_id, user_id!("@bob:localhost"));
181
182
    drop(engine);
183
}
184
185
#[tokio::test]
186
async fn members_rejects_unknown_room() {
187
    let server = MatrixMockServer::new().await;
188
    let client = server.client_builder().build().await;
189
    let (engine, handle, _events) = Engine::from_client(client, EngineConfig::default())
190
        .await
191
        .unwrap();
192
    let room_id = room_id!("!missing:localhost");
193
194
    assert_eq!(
195
        handle
196
            .members(room_id, MemberFilter::All)
197
            .await
198
            .unwrap_err()
199
            .kind,
200
        ErrorKind::RoomUnknown
201
    );
202
203
    drop(engine);
204
}