timeline(test): add an integration test for non-live timelines not handling local echoes
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user