Skip to content

Commit 134d7f6

Browse files
committed
test(sdk): Test the RoomEvents' methods.
This patch adds unit tests for the `RoomEvents`' methods.
1 parent f9830af commit 134d7f6

File tree

2 files changed

+296
-0
lines changed

2 files changed

+296
-0
lines changed

crates/matrix-sdk/src/event_cache/linked_chunk/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,12 @@ impl ChunkIdentifierGenerator {
852852
#[repr(transparent)]
853853
pub struct ChunkIdentifier(u64);
854854

855+
impl PartialEq<u64> for ChunkIdentifier {
856+
fn eq(&self, other: &u64) -> bool {
857+
self.0 == *other
858+
}
859+
}
860+
855861
/// The position of something inside a [`Chunk`].
856862
///
857863
/// It's a pair of a chunk position and an item index.

crates/matrix-sdk/src/event_cache/store.rs

Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ impl RoomEvents {
6161
}
6262

6363
/// Deduplicate `events` considering all events in `Self::chunks`.
64+
///
65+
/// For the moment, duplicated events will be logged but not removed from
66+
/// the resulting iterator.
6467
fn deduplicate<'a, I>(&'a self, events: I) -> impl Iterator<Item = Event> + 'a
6568
where
6669
I: Iterator<Item = Event> + 'a,
@@ -169,3 +172,290 @@ impl fmt::Debug for RoomEvents {
169172
formatter.debug_struct("RoomEvents").field("chunk", &self.chunks).finish()
170173
}
171174
}
175+
176+
#[cfg(test)]
177+
mod tests {
178+
use assert_matches2::assert_let;
179+
use matrix_sdk_test::{EventBuilder, ALICE};
180+
use ruma::{events::room::message::RoomMessageEventContent, EventId, OwnedEventId};
181+
182+
use super::*;
183+
184+
fn new_event(event_builder: &EventBuilder, event_id: &str) -> (OwnedEventId, Event) {
185+
let event_id = EventId::parse(event_id).unwrap();
186+
187+
let event = SyncTimelineEvent::new(event_builder.make_sync_message_event_with_id(
188+
*ALICE,
189+
&event_id,
190+
RoomMessageEventContent::text_plain("foo"),
191+
));
192+
193+
(event_id, event)
194+
}
195+
196+
#[test]
197+
fn test_new_room_events_has_zero_events() {
198+
let room_events = RoomEvents::new();
199+
200+
assert_eq!(room_events.chunks.len(), 0);
201+
}
202+
203+
#[test]
204+
fn test_push_events() {
205+
let event_builder = EventBuilder::new();
206+
207+
let (event_id_0, event_0) = new_event(&event_builder, "$ev0");
208+
let (event_id_1, event_1) = new_event(&event_builder, "$ev1");
209+
let (event_id_2, event_2) = new_event(&event_builder, "$ev2");
210+
211+
let mut room_events = RoomEvents::new();
212+
213+
room_events.push_events([event_0, event_1]);
214+
room_events.push_events([event_2]);
215+
216+
{
217+
let mut events = room_events.events();
218+
219+
assert_let!(Some((position, event)) = events.next());
220+
assert_eq!(position.chunk_identifier(), 0);
221+
assert_eq!(position.index(), 0);
222+
assert_eq!(event.event_id().unwrap(), event_id_0);
223+
224+
assert_let!(Some((position, event)) = events.next());
225+
assert_eq!(position.chunk_identifier(), 0);
226+
assert_eq!(position.index(), 1);
227+
assert_eq!(event.event_id().unwrap(), event_id_1);
228+
229+
assert_let!(Some((position, event)) = events.next());
230+
assert_eq!(position.chunk_identifier(), 0);
231+
assert_eq!(position.index(), 2);
232+
assert_eq!(event.event_id().unwrap(), event_id_2);
233+
234+
assert!(events.next().is_none());
235+
}
236+
}
237+
238+
#[test]
239+
fn test_push_events_duplicated_event() {
240+
let event_builder = EventBuilder::new();
241+
242+
let (event_id_0, event_0) = new_event(&event_builder, "$ev0");
243+
244+
let mut room_events = RoomEvents::new();
245+
246+
room_events.push_events([event_0.clone(), event_0]);
247+
248+
{
249+
let mut events = room_events.events();
250+
251+
assert_let!(Some((position, event)) = events.next());
252+
assert_eq!(position.chunk_identifier(), 0);
253+
assert_eq!(position.index(), 0);
254+
assert_eq!(event.event_id().unwrap(), event_id_0);
255+
256+
assert_let!(Some((position, event)) = events.next());
257+
assert_eq!(position.chunk_identifier(), 0);
258+
assert_eq!(position.index(), 1);
259+
assert_eq!(event.event_id().unwrap(), event_id_0);
260+
261+
assert!(events.next().is_none());
262+
}
263+
}
264+
265+
#[test]
266+
fn test_push_gap() {
267+
let event_builder = EventBuilder::new();
268+
269+
let (event_id_0, event_0) = new_event(&event_builder, "$ev0");
270+
let (event_id_1, event_1) = new_event(&event_builder, "$ev1");
271+
272+
let mut room_events = RoomEvents::new();
273+
274+
room_events.push_events([event_0]);
275+
room_events.push_gap(Gap { prev_token: "hello".to_owned() });
276+
room_events.push_events([event_1]);
277+
278+
{
279+
let mut events = room_events.events();
280+
281+
assert_let!(Some((position, event)) = events.next());
282+
assert_eq!(position.chunk_identifier(), 0);
283+
assert_eq!(position.index(), 0);
284+
assert_eq!(event.event_id().unwrap(), event_id_0);
285+
286+
assert_let!(Some((position, event)) = events.next());
287+
assert_eq!(position.chunk_identifier(), 2);
288+
assert_eq!(position.index(), 0);
289+
assert_eq!(event.event_id().unwrap(), event_id_1);
290+
291+
assert!(events.next().is_none());
292+
}
293+
294+
{
295+
let mut chunks = room_events.chunks();
296+
297+
assert_let!(Some(chunk) = chunks.next());
298+
assert!(chunk.is_items());
299+
300+
assert_let!(Some(chunk) = chunks.next());
301+
assert!(chunk.is_gap());
302+
303+
assert_let!(Some(chunk) = chunks.next());
304+
assert!(chunk.is_items());
305+
306+
assert!(chunks.next().is_none());
307+
}
308+
}
309+
310+
#[test]
311+
fn test_insert_events_at() {
312+
let event_builder = EventBuilder::new();
313+
314+
let (event_id_0, event_0) = new_event(&event_builder, "$ev0");
315+
let (event_id_1, event_1) = new_event(&event_builder, "$ev1");
316+
let (event_id_2, event_2) = new_event(&event_builder, "$ev2");
317+
318+
let mut room_events = RoomEvents::new();
319+
320+
room_events.push_events([event_0, event_1]);
321+
322+
let position_of_event_1 = room_events
323+
.events()
324+
.find_map(|(position, event)| {
325+
(event.event_id().unwrap() == event_id_1).then_some(position)
326+
})
327+
.unwrap();
328+
329+
room_events.insert_events_at([event_2], position_of_event_1).unwrap();
330+
331+
{
332+
let mut events = room_events.events();
333+
334+
assert_let!(Some((position, event)) = events.next());
335+
assert_eq!(position.chunk_identifier(), 0);
336+
assert_eq!(position.index(), 0);
337+
assert_eq!(event.event_id().unwrap(), event_id_0);
338+
339+
assert_let!(Some((position, event)) = events.next());
340+
assert_eq!(position.chunk_identifier(), 0);
341+
assert_eq!(position.index(), 1);
342+
assert_eq!(event.event_id().unwrap(), event_id_2);
343+
344+
assert_let!(Some((position, event)) = events.next());
345+
assert_eq!(position.chunk_identifier(), 0);
346+
assert_eq!(position.index(), 2);
347+
assert_eq!(event.event_id().unwrap(), event_id_1);
348+
349+
assert!(events.next().is_none());
350+
}
351+
}
352+
353+
#[test]
354+
fn test_insert_gap_at() {
355+
let event_builder = EventBuilder::new();
356+
357+
let (event_id_0, event_0) = new_event(&event_builder, "$ev0");
358+
let (event_id_1, event_1) = new_event(&event_builder, "$ev1");
359+
360+
let mut room_events = RoomEvents::new();
361+
362+
room_events.push_events([event_0, event_1]);
363+
364+
let position_of_event_1 = room_events
365+
.events()
366+
.find_map(|(position, event)| {
367+
(event.event_id().unwrap() == event_id_1).then_some(position)
368+
})
369+
.unwrap();
370+
371+
room_events
372+
.insert_gap_at(Gap { prev_token: "hello".to_owned() }, position_of_event_1)
373+
.unwrap();
374+
375+
{
376+
let mut events = room_events.events();
377+
378+
assert_let!(Some((position, event)) = events.next());
379+
assert_eq!(position.chunk_identifier(), 0);
380+
assert_eq!(position.index(), 0);
381+
assert_eq!(event.event_id().unwrap(), event_id_0);
382+
383+
assert_let!(Some((position, event)) = events.next());
384+
assert_eq!(position.chunk_identifier(), 2);
385+
assert_eq!(position.index(), 0);
386+
assert_eq!(event.event_id().unwrap(), event_id_1);
387+
388+
assert!(events.next().is_none());
389+
}
390+
391+
{
392+
let mut chunks = room_events.chunks();
393+
394+
assert_let!(Some(chunk) = chunks.next());
395+
assert!(chunk.is_items());
396+
397+
assert_let!(Some(chunk) = chunks.next());
398+
assert!(chunk.is_gap());
399+
400+
assert_let!(Some(chunk) = chunks.next());
401+
assert!(chunk.is_items());
402+
403+
assert!(chunks.next().is_none());
404+
}
405+
}
406+
407+
#[test]
408+
fn test_replace_gap_at() {
409+
let event_builder = EventBuilder::new();
410+
411+
let (event_id_0, event_0) = new_event(&event_builder, "$ev0");
412+
let (event_id_1, event_1) = new_event(&event_builder, "$ev1");
413+
let (event_id_2, event_2) = new_event(&event_builder, "$ev2");
414+
415+
let mut room_events = RoomEvents::new();
416+
417+
room_events.push_events([event_0]);
418+
room_events.push_gap(Gap { prev_token: "hello".to_owned() });
419+
420+
let chunk_identifier_of_gap = room_events
421+
.chunks()
422+
.find_map(|chunk| chunk.is_gap().then_some(chunk.first_position()))
423+
.unwrap()
424+
.chunk_identifier();
425+
426+
room_events.replace_gap_at([event_1, event_2], chunk_identifier_of_gap).unwrap();
427+
428+
{
429+
let mut events = room_events.events();
430+
431+
assert_let!(Some((position, event)) = events.next());
432+
assert_eq!(position.chunk_identifier(), 0);
433+
assert_eq!(position.index(), 0);
434+
assert_eq!(event.event_id().unwrap(), event_id_0);
435+
436+
assert_let!(Some((position, event)) = events.next());
437+
assert_eq!(position.chunk_identifier(), 2);
438+
assert_eq!(position.index(), 0);
439+
assert_eq!(event.event_id().unwrap(), event_id_1);
440+
441+
assert_let!(Some((position, event)) = events.next());
442+
assert_eq!(position.chunk_identifier(), 2);
443+
assert_eq!(position.index(), 1);
444+
assert_eq!(event.event_id().unwrap(), event_id_2);
445+
446+
assert!(events.next().is_none());
447+
}
448+
449+
{
450+
let mut chunks = room_events.chunks();
451+
452+
assert_let!(Some(chunk) = chunks.next());
453+
assert!(chunk.is_items());
454+
455+
assert_let!(Some(chunk) = chunks.next());
456+
assert!(chunk.is_items());
457+
458+
assert!(chunks.next().is_none());
459+
}
460+
}
461+
}

0 commit comments

Comments
 (0)