Skip to content

Commit 8d4e7f0

Browse files
mgoldenbergHywan
authored andcommitted
test(indexeddb): add IndexedDB-specific integration tests for loading last chunk
Signed-off-by: Michael Goldenberg <m@mgoldenberg.net>
1 parent 3bd9313 commit 8d4e7f0

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

crates/matrix-sdk-indexeddb/src/event_cache_store/integration_tests.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,73 @@ pub async fn test_linked_chunk_update_is_a_transaction(store: IndexeddbEventCach
435435
assert!(chunks.is_empty());
436436
}
437437

438+
pub async fn test_load_last_chunk(store: IndexeddbEventCacheStore) {
439+
let room_id = &DEFAULT_TEST_ROOM_ID;
440+
let linked_chunk_id = LinkedChunkId::Room(room_id);
441+
let event = |msg: &str| make_test_event(room_id, msg);
442+
443+
// Case #1: no last chunk.
444+
let (last_chunk, chunk_identifier_generator) =
445+
store.load_last_chunk(linked_chunk_id).await.unwrap();
446+
assert!(last_chunk.is_none());
447+
assert_eq!(chunk_identifier_generator.current(), 0);
448+
449+
// Case #2: only one chunk is present.
450+
let updates = vec![
451+
Update::NewItemsChunk { previous: None, new: ChunkIdentifier::new(42), next: None },
452+
Update::PushItems {
453+
at: Position::new(ChunkIdentifier::new(42), 0),
454+
items: vec![event("saucisse de morteau"), event("comté")],
455+
},
456+
];
457+
store.handle_linked_chunk_updates(linked_chunk_id, updates).await.unwrap();
458+
459+
let (last_chunk, chunk_identifier_generator) =
460+
store.load_last_chunk(linked_chunk_id).await.unwrap();
461+
assert_matches!(last_chunk, Some(last_chunk) => {
462+
assert_eq!(last_chunk.identifier, 42);
463+
assert!(last_chunk.previous.is_none());
464+
assert!(last_chunk.next.is_none());
465+
assert_matches!(last_chunk.content, ChunkContent::Items(items) => {
466+
assert_eq!(items.len(), 2);
467+
check_test_event(&items[0], "saucisse de morteau");
468+
check_test_event(&items[1], "comté");
469+
});
470+
});
471+
assert_eq!(chunk_identifier_generator.current(), 42);
472+
473+
// Case #3: more chunks are present.
474+
let updates = vec![
475+
Update::NewItemsChunk {
476+
previous: Some(ChunkIdentifier::new(42)),
477+
new: ChunkIdentifier::new(7),
478+
next: None,
479+
},
480+
Update::PushItems {
481+
at: Position::new(ChunkIdentifier::new(7), 0),
482+
items: vec![event("fondue"), event("gruyère"), event("mont d'or")],
483+
},
484+
];
485+
store.handle_linked_chunk_updates(linked_chunk_id, updates).await.unwrap();
486+
487+
let (last_chunk, chunk_identifier_generator) =
488+
store.load_last_chunk(linked_chunk_id).await.unwrap();
489+
assert_matches!(last_chunk, Some(last_chunk) => {
490+
assert_eq!(last_chunk.identifier, 7);
491+
assert_matches!(last_chunk.previous, Some(previous) => {
492+
assert_eq!(previous, 42);
493+
});
494+
assert!(last_chunk.next.is_none());
495+
assert_matches!(last_chunk.content, ChunkContent::Items(items) => {
496+
assert_eq!(items.len(), 3);
497+
check_test_event(&items[0], "fondue");
498+
check_test_event(&items[1], "gruyère");
499+
check_test_event(&items[2], "mont d'or");
500+
});
501+
});
502+
assert_eq!(chunk_identifier_generator.current(), 42);
503+
}
504+
438505
/// Macro for generating tests for IndexedDB implementation of
439506
/// [`EventCacheStore`]
440507
///
@@ -547,6 +614,13 @@ macro_rules! indexeddb_event_cache_store_integration_tests {
547614
$crate::event_cache_store::integration_tests::test_linked_chunk_update_is_a_transaction(store)
548615
.await
549616
}
617+
618+
#[async_test]
619+
async fn test_load_last_chunk() {
620+
let store = get_event_cache_store().await.expect("Failed to get event cache store");
621+
$crate::event_cache_store::integration_tests::test_load_last_chunk(store)
622+
.await
623+
}
550624
}
551625
};
552626
}

0 commit comments

Comments
 (0)