atagen

macltok

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

Blame: tests/account.rs

96fdf90aacd6atagen2026-09-08 08:24 UTC1
#![cfg(feature = "sqlite")]
31ce2453c82fatagen2026-09-24 13:07 UTC2
mod support;
96fdf90aacd6atagen2026-09-08 08:24 UTC3
31ce2453c82fatagen2026-09-24 13:07 UTC4
use std::time::SystemTime;
31ce2453c82fatagen2026-09-24 13:07 UTC5
31ce2453c82fatagen2026-09-24 13:07 UTC6
use macltok::{EngineConfig, Event, PasswordLogin, Session, SessionRecord, StoreConfig};
96fdf90aacd6atagen2026-09-08 08:24 UTC7
use matrix_sdk::{ruma::api::client::sync::sync_events::v5, test_utils::mocks::MatrixMockServer};
96fdf90aacd6atagen2026-09-08 08:24 UTC8
96fdf90aacd6atagen2026-09-08 08:24 UTC9
#[tokio::test]
96fdf90aacd6atagen2026-09-08 08:24 UTC10
async fn password_session_round_trips_through_an_encrypted_store() {
96fdf90aacd6atagen2026-09-08 08:24 UTC11
    let server = MatrixMockServer::new().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC12
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC13
        .mock_versions()
96fdf90aacd6atagen2026-09-08 08:24 UTC14
        .with_simplified_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC15
        .ok()
96fdf90aacd6atagen2026-09-08 08:24 UTC16
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC17
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC18
    server.mock_login().ok().mount().await;
96fdf90aacd6atagen2026-09-08 08:24 UTC19
    server
96fdf90aacd6atagen2026-09-08 08:24 UTC20
        .mock_sliding_sync()
96fdf90aacd6atagen2026-09-08 08:24 UTC21
        .ok(v5::Response::new("1".to_owned()))
96fdf90aacd6atagen2026-09-08 08:24 UTC22
        .mount()
96fdf90aacd6atagen2026-09-08 08:24 UTC23
        .await;
96fdf90aacd6atagen2026-09-08 08:24 UTC24
    let store_path = temporary_store_path();
96fdf90aacd6atagen2026-09-08 08:24 UTC25
    std::fs::create_dir_all(&store_path).unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC26
    let config = EngineConfig::default().with_initial_history_limit(0);
96fdf90aacd6atagen2026-09-08 08:24 UTC27
    let session = Session::login_password(
31ce2453c82fatagen2026-09-24 13:07 UTC28
        PasswordLogin::new(server.uri(), "example", "wordpass")
31ce2453c82fatagen2026-09-24 13:07 UTC29
            .with_device_display_name("macltok test"),
96fdf90aacd6atagen2026-09-08 08:24 UTC30
        StoreConfig::new(&store_path, "test store passphrase"),
96fdf90aacd6atagen2026-09-08 08:24 UTC31
    )
96fdf90aacd6atagen2026-09-08 08:24 UTC32
    .await
96fdf90aacd6atagen2026-09-08 08:24 UTC33
    .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC34
    let encoded = serde_json::to_vec(&session.record()).unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC35
    let record: SessionRecord = serde_json::from_slice(&encoded).unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC36
    assert_eq!(
96fdf90aacd6atagen2026-09-08 08:24 UTC37
        record.homeserver().trim_end_matches('/'),
96fdf90aacd6atagen2026-09-08 08:24 UTC38
        server.uri().trim_end_matches('/')
96fdf90aacd6atagen2026-09-08 08:24 UTC39
    );
96fdf90aacd6atagen2026-09-08 08:24 UTC40
96fdf90aacd6atagen2026-09-08 08:24 UTC41
    let (engine, handle, mut events) = session.build(config.clone()).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC42
    let running = tokio::spawn(engine.run());
31ce2453c82fatagen2026-09-24 13:07 UTC43
    support::receive_until(&mut events, |event| {
31ce2453c82fatagen2026-09-24 13:07 UTC44
        matches!(event, Event::Authenticated { .. })
31ce2453c82fatagen2026-09-24 13:07 UTC45
    })
31ce2453c82fatagen2026-09-24 13:07 UTC46
    .await;
31ce2453c82fatagen2026-09-24 13:07 UTC47
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC48
96fdf90aacd6atagen2026-09-08 08:24 UTC49
    let session = Session::restore(
96fdf90aacd6atagen2026-09-08 08:24 UTC50
        record,
96fdf90aacd6atagen2026-09-08 08:24 UTC51
        StoreConfig::new(&store_path, "test store passphrase"),
96fdf90aacd6atagen2026-09-08 08:24 UTC52
    )
96fdf90aacd6atagen2026-09-08 08:24 UTC53
    .await
96fdf90aacd6atagen2026-09-08 08:24 UTC54
    .unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC55
    let (engine, handle, mut events) = session.build(config).await.unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC56
    let running = tokio::spawn(engine.run());
31ce2453c82fatagen2026-09-24 13:07 UTC57
    support::receive_until(&mut events, |event| {
31ce2453c82fatagen2026-09-24 13:07 UTC58
        matches!(event, Event::Authenticated { .. })
31ce2453c82fatagen2026-09-24 13:07 UTC59
    })
31ce2453c82fatagen2026-09-24 13:07 UTC60
    .await;
31ce2453c82fatagen2026-09-24 13:07 UTC61
    support::shut_down(&handle, &mut events, running).await;
96fdf90aacd6atagen2026-09-08 08:24 UTC62
96fdf90aacd6atagen2026-09-08 08:24 UTC63
    std::fs::remove_dir_all(store_path).unwrap();
96fdf90aacd6atagen2026-09-08 08:24 UTC64
}
96fdf90aacd6atagen2026-09-08 08:24 UTC65
96fdf90aacd6atagen2026-09-08 08:24 UTC66
fn temporary_store_path() -> std::path::PathBuf {
96fdf90aacd6atagen2026-09-08 08:24 UTC67
    let nonce = SystemTime::now()
96fdf90aacd6atagen2026-09-08 08:24 UTC68
        .duration_since(SystemTime::UNIX_EPOCH)
96fdf90aacd6atagen2026-09-08 08:24 UTC69
        .unwrap()
96fdf90aacd6atagen2026-09-08 08:24 UTC70
        .as_nanos();
96fdf90aacd6atagen2026-09-08 08:24 UTC71
    std::env::temp_dir().join(format!("macltok-account-{nonce}"))
96fdf90aacd6atagen2026-09-08 08:24 UTC72
}