atagen

macltok

public
Star0
Watch0
1f875b103b27dcb7dd14d98b1744fee5fcd7e399
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
tests/prepare.rsRust81 lines2.7 KB
1
use std::time::Duration;
2
3
use macltok::{Engine, EngineConfig};
4
use matrix_sdk::{
5
    ruma::{api::client::sync::sync_events::v5, room_id, user_id},
6
    test_utils::mocks::MatrixMockServer,
7
};
8
use matrix_sdk_test::{JoinedRoomBuilder, event_factory::EventFactory};
9
use wiremock::ResponseTemplate;
10
11
async fn prepare_twice(encrypted: bool, member_syncs: u64) {
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!("!prepare:localhost");
20
    let factory = EventFactory::new().room(room_id);
21
    let mut room = JoinedRoomBuilder::new(room_id).add_state_event(
22
        factory
23
            .member(user_id!("@example:localhost"))
24
            .into_raw_sync_state(),
25
    );
26
    if encrypted {
27
        room = room.add_state_event(
28
            factory
29
                .room_encryption()
30
                .sender(user_id!("@example:localhost"))
31
                .into_raw_sync_state(),
32
        );
33
    }
34
    server.sync_room(&client, room).await;
35
    let member: matrix_sdk::ruma::serde::Raw<
36
        matrix_sdk::ruma::events::room::member::RoomMemberEvent,
37
    > = factory.member(user_id!("@example:localhost")).into_raw();
38
    server
39
        .mock_get_members()
40
        .respond_with(
41
            ResponseTemplate::new(200)
42
                .set_body_json(serde_json::json!({ "chunk": [member] }))
43
                .set_delay(Duration::from_millis(300)),
44
        )
45
        .expect(member_syncs)
46
        .mount()
47
        .await;
48
    let encryption = server.mock_room_state_encryption();
49
    if encrypted {
50
        encryption.encrypted().mount().await;
51
    } else {
52
        encryption.plain().mount().await;
53
    }
54
    server.mock_query_keys().ok().mount().await;
55
    let config = EngineConfig::default()
56
        .with_initial_history_limit(0)
57
        .with_prepare_to_send(false);
58
    let (engine, handle, mut events) = Engine::from_client(client, config).await.unwrap();
59
    let running = tokio::spawn(engine.run());
60
    let draining = tokio::spawn(async move { while events.recv().await.is_some() {} });
61
    let (first, second) = tokio::join!(
62
        handle.prepare_to_send(room_id.to_owned()),
63
        handle.prepare_to_send(room_id.to_owned()),
64
    );
65
    first.unwrap();
66
    second.unwrap();
67
    handle.shutdown().await.unwrap();
68
    running.await.unwrap().unwrap();
69
    draining.await.unwrap();
70
    server.server().verify().await;
71
}
72
73
#[tokio::test]
74
async fn two_prepares_at_once_sync_members_once() {
75
    prepare_twice(true, 1).await;
76
}
77
78
#[tokio::test]
79
async fn a_plain_room_needs_no_preparing() {
80
    prepare_twice(false, 0).await;
81
}