atagen

macltok

public
Star0
Watch0
3dab4a4e73f48986ea8e34215bdeb7d5d3870773
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: tests/members.rs

31ce2453c82fatagen2026-09-24 13:07 UTC1
use macltok::{Engine, EngineConfig, ErrorKind, MemberFilter, MemberMembership};
96fdf90aacd6atagen2026-09-08 08:24 UTC2
use matrix_sdk::{
96fdf90aacd6atagen2026-09-08 08:24 UTC3
    ruma::{
96fdf90aacd6atagen2026-09-08 08:24 UTC4
        api::client::sync::sync_events::v5, events::room::member::MembershipState, room_id, user_id,
96fdf90aacd6atagen2026-09-08 08:24 UTC5
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC6
    test_utils::mocks::MatrixMockServer,
96fdf90aacd6atagen2026-09-08 08:24 UTC7
};
96fdf90aacd6atagen2026-09-08 08:24 UTC8
use matrix_sdk_test::{ALICE, JoinedRoomBuilder, event_factory::EventFactory};
96fdf90aacd6atagen2026-09-08 08:24 UTC9
96fdf90aacd6atagen2026-09-08 08:24 UTC10
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC11
async fn members_filters_and_normalises_synced_room_members() {
96fdf90aacd6atagen2026-09-08 08:24 UTC12
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC13
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC14
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC15
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC16
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC17
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC18
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC19
    let room_id = room_id!("!members:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC20
    server.mock_room_state_encryption().plain().mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC21
96fdf90aacd6atagen2026-09-08 08:24 UTC22
    let factory = EventFactory::new().room(room_id);
96fdf90aacd6atagen2026-09-08 08:24 UTC23
    let own = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC24
        .member(user_id!("@example:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC25
        .display_name("Example")
96fdf90aacd6atagen2026-09-08 08:24 UTC26
        .into_raw_sync_state();
96fdf90aacd6atagen2026-09-08 08:24 UTC27
    let joined = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC28
        .member(user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC29
        .display_name("Bobby")
96fdf90aacd6atagen2026-09-08 08:24 UTC30
        .into_raw_sync_state();
96fdf90aacd6atagen2026-09-08 08:24 UTC31
    let invited = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC32
        .member(user_id!("@carol:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC33
        .membership(MembershipState::Invite)
96fdf90aacd6atagen2026-09-08 08:24 UTC34
        .sender(&ALICE)
96fdf90aacd6atagen2026-09-08 08:24 UTC35
        .state_key(user_id!("@carol:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC36
        .display_name("Carol")
96fdf90aacd6atagen2026-09-08 08:24 UTC37
        .into_raw_sync_state();
96fdf90aacd6atagen2026-09-08 08:24 UTC38
96fdf90aacd6atagen2026-09-08 08:24 UTC39
    let own_member = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC40
        .member(user_id!("@example:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC41
        .display_name("Example")
96fdf90aacd6atagen2026-09-08 08:24 UTC42
        .into_raw();
96fdf90aacd6atagen2026-09-08 08:24 UTC43
    let joined_member = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC44
        .member(user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC45
        .display_name("Bobby")
96fdf90aacd6atagen2026-09-08 08:24 UTC46
        .into_raw();
96fdf90aacd6atagen2026-09-08 08:24 UTC47
    let invited_member = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC48
        .member(user_id!("@carol:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC49
        .membership(MembershipState::Invite)
96fdf90aacd6atagen2026-09-08 08:24 UTC50
        .sender(&ALICE)
96fdf90aacd6atagen2026-09-08 08:24 UTC51
        .state_key(user_id!("@carol:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC52
        .display_name("Carol")
96fdf90aacd6atagen2026-09-08 08:24 UTC53
        .into_raw();
96fdf90aacd6atagen2026-09-08 08:24 UTC54
96fdf90aacd6atagen2026-09-08 08:24 UTC55
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC56
        .sync_room(
96fdf90aacd6atagen2026-09-08 08:24 UTC57
            &client,
96fdf90aacd6atagen2026-09-08 08:24 UTC58
            JoinedRoomBuilder::new(room_id)
96fdf90aacd6atagen2026-09-08 08:24 UTC59
                .add_state_event(own.clone())
96fdf90aacd6atagen2026-09-08 08:24 UTC60
                .add_state_event(joined.clone())
96fdf90aacd6atagen2026-09-08 08:24 UTC61
                .add_state_event(invited.clone()),
96fdf90aacd6atagen2026-09-08 08:24 UTC62
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC63
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC64
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC65
        .mock_get_members()
96fdf90aacd6atagen2026-09-08 08:24 UTC66
        .ok(vec![own_member, joined_member, invited_member])
96fdf90aacd6atagen2026-09-08 08:24 UTC67
        .mock_once()
96fdf90aacd6atagen2026-09-08 08:24 UTC68
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC69
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC70
    let (engine, handle, _events) = Engine::from_client(client, EngineConfig::default())
96fdf90aacd6atagen2026-09-08 08:24 UTC71
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC72
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC73
    let joined_members = handle.members(room_id, MemberFilter::Joined).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC74
    assert_eq!(joined_members.len(), 2);
96fdf90aacd6atagen2026-09-08 08:24 UTC75
    let own_member = joined_members
96fdf90aacd6atagen2026-09-08 08:24 UTC76
        .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC77
        .find(|member| member.own)
96fdf90aacd6atagen2026-09-08 08:24 UTC78
        .expect("own member missing");
96fdf90aacd6atagen2026-09-08 08:24 UTC79
    assert_eq!(own_member.user_id, user_id!("@example:localhost"));
96fdf90aacd6atagen2026-09-08 08:24 UTC80
    assert_eq!(own_member.name, "Example");
96fdf90aacd6atagen2026-09-08 08:24 UTC81
    assert_eq!(own_member.display_name.as_deref(), Some("Example"));
96fdf90aacd6atagen2026-09-08 08:24 UTC82
    assert_eq!(own_member.membership, MemberMembership::Joined);
96fdf90aacd6atagen2026-09-08 08:24 UTC83
    assert!(own_member.own);
96fdf90aacd6atagen2026-09-08 08:24 UTC84
96fdf90aacd6atagen2026-09-08 08:24 UTC85
    let bob = joined_members
96fdf90aacd6atagen2026-09-08 08:24 UTC86
        .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC87
        .find(|member| member.user_id == user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC88
        .expect("joined member missing");
96fdf90aacd6atagen2026-09-08 08:24 UTC89
    assert_eq!(bob.name, "Bobby");
96fdf90aacd6atagen2026-09-08 08:24 UTC90
    assert_eq!(bob.display_name.as_deref(), Some("Bobby"));
96fdf90aacd6atagen2026-09-08 08:24 UTC91
    assert_eq!(bob.membership, MemberMembership::Joined);
96fdf90aacd6atagen2026-09-08 08:24 UTC92
    assert!(!bob.own);
96fdf90aacd6atagen2026-09-08 08:24 UTC93
96fdf90aacd6atagen2026-09-08 08:24 UTC94
    let invited_members = handle
96fdf90aacd6atagen2026-09-08 08:24 UTC95
        .members(room_id, MemberFilter::Invited)
96fdf90aacd6atagen2026-09-08 08:24 UTC96
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC97
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC98
    assert_eq!(invited_members.len(), 1);
96fdf90aacd6atagen2026-09-08 08:24 UTC99
    let carol = &invited_members[0];
96fdf90aacd6atagen2026-09-08 08:24 UTC100
    assert_eq!(carol.user_id, user_id!("@carol:localhost"));
96fdf90aacd6atagen2026-09-08 08:24 UTC101
    assert_eq!(carol.name, "Carol");
96fdf90aacd6atagen2026-09-08 08:24 UTC102
    assert_eq!(carol.display_name.as_deref(), Some("Carol"));
96fdf90aacd6atagen2026-09-08 08:24 UTC103
    assert_eq!(carol.membership, MemberMembership::Invited);
96fdf90aacd6atagen2026-09-08 08:24 UTC104
    assert!(!carol.own);
96fdf90aacd6atagen2026-09-08 08:24 UTC105
96fdf90aacd6atagen2026-09-08 08:24 UTC106
    drop(engine);
96fdf90aacd6atagen2026-09-08 08:24 UTC107
}
96fdf90aacd6atagen2026-09-08 08:24 UTC108
96fdf90aacd6atagen2026-09-08 08:24 UTC109
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC110
async fn members_all_includes_custom_membership_states() {
96fdf90aacd6atagen2026-09-08 08:24 UTC111
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC112
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC113
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC114
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC115
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC116
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC117
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC118
    let room_id = room_id!("!members-custom:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC119
    server.mock_room_state_encryption().plain().mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC120
96fdf90aacd6atagen2026-09-08 08:24 UTC121
    let factory = EventFactory::new().room(room_id);
96fdf90aacd6atagen2026-09-08 08:24 UTC122
    let joined = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC123
        .member(user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC124
        .display_name("Bobby")
96fdf90aacd6atagen2026-09-08 08:24 UTC125
        .into_raw_sync_state();
96fdf90aacd6atagen2026-09-08 08:24 UTC126
    let custom = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC127
        .member(user_id!("@dave:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC128
        .membership(MembershipState::from("flying"))
96fdf90aacd6atagen2026-09-08 08:24 UTC129
        .sender(user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC130
        .state_key(user_id!("@dave:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC131
        .display_name("Dave")
96fdf90aacd6atagen2026-09-08 08:24 UTC132
        .into_raw_sync_state();
96fdf90aacd6atagen2026-09-08 08:24 UTC133
96fdf90aacd6atagen2026-09-08 08:24 UTC134
    let joined_member = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC135
        .member(user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC136
        .display_name("Bobby")
96fdf90aacd6atagen2026-09-08 08:24 UTC137
        .into_raw();
96fdf90aacd6atagen2026-09-08 08:24 UTC138
    let custom_member = factory
96fdf90aacd6atagen2026-09-08 08:24 UTC139
        .member(user_id!("@dave:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC140
        .membership(MembershipState::from("flying"))
96fdf90aacd6atagen2026-09-08 08:24 UTC141
        .sender(user_id!("@bob:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC142
        .state_key(user_id!("@dave:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC143
        .display_name("Dave")
96fdf90aacd6atagen2026-09-08 08:24 UTC144
        .into_raw();
96fdf90aacd6atagen2026-09-08 08:24 UTC145
96fdf90aacd6atagen2026-09-08 08:24 UTC146
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC147
        .sync_room(
96fdf90aacd6atagen2026-09-08 08:24 UTC148
            &client,
96fdf90aacd6atagen2026-09-08 08:24 UTC149
            JoinedRoomBuilder::new(room_id)
96fdf90aacd6atagen2026-09-08 08:24 UTC150
                .add_state_event(joined)
96fdf90aacd6atagen2026-09-08 08:24 UTC151
                .add_state_event(custom),
96fdf90aacd6atagen2026-09-08 08:24 UTC152
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC153
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC154
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC155
        .mock_get_members()
96fdf90aacd6atagen2026-09-08 08:24 UTC156
        .ok(vec![joined_member, custom_member])
96fdf90aacd6atagen2026-09-08 08:24 UTC157
        .mock_once()
96fdf90aacd6atagen2026-09-08 08:24 UTC158
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC159
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC160
    let (engine, handle, _events) = Engine::from_client(client, EngineConfig::default())
96fdf90aacd6atagen2026-09-08 08:24 UTC161
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC162
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC163
96fdf90aacd6atagen2026-09-08 08:24 UTC164
    // `All` maps to the SDK's unfiltered empty mask, so custom states are included.
96fdf90aacd6atagen2026-09-08 08:24 UTC165
    let all_members = handle.members(room_id, MemberFilter::All).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC166
    assert_eq!(all_members.len(), 2);
96fdf90aacd6atagen2026-09-08 08:24 UTC167
    let dave = all_members
96fdf90aacd6atagen2026-09-08 08:24 UTC168
        .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC169
        .find(|member| member.user_id == user_id!("@dave:localhost"))
96fdf90aacd6atagen2026-09-08 08:24 UTC170
        .expect("custom member missing");
96fdf90aacd6atagen2026-09-08 08:24 UTC171
    assert!(
96fdf90aacd6atagen2026-09-08 08:24 UTC172
        matches!(&dave.membership, MemberMembership::Custom(state) if state == "flying"),
96fdf90aacd6atagen2026-09-08 08:24 UTC173
        "unexpected membership: {:?}",
96fdf90aacd6atagen2026-09-08 08:24 UTC174
        dave.membership
96fdf90aacd6atagen2026-09-08 08:24 UTC175
    );
96fdf90aacd6atagen2026-09-08 08:24 UTC176
96fdf90aacd6atagen2026-09-08 08:24 UTC177
    // Narrow filters still exclude the custom state.
96fdf90aacd6atagen2026-09-08 08:24 UTC178
    let joined_members = handle.members(room_id, MemberFilter::Joined).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC179
    assert_eq!(joined_members.len(), 1);
96fdf90aacd6atagen2026-09-08 08:24 UTC180
    assert_eq!(joined_members[0].user_id, user_id!("@bob:localhost"));
96fdf90aacd6atagen2026-09-08 08:24 UTC181
96fdf90aacd6atagen2026-09-08 08:24 UTC182
    drop(engine);
96fdf90aacd6atagen2026-09-08 08:24 UTC183
}
96fdf90aacd6atagen2026-09-08 08:24 UTC184
96fdf90aacd6atagen2026-09-08 08:24 UTC185
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC186
async fn members_rejects_unknown_room() {
96fdf90aacd6atagen2026-09-08 08:24 UTC187
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC188
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC189
    let (engine, handle, _events) = Engine::from_client(client, EngineConfig::default())
96fdf90aacd6atagen2026-09-08 08:24 UTC190
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC191
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC192
    let room_id = room_id!("!missing:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC193
31ce2453c82fatagen2026-09-24 13:07 UTC194
    assert_eq!(
31ce2453c82fatagen2026-09-24 13:07 UTC195
        handle
31ce2453c82fatagen2026-09-24 13:07 UTC196
            .members(room_id, MemberFilter::All)
31ce2453c82fatagen2026-09-24 13:07 UTC197
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC198
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC199
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC200
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC201
    );
96fdf90aacd6atagen2026-09-08 08:24 UTC202
96fdf90aacd6atagen2026-09-08 08:24 UTC203
    drop(engine);
96fdf90aacd6atagen2026-09-08 08:24 UTC204
}