@@ -1718,7 +1718,7 @@ mod tests {
1718
1718
use crate :: test_utils:: logged_in_client;
1719
1719
1720
1720
#[ async_test]
1721
- async fn test_event_with_edit_relation ( ) {
1721
+ async fn test_find_event_by_id_with_edit_relation ( ) {
1722
1722
let original_id = event_id ! ( "$original" ) ;
1723
1723
let related_id = event_id ! ( "$related" ) ;
1724
1724
let room_id = room_id ! ( "!galette:saucisse.bzh" ) ;
@@ -1740,7 +1740,7 @@ mod tests {
1740
1740
}
1741
1741
1742
1742
#[ async_test]
1743
- async fn test_event_with_thread_reply_relation ( ) {
1743
+ async fn test_find_event_by_id_with_thread_reply_relation ( ) {
1744
1744
let original_id = event_id ! ( "$original" ) ;
1745
1745
let related_id = event_id ! ( "$related" ) ;
1746
1746
let room_id = room_id ! ( "!galette:saucisse.bzh" ) ;
@@ -1756,7 +1756,7 @@ mod tests {
1756
1756
}
1757
1757
1758
1758
#[ async_test]
1759
- async fn test_event_with_reaction_relation ( ) {
1759
+ async fn test_find_event_by_id_with_reaction_relation ( ) {
1760
1760
let original_id = event_id ! ( "$original" ) ;
1761
1761
let related_id = event_id ! ( "$related" ) ;
1762
1762
let room_id = room_id ! ( "!galette:saucisse.bzh" ) ;
@@ -1772,7 +1772,7 @@ mod tests {
1772
1772
}
1773
1773
1774
1774
#[ async_test]
1775
- async fn test_event_with_poll_response_relation ( ) {
1775
+ async fn test_find_event_by_id_with_poll_response_relation ( ) {
1776
1776
let original_id = event_id ! ( "$original" ) ;
1777
1777
let related_id = event_id ! ( "$related" ) ;
1778
1778
let room_id = room_id ! ( "!galette:saucisse.bzh" ) ;
@@ -1790,7 +1790,7 @@ mod tests {
1790
1790
}
1791
1791
1792
1792
#[ async_test]
1793
- async fn test_event_with_poll_end_relation ( ) {
1793
+ async fn test_find_event_by_id_with_poll_end_relation ( ) {
1794
1794
let original_id = event_id ! ( "$original" ) ;
1795
1795
let related_id = event_id ! ( "$related" ) ;
1796
1796
let room_id = room_id ! ( "!galette:saucisse.bzh" ) ;
@@ -1808,7 +1808,7 @@ mod tests {
1808
1808
}
1809
1809
1810
1810
#[ async_test]
1811
- async fn test_event_with_filtered_relationships ( ) {
1811
+ async fn test_find_event_by_id_with_filtered_relationships ( ) {
1812
1812
let original_id = event_id ! ( "$original" ) ;
1813
1813
let related_id = event_id ! ( "$related" ) ;
1814
1814
let associated_related_id = event_id ! ( "$recursive_related" ) ;
@@ -1868,7 +1868,7 @@ mod tests {
1868
1868
}
1869
1869
1870
1870
#[ async_test]
1871
- async fn test_event_with_recursive_relation ( ) {
1871
+ async fn test_find_event_by_id_with_recursive_relation ( ) {
1872
1872
let original_id = event_id ! ( "$original" ) ;
1873
1873
let related_id = event_id ! ( "$related" ) ;
1874
1874
let associated_related_id = event_id ! ( "$recursive_related" ) ;
@@ -1987,7 +1987,7 @@ mod timed_tests {
1987
1987
use ruma:: {
1988
1988
event_id,
1989
1989
events:: { AnySyncMessageLikeEvent , AnySyncTimelineEvent } ,
1990
- room_id, user_id,
1990
+ room_id, user_id, OwnedUserId ,
1991
1991
} ;
1992
1992
use tokio:: task:: yield_now;
1993
1993
@@ -2983,4 +2983,102 @@ mod timed_tests {
2983
2983
assert_eq ! ( events3. len( ) , 1 ) ;
2984
2984
assert_eq ! ( events3[ 0 ] . event_id( ) . as_deref( ) , Some ( evid2) ) ;
2985
2985
}
2986
+
2987
+ #[ async_test]
2988
+ async fn test_rfind_event_in_memory_by ( ) {
2989
+ let user_id = user_id ! ( "@mnt_io:matrix.org" ) ;
2990
+ let room_id = room_id ! ( "!raclette:patate.ch" ) ;
2991
+ let client = MockClientBuilder :: new ( "http://localhost" . to_owned ( ) ) . build ( ) . await ;
2992
+
2993
+ let event_factory = EventFactory :: new ( ) . room ( room_id) ;
2994
+
2995
+ let event_id_0 = event_id ! ( "$ev0" ) ;
2996
+ let event_id_1 = event_id ! ( "$ev1" ) ;
2997
+ let event_id_2 = event_id ! ( "$ev2" ) ;
2998
+ let event_id_3 = event_id ! ( "$ev3" ) ;
2999
+
3000
+ let event_0 =
3001
+ event_factory. text_msg ( "hello" ) . sender ( * BOB ) . event_id ( event_id_0) . into_event ( ) ;
3002
+ let event_1 =
3003
+ event_factory. text_msg ( "world" ) . sender ( * ALICE ) . event_id ( event_id_1) . into_event ( ) ;
3004
+ let event_2 = event_factory. text_msg ( "!" ) . sender ( * ALICE ) . event_id ( event_id_2) . into_event ( ) ;
3005
+ let event_3 =
3006
+ event_factory. text_msg ( "eh!" ) . sender ( user_id) . event_id ( event_id_3) . into_event ( ) ;
3007
+
3008
+ // Fill the event cache store with an initial linked chunk of 2 chunks, and 4
3009
+ // events.
3010
+ {
3011
+ let store = client. event_cache_store ( ) ;
3012
+ let store = store. lock ( ) . await . unwrap ( ) ;
3013
+ store
3014
+ . handle_linked_chunk_updates (
3015
+ LinkedChunkId :: Room ( room_id) ,
3016
+ vec ! [
3017
+ Update :: NewItemsChunk {
3018
+ previous: None ,
3019
+ new: ChunkIdentifier :: new( 0 ) ,
3020
+ next: None ,
3021
+ } ,
3022
+ Update :: PushItems {
3023
+ at: Position :: new( ChunkIdentifier :: new( 0 ) , 0 ) ,
3024
+ items: vec![ event_3] ,
3025
+ } ,
3026
+ Update :: NewItemsChunk {
3027
+ previous: Some ( ChunkIdentifier :: new( 0 ) ) ,
3028
+ new: ChunkIdentifier :: new( 1 ) ,
3029
+ next: None ,
3030
+ } ,
3031
+ Update :: PushItems {
3032
+ at: Position :: new( ChunkIdentifier :: new( 1 ) , 0 ) ,
3033
+ items: vec![ event_0, event_1, event_2] ,
3034
+ } ,
3035
+ ] ,
3036
+ )
3037
+ . await
3038
+ . unwrap ( ) ;
3039
+ }
3040
+
3041
+ let event_cache = client. event_cache ( ) ;
3042
+ event_cache. subscribe ( ) . unwrap ( ) ;
3043
+
3044
+ client. base_client ( ) . get_or_create_room ( room_id, matrix_sdk_base:: RoomState :: Joined ) ;
3045
+ let room = client. get_room ( room_id) . unwrap ( ) ;
3046
+ let ( room_event_cache, _drop_handles) = room. event_cache ( ) . await . unwrap ( ) ;
3047
+
3048
+ // Look for an event from `BOB`: it must be `event_0`.
3049
+ assert_matches ! (
3050
+ room_event_cache
3051
+ . rfind_event_in_memory_by( |event| {
3052
+ event. raw( ) . get_field:: <OwnedUserId >( "sender" ) . unwrap( ) . as_deref( ) == Some ( * BOB )
3053
+ } )
3054
+ . await ,
3055
+ Some ( event) => {
3056
+ assert_eq!( event. event_id( ) . as_deref( ) , Some ( event_id_0) ) ;
3057
+ }
3058
+ ) ;
3059
+
3060
+ // Look for an event from `ALICE`: it must be `event_2`, right before `event_1`
3061
+ // because events are looked for in reverse order.
3062
+ assert_matches ! (
3063
+ room_event_cache
3064
+ . rfind_event_in_memory_by( |event| {
3065
+ event. raw( ) . get_field:: <OwnedUserId >( "sender" ) . unwrap( ) . as_deref( ) == Some ( * ALICE )
3066
+ } )
3067
+ . await ,
3068
+ Some ( event) => {
3069
+ assert_eq!( event. event_id( ) . as_deref( ) , Some ( event_id_2) ) ;
3070
+ }
3071
+ ) ;
3072
+
3073
+ // Look for an event that is inside the storage, but not loaded.
3074
+ assert ! ( room_event_cache
3075
+ . rfind_event_in_memory_by( |event| {
3076
+ event. raw( ) . get_field:: <OwnedUserId >( "sender" ) . unwrap( ) . as_deref( ) == Some ( user_id)
3077
+ } )
3078
+ . await
3079
+ . is_none( ) ) ;
3080
+
3081
+ // Look for an event that doesn't exist.
3082
+ assert ! ( room_event_cache. rfind_event_in_memory_by( |_| false ) . await . is_none( ) ) ;
3083
+ }
2986
3084
}
0 commit comments