atagen

macltok

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

Blame: src/search/service_tests.rs

74befbc72bafatagen2026-10-25 11:18 UTC1
use matrix_sdk::{
74befbc72bafatagen2026-10-25 11:18 UTC2
    deserialized_responses::TimelineEvent as SdkTimelineEvent,
74befbc72bafatagen2026-10-25 11:18 UTC3
    ruma::{events::AnySyncTimelineEvent, room_id},
74befbc72bafatagen2026-10-25 11:18 UTC4
    test_utils::mocks::MatrixMockServer,
74befbc72bafatagen2026-10-25 11:18 UTC5
};
74befbc72bafatagen2026-10-25 11:18 UTC6
use matrix_sdk_test::{JoinedRoomBuilder, event_factory::EventFactory};
74befbc72bafatagen2026-10-25 11:18 UTC7
use serde_json::json;
74befbc72bafatagen2026-10-25 11:18 UTC8
74befbc72bafatagen2026-10-25 11:18 UTC9
use super::*;
74befbc72bafatagen2026-10-25 11:18 UTC10
74befbc72bafatagen2026-10-25 11:18 UTC11
async fn joined(server: &MatrixMockServer, room_id: &ruma::RoomId) -> Client {
74befbc72bafatagen2026-10-25 11:18 UTC12
    let client = server.client_builder().build().await;
74befbc72bafatagen2026-10-25 11:18 UTC13
    client.event_cache().subscribe().unwrap();
74befbc72bafatagen2026-10-25 11:18 UTC14
    let own_user = client.user_id().unwrap().to_owned();
74befbc72bafatagen2026-10-25 11:18 UTC15
    let room_id = room_id.to_owned();
74befbc72bafatagen2026-10-25 11:18 UTC16
    server
74befbc72bafatagen2026-10-25 11:18 UTC17
        .mock_sync()
74befbc72bafatagen2026-10-25 11:18 UTC18
        .ok_and_run(&client, move |builder| {
74befbc72bafatagen2026-10-25 11:18 UTC19
            let factory = EventFactory::new().room(&room_id);
74befbc72bafatagen2026-10-25 11:18 UTC20
            builder.add_joined_room(
74befbc72bafatagen2026-10-25 11:18 UTC21
                JoinedRoomBuilder::new(&room_id).add_state_event(factory.member(&own_user)),
74befbc72bafatagen2026-10-25 11:18 UTC22
            );
74befbc72bafatagen2026-10-25 11:18 UTC23
        })
74befbc72bafatagen2026-10-25 11:18 UTC24
        .await;
74befbc72bafatagen2026-10-25 11:18 UTC25
    client
74befbc72bafatagen2026-10-25 11:18 UTC26
}
74befbc72bafatagen2026-10-25 11:18 UTC27
74befbc72bafatagen2026-10-25 11:18 UTC28
fn service(client: &Client) -> Service {
74befbc72bafatagen2026-10-25 11:18 UTC29
    let media = Arc::new(MediaService::new(client.clone(), 1 << 20, 64));
74befbc72bafatagen2026-10-25 11:18 UTC30
    let (events, _) = EventSender::detached(16);
74befbc72bafatagen2026-10-25 11:18 UTC31
    Service::new(
74befbc72bafatagen2026-10-25 11:18 UTC32
        client.clone(),
74befbc72bafatagen2026-10-25 11:18 UTC33
        media,
74befbc72bafatagen2026-10-25 11:18 UTC34
        None,
74befbc72bafatagen2026-10-25 11:18 UTC35
        events,
74befbc72bafatagen2026-10-25 11:18 UTC36
        &EngineConfig::default(),
74befbc72bafatagen2026-10-25 11:18 UTC37
    )
74befbc72bafatagen2026-10-25 11:18 UTC38
    .1
74befbc72bafatagen2026-10-25 11:18 UTC39
}
74befbc72bafatagen2026-10-25 11:18 UTC40
74befbc72bafatagen2026-10-25 11:18 UTC41
fn message(id: &str, ts: u64, body: &str) -> Value {
74befbc72bafatagen2026-10-25 11:18 UTC42
    json!({
74befbc72bafatagen2026-10-25 11:18 UTC43
        "type": "m.room.message",
74befbc72bafatagen2026-10-25 11:18 UTC44
        "event_id": id,
74befbc72bafatagen2026-10-25 11:18 UTC45
        "sender": "@a:x",
74befbc72bafatagen2026-10-25 11:18 UTC46
        "origin_server_ts": ts,
74befbc72bafatagen2026-10-25 11:18 UTC47
        "content": { "msgtype": "m.text", "body": body },
74befbc72bafatagen2026-10-25 11:18 UTC48
    })
74befbc72bafatagen2026-10-25 11:18 UTC49
}
74befbc72bafatagen2026-10-25 11:18 UTC50
74befbc72bafatagen2026-10-25 11:18 UTC51
fn page(events: &[Value], end: Option<&str>) -> Result<Messages, Error> {
74befbc72bafatagen2026-10-25 11:18 UTC52
    Ok(Messages {
74befbc72bafatagen2026-10-25 11:18 UTC53
        start: "start".to_owned(),
74befbc72bafatagen2026-10-25 11:18 UTC54
        end: end.map(ToOwned::to_owned),
74befbc72bafatagen2026-10-25 11:18 UTC55
        chunk: events
74befbc72bafatagen2026-10-25 11:18 UTC56
            .iter()
74befbc72bafatagen2026-10-25 11:18 UTC57
            .map(|value| {
74befbc72bafatagen2026-10-25 11:18 UTC58
                SdkTimelineEvent::from_plaintext(
74befbc72bafatagen2026-10-25 11:18 UTC59
                    Raw::<AnySyncTimelineEvent>::from_json_string(value.to_string()).unwrap(),
74befbc72bafatagen2026-10-25 11:18 UTC60
                )
74befbc72bafatagen2026-10-25 11:18 UTC61
            })
74befbc72bafatagen2026-10-25 11:18 UTC62
            .collect(),
74befbc72bafatagen2026-10-25 11:18 UTC63
        state: Vec::new(),
74befbc72bafatagen2026-10-25 11:18 UTC64
    })
74befbc72bafatagen2026-10-25 11:18 UTC65
}
74befbc72bafatagen2026-10-25 11:18 UTC66
74befbc72bafatagen2026-10-25 11:18 UTC67
/// live events indexed this run used to count as overlap, so the first head page always
74befbc72bafatagen2026-10-25 11:18 UTC68
/// ended the pass and an offline gap past one page was never filled
74befbc72bafatagen2026-10-25 11:18 UTC69
#[tokio::test]
74befbc72bafatagen2026-10-25 11:18 UTC70
async fn a_head_pass_walks_past_what_this_run_indexed_live() {
74befbc72bafatagen2026-10-25 11:18 UTC71
    let server = MatrixMockServer::new().await;
74befbc72bafatagen2026-10-25 11:18 UTC72
    let room_id = room_id!("!head:x");
74befbc72bafatagen2026-10-25 11:18 UTC73
    let client = joined(&server, room_id).await;
74befbc72bafatagen2026-10-25 11:18 UTC74
    let mut service = service(&client);
74befbc72bafatagen2026-10-25 11:18 UTC75
    let room = room_id.to_owned();
74befbc72bafatagen2026-10-25 11:18 UTC76
    service.rooms.insert(
74befbc72bafatagen2026-10-25 11:18 UTC77
        room.to_string(),
74befbc72bafatagen2026-10-25 11:18 UTC78
        RoomProgress {
74befbc72bafatagen2026-10-25 11:18 UTC79
            newest: Some(100),
74befbc72bafatagen2026-10-25 11:18 UTC80
            started: true,
74befbc72bafatagen2026-10-25 11:18 UTC81
            ..RoomProgress::default()
74befbc72bafatagen2026-10-25 11:18 UTC82
        },
74befbc72bafatagen2026-10-25 11:18 UTC83
    );
74befbc72bafatagen2026-10-25 11:18 UTC84
    service.baselines.insert(room.to_string(), 100);
74befbc72bafatagen2026-10-25 11:18 UTC85
    service.observe(&room, &message("$old", 100, "old"));
74befbc72bafatagen2026-10-25 11:18 UTC86
    service.observe(&room, &message("$live", 1_000, "live"));
74befbc72bafatagen2026-10-25 11:18 UTC87
    service.backfilled(
74befbc72bafatagen2026-10-25 11:18 UTC88
        room.clone(),
74befbc72bafatagen2026-10-25 11:18 UTC89
        true,
74befbc72bafatagen2026-10-25 11:18 UTC90
        None,
74befbc72bafatagen2026-10-25 11:18 UTC91
        page(
74befbc72bafatagen2026-10-25 11:18 UTC92
            &[message("$live", 1_000, "live"), message("$gap", 500, "gap")],
74befbc72bafatagen2026-10-25 11:18 UTC93
            Some("t1"),
74befbc72bafatagen2026-10-25 11:18 UTC94
        ),
74befbc72bafatagen2026-10-25 11:18 UTC95
    );
74befbc72bafatagen2026-10-25 11:18 UTC96
    assert_eq!(
74befbc72bafatagen2026-10-25 11:18 UTC97
        service.head_tokens.get(&room).map(String::as_str),
74befbc72bafatagen2026-10-25 11:18 UTC98
        Some("t1")
74befbc72bafatagen2026-10-25 11:18 UTC99
    );
74befbc72bafatagen2026-10-25 11:18 UTC100
    assert_eq!(service.heads.front(), Some(&room));
74befbc72bafatagen2026-10-25 11:18 UTC101
    service.backfilled(
74befbc72bafatagen2026-10-25 11:18 UTC102
        room.clone(),
74befbc72bafatagen2026-10-25 11:18 UTC103
        true,
74befbc72bafatagen2026-10-25 11:18 UTC104
        Some("t1".to_owned()),
74befbc72bafatagen2026-10-25 11:18 UTC105
        page(&[message("$old", 100, "old")], Some("t2")),
74befbc72bafatagen2026-10-25 11:18 UTC106
    );
74befbc72bafatagen2026-10-25 11:18 UTC107
    assert!(!service.head_tokens.contains_key(&room));
74befbc72bafatagen2026-10-25 11:18 UTC108
    assert!(service.index.get("$gap").is_some());
74befbc72bafatagen2026-10-25 11:18 UTC109
}
74befbc72bafatagen2026-10-25 11:18 UTC110
74befbc72bafatagen2026-10-25 11:18 UTC111
/// the generic channel is bounded, and a room whose only update was lost was never followed
74befbc72bafatagen2026-10-25 11:18 UTC112
#[tokio::test]
74befbc72bafatagen2026-10-25 11:18 UTC113
async fn a_lagged_generic_channel_follows_every_joined_room() {
74befbc72bafatagen2026-10-25 11:18 UTC114
    let server = MatrixMockServer::new().await;
74befbc72bafatagen2026-10-25 11:18 UTC115
    let room_id = room_id!("!lag:x");
74befbc72bafatagen2026-10-25 11:18 UTC116
    let client = joined(&server, room_id).await;
74befbc72bafatagen2026-10-25 11:18 UTC117
    let mut service = service(&client);
74befbc72bafatagen2026-10-25 11:18 UTC118
    assert!(
74befbc72bafatagen2026-10-25 11:18 UTC119
        service
74befbc72bafatagen2026-10-25 11:18 UTC120
            .generic(Err(broadcast::error::RecvError::Lagged(3)))
74befbc72bafatagen2026-10-25 11:18 UTC121
            .await
74befbc72bafatagen2026-10-25 11:18 UTC122
    );
74befbc72bafatagen2026-10-25 11:18 UTC123
    assert!(service.subscriptions.contains_key(room_id));
74befbc72bafatagen2026-10-25 11:18 UTC124
}
74befbc72bafatagen2026-10-25 11:18 UTC125
74befbc72bafatagen2026-10-25 11:18 UTC126
/// a closed stream left its entry behind, and the room was never followed again
74befbc72bafatagen2026-10-25 11:18 UTC127
#[tokio::test]
74befbc72bafatagen2026-10-25 11:18 UTC128
async fn a_closed_room_stream_can_be_followed_again() {
74befbc72bafatagen2026-10-25 11:18 UTC129
    let server = MatrixMockServer::new().await;
74befbc72bafatagen2026-10-25 11:18 UTC130
    let room_id = room_id!("!closed:x");
74befbc72bafatagen2026-10-25 11:18 UTC131
    let client = joined(&server, room_id).await;
74befbc72bafatagen2026-10-25 11:18 UTC132
    let mut service = service(&client);
74befbc72bafatagen2026-10-25 11:18 UTC133
    service.subscribe(room_id.to_owned()).await;
74befbc72bafatagen2026-10-25 11:18 UTC134
    assert!(service.subscriptions.contains_key(room_id));
74befbc72bafatagen2026-10-25 11:18 UTC135
    service
74befbc72bafatagen2026-10-25 11:18 UTC136
        .room_update(room_id.to_owned(), RoomUpdate::Closed)
74befbc72bafatagen2026-10-25 11:18 UTC137
        .await;
74befbc72bafatagen2026-10-25 11:18 UTC138
    assert!(!service.subscriptions.contains_key(room_id));
74befbc72bafatagen2026-10-25 11:18 UTC139
    assert!(service.generic(Ok(room_id.to_owned())).await);
74befbc72bafatagen2026-10-25 11:18 UTC140
    assert!(service.subscriptions.contains_key(room_id));
74befbc72bafatagen2026-10-25 11:18 UTC141
}