@@ -16,6 +16,7 @@ use assert_matches::assert_matches;
16
16
use assert_matches2:: assert_let;
17
17
use chrono:: { Datelike , Local , TimeZone } ;
18
18
use eyeball_im:: VectorDiff ;
19
+ use futures_util:: { FutureExt , StreamExt as _} ;
19
20
use matrix_sdk_test:: { async_test, ALICE , BOB } ;
20
21
use ruma:: {
21
22
event_id,
@@ -24,7 +25,7 @@ use ruma::{
24
25
use stream_assert:: assert_next_matches;
25
26
26
27
use super :: TestTimeline ;
27
- use crate :: timeline:: { TimelineItemKind , VirtualTimelineItem } ;
28
+ use crate :: timeline:: { traits :: RoomDataProvider as _ , TimelineItemKind , VirtualTimelineItem } ;
28
29
29
30
#[ async_test]
30
31
async fn test_day_divider ( ) {
@@ -91,60 +92,99 @@ async fn test_update_read_marker() {
91
92
let timeline = TestTimeline :: new ( ) ;
92
93
let mut stream = timeline. subscribe ( ) . await ;
93
94
94
- let f = & timeline. factory ;
95
+ let own_user = timeline. controller . room_data_provider . own_user_id ( ) . to_owned ( ) ;
95
96
96
- timeline. handle_live_event ( f. text_msg ( "A" ) . sender ( & ALICE ) ) . await ;
97
+ let f = & timeline. factory ;
98
+ timeline. handle_live_event ( f. text_msg ( "A" ) . sender ( & own_user) ) . await ;
97
99
98
100
let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
99
- let first_event_id = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
101
+ let event_id1 = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
100
102
101
103
let day_divider = assert_next_matches ! ( stream, VectorDiff :: PushFront { value } => value) ;
102
104
assert ! ( day_divider. is_day_divider( ) ) ;
103
105
104
- timeline. controller . handle_fully_read_marker ( first_event_id . clone ( ) ) . await ;
106
+ timeline. controller . handle_fully_read_marker ( event_id1 . to_owned ( ) ) . await ;
105
107
106
108
// Nothing should happen, the marker cannot be added at the end.
107
109
108
110
timeline. handle_live_event ( f. text_msg ( "B" ) . sender ( & BOB ) ) . await ;
109
111
let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
110
- let second_event_id = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
112
+ let event_id2 = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
111
113
112
114
// Now the read marker appears after the first event.
113
115
let item = assert_next_matches ! ( stream, VectorDiff :: Insert { index: 2 , value } => value) ;
114
116
assert_matches ! ( item. as_virtual( ) , Some ( VirtualTimelineItem :: ReadMarker ) ) ;
115
117
116
- timeline. controller . handle_fully_read_marker ( second_event_id . clone ( ) ) . await ;
118
+ timeline. controller . handle_fully_read_marker ( event_id2 . clone ( ) ) . await ;
117
119
118
120
// The read marker is removed but not reinserted, because it cannot be added at
119
121
// the end.
120
122
assert_next_matches ! ( stream, VectorDiff :: Remove { index: 2 } ) ;
121
123
122
- timeline. handle_live_event ( f. text_msg ( "C" ) . sender ( & ALICE ) ) . await ;
124
+ timeline. handle_live_event ( f. text_msg ( "C" ) . sender ( & BOB ) ) . await ;
123
125
let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
124
- let third_event_id = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
126
+ let event_id3 = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
125
127
126
128
// Now the read marker is reinserted after the second event.
127
129
let marker = assert_next_matches ! ( stream, VectorDiff :: Insert { index: 3 , value } => value) ;
128
130
assert_matches ! ( marker. kind, TimelineItemKind :: Virtual ( VirtualTimelineItem :: ReadMarker ) ) ;
129
131
130
- // Nothing should happen if the fully read event is set back to an older event.
131
- timeline. controller . handle_fully_read_marker ( first_event_id) . await ;
132
+ // Nothing should happen if the fully read event is set back to an older event
133
+ // sent by another user.
134
+ timeline. controller . handle_fully_read_marker ( event_id1. to_owned ( ) ) . await ;
135
+ assert ! ( stream. next( ) . now_or_never( ) . is_none( ) ) ;
132
136
133
137
// Nothing should happen if the fully read event isn't found.
134
138
timeline. controller . handle_fully_read_marker ( event_id ! ( "$fake_event_id" ) . to_owned ( ) ) . await ;
139
+ assert ! ( stream. next( ) . now_or_never( ) . is_none( ) ) ;
135
140
136
141
// Nothing should happen if the fully read event is referring to an event
137
142
// that has already been marked as fully read.
138
- timeline. controller . handle_fully_read_marker ( second_event_id) . await ;
143
+ timeline. controller . handle_fully_read_marker ( event_id2) . await ;
144
+ assert ! ( stream. next( ) . now_or_never( ) . is_none( ) ) ;
139
145
140
- timeline. handle_live_event ( f. text_msg ( "D" ) . sender ( & ALICE ) ) . await ;
146
+ timeline. handle_live_event ( f. text_msg ( "D" ) . sender ( & BOB ) ) . await ;
141
147
let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
142
- item. as_event ( ) . unwrap ( ) ;
148
+ let event_id4 = item. as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
143
149
144
- timeline. controller . handle_fully_read_marker ( third_event_id ) . await ;
150
+ timeline. controller . handle_fully_read_marker ( event_id3 ) . await ;
145
151
146
- // The read marker is moved after the third event.
152
+ // The read marker is moved after the third event (sent by another user) .
147
153
assert_next_matches ! ( stream, VectorDiff :: Remove { index: 3 } ) ;
148
154
let marker = assert_next_matches ! ( stream, VectorDiff :: Insert { index: 4 , value } => value) ;
149
155
assert_matches ! ( marker. kind, TimelineItemKind :: Virtual ( VirtualTimelineItem :: ReadMarker ) ) ;
156
+
157
+ // If the current user sends an event afterwards, the read marker doesn't move.
158
+ timeline. handle_live_event ( f. text_msg ( "E" ) . sender ( & own_user) ) . await ;
159
+ let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
160
+ item. as_event ( ) . unwrap ( ) ;
161
+
162
+ assert ! ( stream. next( ) . now_or_never( ) . is_none( ) ) ;
163
+
164
+ // If the marker moved forward to another user's event, and there's no other
165
+ // event sent from another user, then it will be removed.
166
+ timeline. controller . handle_fully_read_marker ( event_id4) . await ;
167
+ assert_next_matches ! ( stream, VectorDiff :: Remove { index: 4 } ) ;
168
+
169
+ assert ! ( stream. next( ) . now_or_never( ) . is_none( ) ) ;
170
+
171
+ // When a last event is inserted by ourselves, still no read marker.
172
+ timeline. handle_live_event ( f. text_msg ( "F" ) . sender ( & own_user) ) . await ;
173
+ let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
174
+ item. as_event ( ) . unwrap ( ) ;
175
+
176
+ timeline. handle_live_event ( f. text_msg ( "G" ) . sender ( & own_user) ) . await ;
177
+ let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
178
+ item. as_event ( ) . unwrap ( ) ;
179
+
180
+ assert ! ( stream. next( ) . now_or_never( ) . is_none( ) ) ;
181
+
182
+ // But when it's another user who sent the event, then we get a read marker for
183
+ // their message.
184
+ timeline. handle_live_event ( f. text_msg ( "H" ) . sender ( & BOB ) ) . await ;
185
+ let item = assert_next_matches ! ( stream, VectorDiff :: PushBack { value } => value) ;
186
+ item. as_event ( ) . unwrap ( ) ;
187
+
188
+ let marker = assert_next_matches ! ( stream, VectorDiff :: Insert { index: 8 , value } => value) ;
189
+ assert_matches ! ( marker. kind, TimelineItemKind :: Virtual ( VirtualTimelineItem :: ReadMarker ) ) ;
150
190
}
0 commit comments