timeline(test): add an integration test for non-live timelines not handling local echoes

This commit is contained in:
Benjamin Bouvier
2024-08-29 15:09:32 +02:00
parent 224292ab3e
commit c3973589c8
@@ -20,7 +20,7 @@ use assert_matches2::assert_let;
use eyeball_im::VectorDiff;
use futures_util::StreamExt;
use matrix_sdk::{
assert_let_timeout,
assert_next_matches_with_timeout,
config::SyncSettings,
test_utils::{events::EventFactory, logged_in_client_with_server},
};
@@ -30,6 +30,7 @@ use matrix_sdk_test::{
use matrix_sdk_ui::{timeline::TimelineFocus, Timeline};
use ruma::{event_id, events::room::message::RoomMessageEventContent, room_id};
use stream_assert::assert_pending;
use tokio::time::sleep;
use crate::{mock_context, mock_messages, mock_sync};
@@ -249,7 +250,7 @@ async fn test_focused_timeline_reacts() {
let _response = client.sync_once(sync_settings.clone()).await.unwrap();
server.reset().await;
assert_let_timeout!(Some(VectorDiff::Set { index: 1, value: item }) = timeline_stream.next());
let item = assert_next_matches_with_timeout!(timeline_stream, VectorDiff::Set { index: 1, value: item } => item);
let event_item = item.as_event().unwrap();
// Text hasn't changed.
@@ -261,6 +262,82 @@ async fn test_focused_timeline_reacts() {
assert_pending!(timeline_stream);
}
#[async_test]
async fn test_focused_timeline_local_echoes() {
let room_id = room_id!("!a98sd12bjh:example.org");
let (client, server) = logged_in_client_with_server().await;
let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000));
let mut sync_response_builder = SyncResponseBuilder::new();
sync_response_builder.add_joined_room(JoinedRoomBuilder::new(room_id));
// Mark the room as joined.
mock_sync(&server, sync_response_builder.build_json_sync_response(), None).await;
let _response = client.sync_once(sync_settings.clone()).await.unwrap();
server.reset().await;
// Start a focused timeline.
let f = EventFactory::new().room(room_id);
let target_event = event_id!("$1");
mock_context(
&server,
room_id,
target_event,
None,
vec![],
f.text_msg("yolo").event_id(target_event).sender(*BOB).into_timeline(),
vec![],
None,
vec![],
)
.await;
mock_encryption_state(&server, false).await;
let room = client.get_room(room_id).unwrap();
let timeline = Timeline::builder(&room)
.with_focus(TimelineFocus::Event {
target: target_event.to_owned(),
num_context_events: 20,
})
.build()
.await
.unwrap();
server.reset().await;
let (items, mut timeline_stream) = timeline.subscribe().await;
assert_eq!(items.len(), 1 + 1); // event items + a day divider
assert!(items[0].is_day_divider());
let event_item = items[1].as_event().unwrap();
assert_eq!(event_item.content().as_message().unwrap().body(), "yolo");
assert_eq!(event_item.reactions().len(), 0);
sleep(Duration::from_millis(100)).await;
assert_pending!(timeline_stream);
// Add a reaction to the focused event, which will cause a local echo to happen.
timeline.toggle_reaction(items[1].unique_id(), "").await.unwrap();
// We immediately get the local echo for the reaction.
let item = assert_next_matches_with_timeout!(timeline_stream, VectorDiff::Set { index: 1, value: item } => item);
let event_item = item.as_event().unwrap();
// Text hasn't changed.
assert_eq!(event_item.content().as_message().unwrap().body(), "yolo");
// But now there's one reaction to the event.
let reactions = event_item.reactions();
assert_eq!(reactions.len(), 1);
assert!(reactions.get("").unwrap().get(client.user_id().unwrap()).is_some());
// And nothing more.
sleep(Duration::from_millis(100)).await;
assert_pending!(timeline_stream);
}
#[async_test]
async fn test_focused_timeline_doesnt_show_local_echoes() {
let room_id = room_id!("!a98sd12bjh:example.org");
@@ -321,7 +398,7 @@ async fn test_focused_timeline_doesnt_show_local_echoes() {
timeline.send(RoomMessageEventContent::text_plain("h4xx0r").into()).await.unwrap();
// Let a bit of time for the send queue to process the event.
tokio::time::sleep(Duration::from_millis(300)).await;
sleep(Duration::from_millis(300)).await;
// And nothing more.
assert_pending!(timeline_stream);