atagen

macltok

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

Blame: tests/tier0.rs

31ce2453c82fatagen2026-09-24 13:07 UTC1
mod support;
96fdf90aacd6atagen2026-09-08 08:24 UTC2
96fdf90aacd6atagen2026-09-08 08:24 UTC3
use macltok::{
31ce2453c82fatagen2026-09-24 13:07 UTC4
    ClientHandle, CreateRoomOptions, Engine, EngineConfig, EngineError, ErrorKind, EventStream,
31ce2453c82fatagen2026-09-24 13:07 UTC5
    RoomPreset, RoomVisibility,
96fdf90aacd6atagen2026-09-08 08:24 UTC6
};
96fdf90aacd6atagen2026-09-08 08:24 UTC7
use matrix_sdk::{
96fdf90aacd6atagen2026-09-08 08:24 UTC8
    ruma::{
96fdf90aacd6atagen2026-09-08 08:24 UTC9
        api::client::sync::sync_events::v5,
96fdf90aacd6atagen2026-09-08 08:24 UTC10
        events::{GlobalAccountDataEventType, RoomAccountDataEventType},
96fdf90aacd6atagen2026-09-08 08:24 UTC11
        room_id,
96fdf90aacd6atagen2026-09-08 08:24 UTC12
        serde::Raw,
96fdf90aacd6atagen2026-09-08 08:24 UTC13
        server_name, user_id,
96fdf90aacd6atagen2026-09-08 08:24 UTC14
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC15
    test_utils::mocks::MatrixMockServer,
96fdf90aacd6atagen2026-09-08 08:24 UTC16
};
96fdf90aacd6atagen2026-09-08 08:24 UTC17
use matrix_sdk_test::{InvitedRoomBuilder, JoinedRoomBuilder};
96fdf90aacd6atagen2026-09-08 08:24 UTC18
use serde_json::json;
96fdf90aacd6atagen2026-09-08 08:24 UTC19
use tokio::task::JoinHandle;
96fdf90aacd6atagen2026-09-08 08:24 UTC20
use wiremock::{
96fdf90aacd6atagen2026-09-08 08:24 UTC21
    Mock, ResponseTemplate,
96fdf90aacd6atagen2026-09-08 08:24 UTC22
    matchers::{body_partial_json, method, path, path_regex, query_param},
96fdf90aacd6atagen2026-09-08 08:24 UTC23
};
96fdf90aacd6atagen2026-09-08 08:24 UTC24
96fdf90aacd6atagen2026-09-08 08:24 UTC25
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC26
async fn joining_by_room_id_forwards_via_servers() {
96fdf90aacd6atagen2026-09-08 08:24 UTC27
    let room_id = room_id!("!join:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC28
    let (server, handle, mut events, running) = start_engine().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC29
    Mock::given(method("POST"))
96fdf90aacd6atagen2026-09-08 08:24 UTC30
        .and(path(format!("/_matrix/client/v3/join/{room_id}")))
96fdf90aacd6atagen2026-09-08 08:24 UTC31
        .and(query_param("via", "relay.example"))
96fdf90aacd6atagen2026-09-08 08:24 UTC32
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({ "room_id": room_id })))
96fdf90aacd6atagen2026-09-08 08:24 UTC33
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC34
        .mount(server.server())
96fdf90aacd6atagen2026-09-08 08:24 UTC35
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC36
96fdf90aacd6atagen2026-09-08 08:24 UTC37
    let joined_room = handle
96fdf90aacd6atagen2026-09-08 08:24 UTC38
        .join_room(
96fdf90aacd6atagen2026-09-08 08:24 UTC39
            room_id.to_owned().into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC40
            vec![server_name!("relay.example").to_owned()],
96fdf90aacd6atagen2026-09-08 08:24 UTC41
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC42
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC43
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC44
    assert_eq!(joined_room, room_id);
31ce2453c82fatagen2026-09-24 13:07 UTC45
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC46
}
96fdf90aacd6atagen2026-09-08 08:24 UTC47
96fdf90aacd6atagen2026-09-08 08:24 UTC48
#[tokio::test]
31ce2453c82fatagen2026-09-24 13:07 UTC49
async fn leaving_then_forgetting_a_room_hits_the_expected_endpoints() {
96fdf90aacd6atagen2026-09-08 08:24 UTC50
    let room_id = room_id!("!leave:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC51
    let (server, client) = configured_client().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC52
    server.sync_joined_room(&client, room_id).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC53
    server.mock_room_leave().ok(room_id).expect(1).mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC54
    server.mock_room_forget().ok().expect(1).mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC55
    let (handle, mut events, running) = run_client(client).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC56
31ce2453c82fatagen2026-09-24 13:07 UTC57
    handle.leave_room(room_id.to_owned()).await.unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC58
    handle.forget_room(room_id.to_owned()).await.unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC59
31ce2453c82fatagen2026-09-24 13:07 UTC60
    support::shut_down(&handle, &mut events, running).await;
31ce2453c82fatagen2026-09-24 13:07 UTC61
    drop(server);
96fdf90aacd6atagen2026-09-08 08:24 UTC62
}
96fdf90aacd6atagen2026-09-08 08:24 UTC63
96fdf90aacd6atagen2026-09-08 08:24 UTC64
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC65
async fn accepting_and_rejecting_invites_use_the_expected_endpoints() {
96fdf90aacd6atagen2026-09-08 08:24 UTC66
    let accepted = room_id!("!accepted:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC67
    let rejected = room_id!("!rejected:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC68
    let (server, client) = configured_client().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC69
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC70
        .sync_room(&client, InvitedRoomBuilder::new(accepted))
96fdf90aacd6atagen2026-09-08 08:24 UTC71
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC72
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC73
        .sync_room(&client, InvitedRoomBuilder::new(rejected))
96fdf90aacd6atagen2026-09-08 08:24 UTC74
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC75
    server.mock_room_join(accepted).ok().expect(1).mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC76
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC77
        .mock_room_leave()
96fdf90aacd6atagen2026-09-08 08:24 UTC78
        .ok(rejected)
96fdf90aacd6atagen2026-09-08 08:24 UTC79
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC80
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC81
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC82
    let (handle, mut events, running) = run_client(client).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC83
31ce2453c82fatagen2026-09-24 13:07 UTC84
    handle.accept_invite(accepted.to_owned()).await.unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC85
    handle.reject_invite(rejected.to_owned()).await.unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC86
31ce2453c82fatagen2026-09-24 13:07 UTC87
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC88
}
96fdf90aacd6atagen2026-09-08 08:24 UTC89
96fdf90aacd6atagen2026-09-08 08:24 UTC90
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC91
async fn creating_a_room_forwards_options() {
96fdf90aacd6atagen2026-09-08 08:24 UTC92
    let (server, handle, mut events, running) = start_engine().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC93
    Mock::given(method("POST"))
96fdf90aacd6atagen2026-09-08 08:24 UTC94
        .and(path("/_matrix/client/v3/createRoom"))
96fdf90aacd6atagen2026-09-08 08:24 UTC95
        .and(body_partial_json(json!({
96fdf90aacd6atagen2026-09-08 08:24 UTC96
            "name": "Planning",
96fdf90aacd6atagen2026-09-08 08:24 UTC97
            "topic": "Next release",
96fdf90aacd6atagen2026-09-08 08:24 UTC98
            "room_alias_name": "planning",
96fdf90aacd6atagen2026-09-08 08:24 UTC99
            "invite": ["@partner:localhost"],
96fdf90aacd6atagen2026-09-08 08:24 UTC100
            "visibility": "public",
96fdf90aacd6atagen2026-09-08 08:24 UTC101
            "preset": "public_chat"
96fdf90aacd6atagen2026-09-08 08:24 UTC102
        })))
96fdf90aacd6atagen2026-09-08 08:24 UTC103
        .respond_with(
96fdf90aacd6atagen2026-09-08 08:24 UTC104
            ResponseTemplate::new(200).set_body_json(json!({ "room_id": "!created:localhost" })),
96fdf90aacd6atagen2026-09-08 08:24 UTC105
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC106
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC107
        .mount(server.server())
96fdf90aacd6atagen2026-09-08 08:24 UTC108
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC109
96fdf90aacd6atagen2026-09-08 08:24 UTC110
    let created_room = handle
31ce2453c82fatagen2026-09-24 13:07 UTC111
        .create_room(
31ce2453c82fatagen2026-09-24 13:07 UTC112
            CreateRoomOptions::default()
31ce2453c82fatagen2026-09-24 13:07 UTC113
                .with_name("Planning")
31ce2453c82fatagen2026-09-24 13:07 UTC114
                .with_topic("Next release")
31ce2453c82fatagen2026-09-24 13:07 UTC115
                .with_alias_localpart("planning")
31ce2453c82fatagen2026-09-24 13:07 UTC116
                .with_invite(vec![user_id!("@partner:localhost").to_owned()])
31ce2453c82fatagen2026-09-24 13:07 UTC117
                .with_visibility(RoomVisibility::Public)
31ce2453c82fatagen2026-09-24 13:07 UTC118
                .with_preset(RoomPreset::PublicChat),
31ce2453c82fatagen2026-09-24 13:07 UTC119
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC120
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC121
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC122
    assert_eq!(created_room, room_id!("!created:localhost").to_owned());
31ce2453c82fatagen2026-09-24 13:07 UTC123
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC124
}
96fdf90aacd6atagen2026-09-08 08:24 UTC125
96fdf90aacd6atagen2026-09-08 08:24 UTC126
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC127
async fn creating_a_direct_room_invites_the_other_user() {
96fdf90aacd6atagen2026-09-08 08:24 UTC128
    let (server, handle, mut events, running) = start_engine().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC129
    Mock::given(method("POST"))
96fdf90aacd6atagen2026-09-08 08:24 UTC130
        .and(path("/_matrix/client/v3/createRoom"))
96fdf90aacd6atagen2026-09-08 08:24 UTC131
        .and(body_partial_json(json!({
96fdf90aacd6atagen2026-09-08 08:24 UTC132
            "invite": ["@partner:localhost"],
96fdf90aacd6atagen2026-09-08 08:24 UTC133
            "is_direct": true,
96fdf90aacd6atagen2026-09-08 08:24 UTC134
            "preset": "trusted_private_chat"
96fdf90aacd6atagen2026-09-08 08:24 UTC135
        })))
96fdf90aacd6atagen2026-09-08 08:24 UTC136
        .respond_with(
96fdf90aacd6atagen2026-09-08 08:24 UTC137
            ResponseTemplate::new(200).set_body_json(json!({ "room_id": "!direct:localhost" })),
96fdf90aacd6atagen2026-09-08 08:24 UTC138
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC139
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC140
        .mount(server.server())
96fdf90aacd6atagen2026-09-08 08:24 UTC141
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC142
    Mock::given(method("GET"))
96fdf90aacd6atagen2026-09-08 08:24 UTC143
        .and(path_regex(
96fdf90aacd6atagen2026-09-08 08:24 UTC144
            r"^/_matrix/client/v3/user/.*/account_data/m\.direct$",
96fdf90aacd6atagen2026-09-08 08:24 UTC145
        ))
96fdf90aacd6atagen2026-09-08 08:24 UTC146
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({})))
96fdf90aacd6atagen2026-09-08 08:24 UTC147
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC148
        .mount(server.server())
96fdf90aacd6atagen2026-09-08 08:24 UTC149
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC150
    Mock::given(method("PUT"))
96fdf90aacd6atagen2026-09-08 08:24 UTC151
        .and(path_regex(
96fdf90aacd6atagen2026-09-08 08:24 UTC152
            r"^/_matrix/client/v3/user/.*/account_data/m\.direct$",
96fdf90aacd6atagen2026-09-08 08:24 UTC153
        ))
96fdf90aacd6atagen2026-09-08 08:24 UTC154
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({})))
96fdf90aacd6atagen2026-09-08 08:24 UTC155
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC156
        .mount(server.server())
96fdf90aacd6atagen2026-09-08 08:24 UTC157
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC158
96fdf90aacd6atagen2026-09-08 08:24 UTC159
    let direct_room = handle
96fdf90aacd6atagen2026-09-08 08:24 UTC160
        .create_direct(user_id!("@partner:localhost").to_owned())
96fdf90aacd6atagen2026-09-08 08:24 UTC161
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC162
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC163
    assert_eq!(direct_room, room_id!("!direct:localhost").to_owned());
31ce2453c82fatagen2026-09-24 13:07 UTC164
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC165
}
96fdf90aacd6atagen2026-09-08 08:24 UTC166
96fdf90aacd6atagen2026-09-08 08:24 UTC167
#[tokio::test]
31ce2453c82fatagen2026-09-24 13:07 UTC168
async fn unknown_rooms_fail_membership_commands_with_room_unknown() {
96fdf90aacd6atagen2026-09-08 08:24 UTC169
    let (server, handle, mut events, running) = start_engine().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC170
    let unknown = room_id!("!unknown:localhost");
31ce2453c82fatagen2026-09-24 13:07 UTC171
31ce2453c82fatagen2026-09-24 13:07 UTC172
    assert_eq!(
31ce2453c82fatagen2026-09-24 13:07 UTC173
        handle
31ce2453c82fatagen2026-09-24 13:07 UTC174
            .leave_room(unknown.to_owned())
31ce2453c82fatagen2026-09-24 13:07 UTC175
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC176
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC177
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC178
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC179
    );
31ce2453c82fatagen2026-09-24 13:07 UTC180
    assert_eq!(
31ce2453c82fatagen2026-09-24 13:07 UTC181
        handle
31ce2453c82fatagen2026-09-24 13:07 UTC182
            .forget_room(unknown.to_owned())
31ce2453c82fatagen2026-09-24 13:07 UTC183
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC184
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC185
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC186
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC187
    );
31ce2453c82fatagen2026-09-24 13:07 UTC188
    assert_eq!(
31ce2453c82fatagen2026-09-24 13:07 UTC189
        handle
31ce2453c82fatagen2026-09-24 13:07 UTC190
            .accept_invite(unknown.to_owned())
31ce2453c82fatagen2026-09-24 13:07 UTC191
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC192
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC193
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC194
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC195
    );
31ce2453c82fatagen2026-09-24 13:07 UTC196
    assert_eq!(
31ce2453c82fatagen2026-09-24 13:07 UTC197
        handle
31ce2453c82fatagen2026-09-24 13:07 UTC198
            .reject_invite(unknown.to_owned())
31ce2453c82fatagen2026-09-24 13:07 UTC199
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC200
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC201
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC202
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC203
    );
31ce2453c82fatagen2026-09-24 13:07 UTC204
31ce2453c82fatagen2026-09-24 13:07 UTC205
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC206
    drop(server);
96fdf90aacd6atagen2026-09-08 08:24 UTC207
}
96fdf90aacd6atagen2026-09-08 08:24 UTC208
96fdf90aacd6atagen2026-09-08 08:24 UTC209
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC210
async fn account_data_reads_synced_values_and_writes_raw_content() {
96fdf90aacd6atagen2026-09-08 08:24 UTC211
    let room_id = room_id!("!account-data:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC212
    let (server, client) = configured_client().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC213
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC214
        .sync_room(
96fdf90aacd6atagen2026-09-08 08:24 UTC215
            &client,
96fdf90aacd6atagen2026-09-08 08:24 UTC216
            JoinedRoomBuilder::new(room_id).add_account_data(
96fdf90aacd6atagen2026-09-08 08:24 UTC217
                Raw::new(&json!({ "type": "m.fully_read", "content": { "event_id": "$seen:localhost" } }))
96fdf90aacd6atagen2026-09-08 08:24 UTC218
                    .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC219
                    .cast_unchecked(),
96fdf90aacd6atagen2026-09-08 08:24 UTC220
            ),
96fdf90aacd6atagen2026-09-08 08:24 UTC221
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC222
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC223
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC224
        .mock_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC225
        .ok_and_run(&client, |builder| {
96fdf90aacd6atagen2026-09-08 08:24 UTC226
            builder.add_custom_global_account_data(json!({
96fdf90aacd6atagen2026-09-08 08:24 UTC227
                "type": "com.example.preferences",
96fdf90aacd6atagen2026-09-08 08:24 UTC228
                "content": { "theme": "dark" }
96fdf90aacd6atagen2026-09-08 08:24 UTC229
            }));
96fdf90aacd6atagen2026-09-08 08:24 UTC230
        })
96fdf90aacd6atagen2026-09-08 08:24 UTC231
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC232
    let (engine, handle, mut events) = Engine::from_client(client, EngineConfig::default())
96fdf90aacd6atagen2026-09-08 08:24 UTC233
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC234
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC235
    let running = tokio::spawn(engine.run());
96fdf90aacd6atagen2026-09-08 08:24 UTC236
    let global_type = GlobalAccountDataEventType::from("com.example.preferences".to_owned());
96fdf90aacd6atagen2026-09-08 08:24 UTC237
    let room_type = RoomAccountDataEventType::FullyRead;
96fdf90aacd6atagen2026-09-08 08:24 UTC238
96fdf90aacd6atagen2026-09-08 08:24 UTC239
    let global = handle
96fdf90aacd6atagen2026-09-08 08:24 UTC240
        .global_account_data(global_type.clone())
96fdf90aacd6atagen2026-09-08 08:24 UTC241
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC242
        .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC243
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC244
    assert_eq!(
96fdf90aacd6atagen2026-09-08 08:24 UTC245
        global.deserialize_as::<serde_json::Value>().unwrap()["theme"],
96fdf90aacd6atagen2026-09-08 08:24 UTC246
        "dark"
96fdf90aacd6atagen2026-09-08 08:24 UTC247
    );
96fdf90aacd6atagen2026-09-08 08:24 UTC248
    let room = handle
96fdf90aacd6atagen2026-09-08 08:24 UTC249
        .room_account_data(room_id, room_type.clone())
96fdf90aacd6atagen2026-09-08 08:24 UTC250
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC251
        .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC252
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC253
    assert_eq!(
96fdf90aacd6atagen2026-09-08 08:24 UTC254
        room.deserialize_as::<serde_json::Value>().unwrap()["content"]["event_id"],
96fdf90aacd6atagen2026-09-08 08:24 UTC255
        "$seen:localhost"
96fdf90aacd6atagen2026-09-08 08:24 UTC256
    );
31ce2453c82fatagen2026-09-24 13:07 UTC257
    assert_eq!(
96fdf90aacd6atagen2026-09-08 08:24 UTC258
        handle
96fdf90aacd6atagen2026-09-08 08:24 UTC259
            .room_account_data(room_id!("!missing:localhost"), room_type.clone())
31ce2453c82fatagen2026-09-24 13:07 UTC260
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC261
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC262
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC263
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC264
    );
96fdf90aacd6atagen2026-09-08 08:24 UTC265
96fdf90aacd6atagen2026-09-08 08:24 UTC266
    Mock::given(method("PUT"))
96fdf90aacd6atagen2026-09-08 08:24 UTC267
        .and(path(
96fdf90aacd6atagen2026-09-08 08:24 UTC268
            "/_matrix/client/v3/user/@example:localhost/account_data/com.example.preferences",
96fdf90aacd6atagen2026-09-08 08:24 UTC269
        ))
96fdf90aacd6atagen2026-09-08 08:24 UTC270
        .and(body_partial_json(json!({ "theme": "light" })))
96fdf90aacd6atagen2026-09-08 08:24 UTC271
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({})))
96fdf90aacd6atagen2026-09-08 08:24 UTC272
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC273
        .mount(server.server())
96fdf90aacd6atagen2026-09-08 08:24 UTC274
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC275
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC276
        .mock_set_room_account_data(room_type.clone())
96fdf90aacd6atagen2026-09-08 08:24 UTC277
        .ok()
96fdf90aacd6atagen2026-09-08 08:24 UTC278
        .expect(1)
96fdf90aacd6atagen2026-09-08 08:24 UTC279
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC280
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC281
    handle
96fdf90aacd6atagen2026-09-08 08:24 UTC282
        .set_global_account_data(
96fdf90aacd6atagen2026-09-08 08:24 UTC283
            global_type,
96fdf90aacd6atagen2026-09-08 08:24 UTC284
            Raw::new(&json!({ "theme": "light" }))
96fdf90aacd6atagen2026-09-08 08:24 UTC285
                .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC286
                .cast_unchecked(),
96fdf90aacd6atagen2026-09-08 08:24 UTC287
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC288
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC289
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC290
    handle
96fdf90aacd6atagen2026-09-08 08:24 UTC291
        .set_room_account_data(
31ce2453c82fatagen2026-09-24 13:07 UTC292
            room_id.to_owned(),
96fdf90aacd6atagen2026-09-08 08:24 UTC293
            room_type,
96fdf90aacd6atagen2026-09-08 08:24 UTC294
            Raw::new(&json!({ "event_id": "$later:localhost" }))
96fdf90aacd6atagen2026-09-08 08:24 UTC295
                .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC296
                .cast_unchecked(),
96fdf90aacd6atagen2026-09-08 08:24 UTC297
        )
96fdf90aacd6atagen2026-09-08 08:24 UTC298
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC299
        .unwrap();
31ce2453c82fatagen2026-09-24 13:07 UTC300
    assert_eq!(
96fdf90aacd6atagen2026-09-08 08:24 UTC301
        handle
96fdf90aacd6atagen2026-09-08 08:24 UTC302
            .set_room_account_data(
31ce2453c82fatagen2026-09-24 13:07 UTC303
                room_id!("!missing:localhost").to_owned(),
96fdf90aacd6atagen2026-09-08 08:24 UTC304
                RoomAccountDataEventType::FullyRead,
96fdf90aacd6atagen2026-09-08 08:24 UTC305
                Raw::new(&json!({ "event_id": "$later:localhost" }))
96fdf90aacd6atagen2026-09-08 08:24 UTC306
                    .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC307
                    .cast_unchecked()
96fdf90aacd6atagen2026-09-08 08:24 UTC308
            )
31ce2453c82fatagen2026-09-24 13:07 UTC309
            .await
31ce2453c82fatagen2026-09-24 13:07 UTC310
            .unwrap_err()
31ce2453c82fatagen2026-09-24 13:07 UTC311
            .kind,
31ce2453c82fatagen2026-09-24 13:07 UTC312
        ErrorKind::RoomUnknown
31ce2453c82fatagen2026-09-24 13:07 UTC313
    );
31ce2453c82fatagen2026-09-24 13:07 UTC314
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC315
}
96fdf90aacd6atagen2026-09-08 08:24 UTC316
96fdf90aacd6atagen2026-09-08 08:24 UTC317
async fn configured_client() -> (MatrixMockServer, matrix_sdk::Client) {
96fdf90aacd6atagen2026-09-08 08:24 UTC318
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC319
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC320
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC321
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC322
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC323
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC324
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC325
    server.mock_room_state_encryption().plain().mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC326
    (server, client)
96fdf90aacd6atagen2026-09-08 08:24 UTC327
}
96fdf90aacd6atagen2026-09-08 08:24 UTC328
96fdf90aacd6atagen2026-09-08 08:24 UTC329
async fn start_engine() -> (
96fdf90aacd6atagen2026-09-08 08:24 UTC330
    MatrixMockServer,
96fdf90aacd6atagen2026-09-08 08:24 UTC331
    ClientHandle,
96fdf90aacd6atagen2026-09-08 08:24 UTC332
    EventStream,
fe4133dbcd47atagen2026-09-26 09:05 UTC333
    JoinHandle<Result<macltok::Termination, EngineError>>,
96fdf90aacd6atagen2026-09-08 08:24 UTC334
) {
96fdf90aacd6atagen2026-09-08 08:24 UTC335
    let (server, client) = configured_client().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC336
    let (handle, events, running) = run_client(client).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC337
    (server, handle, events, running)
96fdf90aacd6atagen2026-09-08 08:24 UTC338
}
96fdf90aacd6atagen2026-09-08 08:24 UTC339
96fdf90aacd6atagen2026-09-08 08:24 UTC340
async fn run_client(
96fdf90aacd6atagen2026-09-08 08:24 UTC341
    client: matrix_sdk::Client,
96fdf90aacd6atagen2026-09-08 08:24 UTC342
) -> (
96fdf90aacd6atagen2026-09-08 08:24 UTC343
    ClientHandle,
96fdf90aacd6atagen2026-09-08 08:24 UTC344
    EventStream,
fe4133dbcd47atagen2026-09-26 09:05 UTC345
    JoinHandle<Result<macltok::Termination, EngineError>>,
96fdf90aacd6atagen2026-09-08 08:24 UTC346
) {
96fdf90aacd6atagen2026-09-08 08:24 UTC347
    let config = EngineConfig::default().with_initial_history_limit(0);
96fdf90aacd6atagen2026-09-08 08:24 UTC348
    let (engine, handle, events) = Engine::from_client(client, config).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC349
    let running = tokio::spawn(engine.run());
96fdf90aacd6atagen2026-09-08 08:24 UTC350
    (handle, events, running)
96fdf90aacd6atagen2026-09-08 08:24 UTC351
}