atagen

macltok

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

Blame: tests/state.rs

31ce2453c82fatagen2026-09-24 13:07 UTC1
mod support;
31ce2453c82fatagen2026-09-24 13:07 UTC2
96fdf90aacd6atagen2026-09-08 08:24 UTC3
use std::time::Duration;
96fdf90aacd6atagen2026-09-08 08:24 UTC4
31ce2453c82fatagen2026-09-24 13:07 UTC5
use macltok::{ConnectionState, Engine, EngineConfig, EngineError, Event, RoomMembership};
96fdf90aacd6atagen2026-09-08 08:24 UTC6
use matrix_sdk::{
96fdf90aacd6atagen2026-09-08 08:24 UTC7
    ruma::{api::client::sync::sync_events::v5, room_id},
96fdf90aacd6atagen2026-09-08 08:24 UTC8
    test_utils::mocks::MatrixMockServer,
96fdf90aacd6atagen2026-09-08 08:24 UTC9
};
96fdf90aacd6atagen2026-09-08 08:24 UTC10
use tokio::sync::watch;
96fdf90aacd6atagen2026-09-08 08:24 UTC11
96fdf90aacd6atagen2026-09-08 08:24 UTC12
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC13
async fn rooms_changed_invalidates_room_summaries() {
96fdf90aacd6atagen2026-09-08 08:24 UTC14
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC15
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC16
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC17
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC18
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC19
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC20
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC21
    let room_id = room_id!("!state:localhost");
96fdf90aacd6atagen2026-09-08 08:24 UTC22
    server.mock_room_state_encryption().plain().mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC23
    server.sync_joined_room(&client, room_id).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC24
    let config = EngineConfig::default().with_initial_history_limit(0);
96fdf90aacd6atagen2026-09-08 08:24 UTC25
    let (engine, handle, mut events) = Engine::from_client(client, config).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC26
    let running = tokio::spawn(engine.run());
96fdf90aacd6atagen2026-09-08 08:24 UTC27
31ce2453c82fatagen2026-09-24 13:07 UTC28
    support::receive_until(&mut events, |event| matches!(event, Event::RoomsChanged)).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC29
    let rooms = handle.rooms().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC30
    let summary = rooms
96fdf90aacd6atagen2026-09-08 08:24 UTC31
        .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC32
        .find(|summary| summary.room_id == room_id)
96fdf90aacd6atagen2026-09-08 08:24 UTC33
        .expect("synced room was absent from the room summaries");
96fdf90aacd6atagen2026-09-08 08:24 UTC34
    assert_eq!(summary.membership, RoomMembership::Joined);
96fdf90aacd6atagen2026-09-08 08:24 UTC35
    assert!(!summary.name.is_empty());
96fdf90aacd6atagen2026-09-08 08:24 UTC36
31ce2453c82fatagen2026-09-24 13:07 UTC37
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC38
}
96fdf90aacd6atagen2026-09-08 08:24 UTC39
96fdf90aacd6atagen2026-09-08 08:24 UTC40
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC41
async fn connection_watch_tracks_the_engine_lifecycle() {
96fdf90aacd6atagen2026-09-08 08:24 UTC42
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC43
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC44
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC45
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC46
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC47
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC48
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC49
    let config = EngineConfig::default().with_initial_history_limit(0);
96fdf90aacd6atagen2026-09-08 08:24 UTC50
    let (engine, handle, mut events) = Engine::from_client(client, config).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC51
    let mut connection = handle.connection_state();
96fdf90aacd6atagen2026-09-08 08:24 UTC52
    let connection_peer = connection.clone();
96fdf90aacd6atagen2026-09-08 08:24 UTC53
    assert_eq!(*connection.borrow(), ConnectionState::Idle);
96fdf90aacd6atagen2026-09-08 08:24 UTC54
    assert_eq!(*connection_peer.borrow(), ConnectionState::Idle);
96fdf90aacd6atagen2026-09-08 08:24 UTC55
96fdf90aacd6atagen2026-09-08 08:24 UTC56
    let running = tokio::spawn(engine.run());
31ce2453c82fatagen2026-09-24 13:07 UTC57
    support::receive_until(&mut events, |event| {
96fdf90aacd6atagen2026-09-08 08:24 UTC58
        matches!(event, Event::ConnectionChanged(ConnectionState::Connecting))
96fdf90aacd6atagen2026-09-08 08:24 UTC59
    })
96fdf90aacd6atagen2026-09-08 08:24 UTC60
    .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC61
    assert_ne!(*connection.borrow(), ConnectionState::Idle);
31ce2453c82fatagen2026-09-24 13:07 UTC62
    support::receive_until(&mut events, |event| {
96fdf90aacd6atagen2026-09-08 08:24 UTC63
        matches!(event, Event::ConnectionChanged(ConnectionState::Online))
96fdf90aacd6atagen2026-09-08 08:24 UTC64
    })
96fdf90aacd6atagen2026-09-08 08:24 UTC65
    .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC66
    wait_for_connection(&mut connection, ConnectionState::Online).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC67
    assert_eq!(*connection_peer.borrow(), ConnectionState::Online);
96fdf90aacd6atagen2026-09-08 08:24 UTC68
31ce2453c82fatagen2026-09-24 13:07 UTC69
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC70
    wait_for_connection(&mut connection, ConnectionState::Stopped).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC71
    assert_eq!(*connection_peer.borrow(), ConnectionState::Stopped);
96fdf90aacd6atagen2026-09-08 08:24 UTC72
}
96fdf90aacd6atagen2026-09-08 08:24 UTC73
96fdf90aacd6atagen2026-09-08 08:24 UTC74
#[tokio::test]
fa9114fcf75fatagen2026-09-24 12:51 UTC75
async fn soft_logout_says_so_and_stops_the_engine() {
fa9114fcf75fatagen2026-09-24 12:51 UTC76
    let server = MatrixMockServer::new().await;
fa9114fcf75fatagen2026-09-24 12:51 UTC77
    server
fa9114fcf75fatagen2026-09-24 12:51 UTC78
        .mock_sliding_sync()
fa9114fcf75fatagen2026-09-24 12:51 UTC79
        .error_unknown_token(true)
fa9114fcf75fatagen2026-09-24 12:51 UTC80
        .mount()
fa9114fcf75fatagen2026-09-24 12:51 UTC81
        .await;
fa9114fcf75fatagen2026-09-24 12:51 UTC82
    let client = server.client_builder().build().await;
fa9114fcf75fatagen2026-09-24 12:51 UTC83
    let (engine, _handle, mut events) = Engine::from_client(
fa9114fcf75fatagen2026-09-24 12:51 UTC84
        client,
fa9114fcf75fatagen2026-09-24 12:51 UTC85
        EngineConfig::default().with_initial_history_limit(0),
fa9114fcf75fatagen2026-09-24 12:51 UTC86
    )
fa9114fcf75fatagen2026-09-24 12:51 UTC87
    .await
fa9114fcf75fatagen2026-09-24 12:51 UTC88
    .unwrap();
fa9114fcf75fatagen2026-09-24 12:51 UTC89
    let running = tokio::spawn(engine.run());
31ce2453c82fatagen2026-09-24 13:07 UTC90
    support::receive_until(&mut events, |event| {
fa9114fcf75fatagen2026-09-24 12:51 UTC91
        matches!(event, Event::SessionAccessRejected { soft_logout: true })
fa9114fcf75fatagen2026-09-24 12:51 UTC92
    })
fa9114fcf75fatagen2026-09-24 12:51 UTC93
    .await;
31ce2453c82fatagen2026-09-24 13:07 UTC94
    support::receive_until(&mut events, |event| matches!(event, Event::Stopped)).await;
fa9114fcf75fatagen2026-09-24 12:51 UTC95
    running.await.unwrap().unwrap();
fa9114fcf75fatagen2026-09-24 12:51 UTC96
}
fa9114fcf75fatagen2026-09-24 12:51 UTC97
fa9114fcf75fatagen2026-09-24 12:51 UTC98
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC99
async fn closing_the_event_stream_stops_an_idle_engine() {
96fdf90aacd6atagen2026-09-08 08:24 UTC100
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC101
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC102
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC103
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC104
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC105
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC106
    let client = server.client_builder().build().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC107
    let (engine, handle, mut events) = Engine::from_client(
96fdf90aacd6atagen2026-09-08 08:24 UTC108
        client,
96fdf90aacd6atagen2026-09-08 08:24 UTC109
        EngineConfig::default().with_initial_history_limit(0),
96fdf90aacd6atagen2026-09-08 08:24 UTC110
    )
96fdf90aacd6atagen2026-09-08 08:24 UTC111
    .await
96fdf90aacd6atagen2026-09-08 08:24 UTC112
    .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC113
    let running = tokio::spawn(engine.run());
31ce2453c82fatagen2026-09-24 13:07 UTC114
    support::receive_until(&mut events, |event| {
96fdf90aacd6atagen2026-09-08 08:24 UTC115
        matches!(event, Event::ConnectionChanged(ConnectionState::Online))
96fdf90aacd6atagen2026-09-08 08:24 UTC116
    })
96fdf90aacd6atagen2026-09-08 08:24 UTC117
    .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC118
    drop(events);
96fdf90aacd6atagen2026-09-08 08:24 UTC119
    let result = tokio::time::timeout(Duration::from_secs(2), running)
96fdf90aacd6atagen2026-09-08 08:24 UTC120
        .await
96fdf90aacd6atagen2026-09-08 08:24 UTC121
        .expect("engine did not stop after its event receiver closed")
96fdf90aacd6atagen2026-09-08 08:24 UTC122
        .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC123
    assert!(matches!(result, Err(EngineError::EventReceiverClosed)));
96fdf90aacd6atagen2026-09-08 08:24 UTC124
    drop(handle);
96fdf90aacd6atagen2026-09-08 08:24 UTC125
}
96fdf90aacd6atagen2026-09-08 08:24 UTC126
96fdf90aacd6atagen2026-09-08 08:24 UTC127
async fn wait_for_connection(
96fdf90aacd6atagen2026-09-08 08:24 UTC128
    connection: &mut watch::Receiver<ConnectionState>,
96fdf90aacd6atagen2026-09-08 08:24 UTC129
    expected: ConnectionState,
96fdf90aacd6atagen2026-09-08 08:24 UTC130
) {
96fdf90aacd6atagen2026-09-08 08:24 UTC131
    tokio::time::timeout(Duration::from_secs(2), async {
96fdf90aacd6atagen2026-09-08 08:24 UTC132
        loop {
96fdf90aacd6atagen2026-09-08 08:24 UTC133
            if *connection.borrow_and_update() == expected {
96fdf90aacd6atagen2026-09-08 08:24 UTC134
                return;
96fdf90aacd6atagen2026-09-08 08:24 UTC135
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC136
            connection
96fdf90aacd6atagen2026-09-08 08:24 UTC137
                .changed()
96fdf90aacd6atagen2026-09-08 08:24 UTC138
                .await
96fdf90aacd6atagen2026-09-08 08:24 UTC139
                .expect("connection watch closed before the expected state");
96fdf90aacd6atagen2026-09-08 08:24 UTC140
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC141
    })
96fdf90aacd6atagen2026-09-08 08:24 UTC142
    .await
96fdf90aacd6atagen2026-09-08 08:24 UTC143
    .expect("expected connection state did not arrive");
96fdf90aacd6atagen2026-09-08 08:24 UTC144
}