@@ -435,6 +435,73 @@ pub async fn test_linked_chunk_update_is_a_transaction(store: IndexeddbEventCach
435
435
assert ! ( chunks. is_empty( ) ) ;
436
436
}
437
437
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
+
438
505
/// Macro for generating tests for IndexedDB implementation of
439
506
/// [`EventCacheStore`]
440
507
///
@@ -547,6 +614,13 @@ macro_rules! indexeddb_event_cache_store_integration_tests {
547
614
$crate:: event_cache_store:: integration_tests:: test_linked_chunk_update_is_a_transaction( store)
548
615
. await
549
616
}
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
+ }
550
624
}
551
625
} ;
552
626
}
0 commit comments