1414
1515//! Trait and macro of integration tests for `EventCacheStore` implementations.
1616
17- use std:: { collections:: BTreeMap , sync:: Arc } ;
17+ use std:: {
18+ collections:: { BTreeMap , BTreeSet } ,
19+ sync:: Arc ,
20+ } ;
1821
1922use assert_matches:: assert_matches;
2023use assert_matches2:: assert_let;
2124use matrix_sdk_common:: {
2225 deserialized_responses:: {
2326 AlgorithmInfo , DecryptedRoomEvent , EncryptionInfo , TimelineEvent , TimelineEventKind ,
24- VerificationState ,
27+ UnableToDecryptInfo , UnableToDecryptReason , VerificationState ,
2528 } ,
2629 linked_chunk:: {
2730 ChunkContent , ChunkIdentifier as CId , LinkedChunkId , Position , Update , lazy_loader,
@@ -49,6 +52,24 @@ pub fn make_test_event(room_id: &RoomId, content: &str) -> TimelineEvent {
4952 make_test_event_with_event_id ( room_id, content, None )
5053}
5154
55+ /// Create a `m.room.encrypted` test event with all data filled, for testing
56+ /// that linked chunk correctly stores event data for encrypted events.
57+ pub fn make_encrypted_test_event ( room_id : & RoomId , session_id : & str ) -> TimelineEvent {
58+ let device_id = "DEVICEID" ;
59+ let builder = EventFactory :: new ( )
60+ . encrypted ( "" , "curve_key" , device_id, session_id)
61+ . room ( room_id)
62+ . sender ( * ALICE ) ;
63+
64+ let event = builder. into_raw ( ) ;
65+ let utd_info = UnableToDecryptInfo {
66+ session_id : Some ( session_id. to_owned ( ) ) ,
67+ reason : UnableToDecryptReason :: MissingMegolmSession { withheld_code : None } ,
68+ } ;
69+
70+ TimelineEvent :: from_utd ( event, utd_info)
71+ }
72+
5273/// Same as [`make_test_event`], with an extra event id.
5374pub fn make_test_event_with_event_id (
5475 room_id : & RoomId ,
@@ -144,6 +165,9 @@ pub trait EventCacheStoreIntegrationTests {
144165 /// Test that getting all events in a room works as expected.
145166 async fn test_get_room_events ( & self ) ;
146167
168+ /// Test that getting events in a room of a certain type works as expected.
169+ async fn test_get_room_events_filtered ( & self ) ;
170+
147171 /// Test that saving an event works as expected.
148172 async fn test_save_event ( & self ) ;
149173
@@ -962,7 +986,10 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
962986 . unwrap ( ) ;
963987
964988 // Now let's find the events.
965- let events = self . get_room_events ( room_id) . await . expect ( "failed to query for room events" ) ;
989+ let events = self
990+ . get_room_events ( room_id, None , None )
991+ . await
992+ . expect ( "failed to query for room events" ) ;
966993
967994 assert_eq ! ( events. len( ) , 2 ) ;
968995
@@ -977,6 +1004,76 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
9771004 }
9781005 }
9791006
1007+ async fn test_get_room_events_filtered ( & self ) {
1008+ macro_rules! assert_expected_events {
1009+ ( $events: expr, [ $( $item: expr) ,* $( , ) ?] ) => { {
1010+ let got_ids: BTreeSet <_> = $events. into_iter( ) . map( |ev| ev. event_id( ) . unwrap( ) ) . collect( ) ;
1011+ let expected_ids = BTreeSet :: from( [ $( $item. event_id( ) . unwrap( ) ) ,* ] ) ;
1012+
1013+ assert_eq!( got_ids, expected_ids) ;
1014+ } } ;
1015+ }
1016+
1017+ let room_id = room_id ! ( "!r0:matrix.org" ) ;
1018+ let linked_chunk_id = LinkedChunkId :: Room ( room_id) ;
1019+ let another_room_id = room_id ! ( "!r1:matrix.org" ) ;
1020+ let another_linked_chunk_id = LinkedChunkId :: Room ( another_room_id) ;
1021+
1022+ let event = |session_id : & str | make_encrypted_test_event ( room_id, session_id) ;
1023+
1024+ let first_event = event ( "session_1" ) ;
1025+ let second_event = event ( "session_2" ) ;
1026+ let third_event = event ( "session_3" ) ;
1027+ let fourth_event = make_test_event ( room_id, "It's a secret to everybody" ) ;
1028+
1029+ // Add one event in one room.
1030+ self . handle_linked_chunk_updates (
1031+ linked_chunk_id,
1032+ vec ! [
1033+ Update :: NewItemsChunk { previous: None , new: CId :: new( 0 ) , next: None } ,
1034+ Update :: PushItems {
1035+ at: Position :: new( CId :: new( 0 ) , 0 ) ,
1036+ items: vec![ first_event. clone( ) , second_event. clone( ) , fourth_event. clone( ) ] ,
1037+ } ,
1038+ ] ,
1039+ )
1040+ . await
1041+ . unwrap ( ) ;
1042+
1043+ // Add an event in a different room.
1044+ self . handle_linked_chunk_updates (
1045+ another_linked_chunk_id,
1046+ vec ! [
1047+ Update :: NewItemsChunk { previous: None , new: CId :: new( 0 ) , next: None } ,
1048+ Update :: PushItems {
1049+ at: Position :: new( CId :: new( 0 ) , 0 ) ,
1050+ items: vec![ third_event. clone( ) ] ,
1051+ } ,
1052+ ] ,
1053+ )
1054+ . await
1055+ . unwrap ( ) ;
1056+
1057+ // Now let's find all the encrypted events of the first room.
1058+ let events = self
1059+ . get_room_events ( room_id, Some ( "m.room.encrypted" ) , None )
1060+ . await
1061+ . expect ( "failed to query for room events" ) ;
1062+
1063+ assert_eq ! ( events. len( ) , 2 ) ;
1064+ assert_expected_events ! ( events, [ first_event, second_event] ) ;
1065+
1066+ // Now let's find all the encrypted events which were encrypted using the first
1067+ // session ID.
1068+ let events = self
1069+ . get_room_events ( room_id, Some ( "m.room.encrypted" ) , Some ( "session_1" ) )
1070+ . await
1071+ . expect ( "failed to query for room events" ) ;
1072+
1073+ assert_eq ! ( events. len( ) , 1 ) ;
1074+ assert_expected_events ! ( events, [ first_event] ) ;
1075+ }
1076+
9801077 async fn test_save_event ( & self ) {
9811078 let room_id = room_id ! ( "!r0:matrix.org" ) ;
9821079 let another_room_id = room_id ! ( "!r1:matrix.org" ) ;
@@ -1264,6 +1361,13 @@ macro_rules! event_cache_store_integration_tests {
12641361 event_cache_store. test_get_room_events( ) . await ;
12651362 }
12661363
1364+ #[ async_test]
1365+ async fn test_get_room_events_filtered( ) {
1366+ let event_cache_store =
1367+ get_event_cache_store( ) . await . unwrap( ) . into_event_cache_store( ) ;
1368+ event_cache_store. test_get_room_events_filtered( ) . await ;
1369+ }
1370+
12671371 #[ async_test]
12681372 async fn test_save_event( ) {
12691373 let event_cache_store =
0 commit comments