@@ -18,15 +18,13 @@ use assert_matches::assert_matches;
1818use assert_matches2:: assert_let;
1919use eyeball_im:: VectorDiff ;
2020use futures_util:: StreamExt ;
21- use matrix_sdk:: {
22- executor:: spawn, ruma:: MilliSecondsSinceUnixEpoch , test_utils:: mocks:: MatrixMockServer ,
23- } ;
21+ use matrix_sdk:: { executor:: spawn, test_utils:: mocks:: MatrixMockServer } ;
2422use matrix_sdk_test:: { JoinedRoomBuilder , async_test, event_factory:: EventFactory } ;
2523use matrix_sdk_ui:: timeline:: { EventSendState , RoomExt } ;
2624use ruma:: {
2725 event_id,
2826 events:: room:: message:: { MessageType , RoomMessageEventContent } ,
29- room_id, uint , user_id,
27+ room_id, user_id,
3028} ;
3129use serde_json:: json;
3230use stream_assert:: { assert_next_matches, assert_pending} ;
@@ -82,43 +80,70 @@ async fn test_echo() {
8280 send_hdl. await . unwrap ( ) . unwrap ( ) ;
8381
8482 assert_let ! ( Some ( timeline_updates) = timeline_stream. next( ) . await ) ;
85- assert_eq ! ( timeline_updates. len( ) , 1 ) ;
83+ assert_eq ! ( timeline_updates. len( ) , 5 ) ;
8684
85+ // The `EventSendState` has been updated.
8786 assert_let ! ( VectorDiff :: Set { index: 1 , value: sent_confirmation } = & timeline_updates[ 0 ] ) ;
8887 let item = sent_confirmation. as_event ( ) . unwrap ( ) ;
8988 assert_matches ! ( item. send_state( ) , Some ( EventSendState :: Sent { .. } ) ) ;
9089 assert_eq ! ( item. event_id( ) , Some ( event_id) ) ;
9190
91+ // The local event is removed.
92+ assert_matches ! ( & timeline_updates[ 1 ] , VectorDiff :: Remove { index: 1 } ) ;
93+
94+ // The new event is inserted in the Event Cache: it comes as a remote event.
95+ assert_let ! ( VectorDiff :: PushFront { value: remote_event } = & timeline_updates[ 2 ] ) ;
96+ let item = remote_event. as_event ( ) . unwrap ( ) ;
97+ assert_let ! ( Some ( msg) = item. content( ) . as_message( ) ) ;
98+ assert_let ! ( MessageType :: Text ( text) = msg. msgtype( ) ) ;
99+ assert_eq ! ( text. body, "Hello, World!" ) ;
100+ assert_eq ! ( item. event_id( ) , Some ( event_id) ) ;
101+
102+ // The date divider is adjusted.
103+ assert_let ! ( VectorDiff :: PushFront { value: date_divider } = & timeline_updates[ 3 ] ) ;
104+ assert ! ( date_divider. is_date_divider( ) ) ;
105+ assert_matches ! ( & timeline_updates[ 4 ] , VectorDiff :: Remove { index: 2 } ) ;
106+
107+ assert_pending ! ( timeline_stream) ;
108+
109+ let another_event_id = event_id ! ( "$ev1" ) ;
92110 let f = EventFactory :: new ( ) ;
93111 server
94112 . sync_room (
95113 & client,
96- JoinedRoomBuilder :: new ( room_id) . add_timeline_event (
97- f. text_msg ( "Hello, World!" )
98- . sender ( user_id ! ( "@example:localhost" ) )
99- . event_id ( event_id)
100- . server_ts ( 152038280 )
101- . unsigned_transaction_id ( txn_id) ,
102- ) ,
114+ JoinedRoomBuilder :: new ( room_id)
115+ . add_timeline_event (
116+ f. text_msg ( "Hello, World!" )
117+ . sender ( user_id ! ( "@example:localhost" ) )
118+ . event_id ( event_id)
119+ . server_ts ( 152038280 )
120+ . unsigned_transaction_id ( txn_id) ,
121+ )
122+ . add_timeline_event (
123+ f. text_msg ( "Raclette" )
124+ . sender ( user_id ! ( "@example:localhost" ) )
125+ . event_id ( another_event_id)
126+ . server_ts ( 152038281 ) ,
127+ ) ,
103128 )
104129 . await ;
105130
131+ // The Event Cache deduplicates the first event, but we receive a second one.
106132 assert_let ! ( Some ( timeline_updates) = timeline_stream. next( ) . await ) ;
107- assert_eq ! ( timeline_updates. len( ) , 4 ) ;
133+ assert_eq ! ( timeline_updates. len( ) , 5 ) ;
108134
109- // Local echo is replaced with the remote echo.
110- assert_let ! ( VectorDiff :: Remove { index: 1 } = & timeline_updates[ 0 ] ) ;
135+ assert_matches ! ( & timeline_updates[ 0 ] , VectorDiff :: Remove { index: 1 } ) ;
111136
112- assert_let ! ( VectorDiff :: PushFront { value: remote_echo } = & timeline_updates[ 1 ] ) ;
113- let item = remote_echo. as_event ( ) . unwrap ( ) ;
114- assert ! ( item. is_own( ) ) ;
115- assert_eq ! ( item. timestamp( ) , MilliSecondsSinceUnixEpoch ( uint!( 152038280 ) ) ) ;
137+ assert_let ! ( VectorDiff :: PushFront { value: first_event } = & timeline_updates[ 1 ] ) ;
138+ assert_eq ! ( first_event. as_event( ) . unwrap( ) . event_id( ) , Some ( event_id) ) ;
139+
140+ assert_let ! ( VectorDiff :: Insert { index: 1 , value: second_event } = & timeline_updates[ 2 ] ) ;
141+ assert_eq ! ( second_event. as_event( ) . unwrap( ) . event_id( ) , Some ( another_event_id) ) ;
116142
117- // The date divider is also replaced.
118- assert_let ! ( VectorDiff :: PushFront { value: date_divider } = & timeline_updates[ 2 ] ) ;
143+ assert_let ! ( VectorDiff :: PushFront { value: date_divider } = & timeline_updates[ 3 ] ) ;
119144 assert ! ( date_divider. is_date_divider( ) ) ;
120145
121- assert_let ! ( VectorDiff :: Remove { index: 2 } = & timeline_updates [ 3 ] ) ;
146+ assert_matches ! ( & timeline_updates [ 4 ] , VectorDiff :: Remove { index: 3 } ) ;
122147
123148 assert_pending ! ( timeline_stream) ;
124149}
0 commit comments