@@ -25,8 +25,15 @@ use matrix_sdk_common::{
25
25
} ;
26
26
use matrix_sdk_test:: { event_factory:: EventFactory , ALICE , DEFAULT_TEST_ROOM_ID } ;
27
27
use ruma:: {
28
- api:: client:: media:: get_content_thumbnail:: v3:: Method , events:: room:: MediaSource , mxc_uri,
29
- push:: Action , room_id, uint, EventId , RoomId ,
28
+ api:: client:: media:: get_content_thumbnail:: v3:: Method ,
29
+ event_id,
30
+ events:: {
31
+ relation:: RelationType ,
32
+ room:: { message:: RoomMessageEventContentWithoutRelation , MediaSource } ,
33
+ } ,
34
+ mxc_uri,
35
+ push:: Action ,
36
+ room_id, uint, EventId , RoomId ,
30
37
} ;
31
38
32
39
use super :: { media:: IgnoreMediaRetentionPolicy , DynEventCacheStore } ;
@@ -139,6 +146,12 @@ pub trait EventCacheStoreIntegrationTests {
139
146
140
147
/// Test that an event can be found or not.
141
148
async fn test_find_event ( & self ) ;
149
+
150
+ /// Test that finding event relations works as expected.
151
+ async fn test_find_event_relations ( & self ) ;
152
+
153
+ /// Test that saving an event works as expected.
154
+ async fn test_save_event ( & self ) ;
142
155
}
143
156
144
157
#[ cfg_attr( target_arch = "wasm32" , async_trait( ?Send ) ) ]
@@ -876,6 +889,130 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
876
889
. await
877
890
. expect( "failed to query for finding an event" )
878
891
. is_none( ) ) ;
892
+
893
+ // Clearing the rooms also clears the event's storage.
894
+ self . clear_all_rooms_chunks ( ) . await . expect ( "failed to clear all rooms chunks" ) ;
895
+ assert ! ( self
896
+ . find_event( room_id, event_comte. event_id( ) . unwrap( ) . as_ref( ) )
897
+ . await
898
+ . expect( "failed to query for finding an event" )
899
+ . is_none( ) ) ;
900
+ }
901
+
902
+ async fn test_find_event_relations ( & self ) {
903
+ let room_id = room_id ! ( "!r0:matrix.org" ) ;
904
+ let another_room_id = room_id ! ( "!r1:matrix.org" ) ;
905
+
906
+ let f = EventFactory :: new ( ) . room ( room_id) . sender ( * ALICE ) ;
907
+
908
+ // Create event and related events for the first room.
909
+ let eid1 = event_id ! ( "$event1:matrix.org" ) ;
910
+ let e1 = f. text_msg ( "comter" ) . event_id ( eid1) . into_event ( ) ;
911
+
912
+ let edit_eid1 = event_id ! ( "$edit_event1:matrix.org" ) ;
913
+ let edit_e1 = f
914
+ . text_msg ( "* comté" )
915
+ . event_id ( edit_eid1)
916
+ . edit ( eid1, RoomMessageEventContentWithoutRelation :: text_plain ( "comté" ) )
917
+ . into_event ( ) ;
918
+
919
+ let reaction_eid1 = event_id ! ( "$reaction_event1:matrix.org" ) ;
920
+ let reaction_e1 = f. reaction ( eid1, "👍" ) . event_id ( reaction_eid1) . into_event ( ) ;
921
+
922
+ let eid2 = event_id ! ( "$event2:matrix.org" ) ;
923
+ let e2 = f. text_msg ( "galette saucisse" ) . event_id ( eid2) . into_event ( ) ;
924
+
925
+ // Create events for the second room.
926
+ let f = f. room ( another_room_id) ;
927
+
928
+ let eid3 = event_id ! ( "$event3:matrix.org" ) ;
929
+ let e3 = f. text_msg ( "gruyère" ) . event_id ( eid3) . into_event ( ) ;
930
+
931
+ let reaction_eid3 = event_id ! ( "$reaction_event3:matrix.org" ) ;
932
+ let reaction_e3 = f. reaction ( eid3, "👍" ) . event_id ( reaction_eid3) . into_event ( ) ;
933
+
934
+ // Save All The Things!
935
+ self . save_event ( room_id, e1) . await . unwrap ( ) ;
936
+ self . save_event ( room_id, edit_e1) . await . unwrap ( ) ;
937
+ self . save_event ( room_id, reaction_e1) . await . unwrap ( ) ;
938
+ self . save_event ( room_id, e2) . await . unwrap ( ) ;
939
+ self . save_event ( another_room_id, e3) . await . unwrap ( ) ;
940
+ self . save_event ( another_room_id, reaction_e3) . await . unwrap ( ) ;
941
+
942
+ // Finding relations without a filter returns all of them.
943
+ let relations = self . find_event_relations ( room_id, eid1, None ) . await . unwrap ( ) ;
944
+ assert_eq ! ( relations. len( ) , 2 ) ;
945
+ assert ! ( relations. iter( ) . any( |r| r. event_id( ) . as_deref( ) == Some ( edit_eid1) ) ) ;
946
+ assert ! ( relations. iter( ) . any( |r| r. event_id( ) . as_deref( ) == Some ( reaction_eid1) ) ) ;
947
+
948
+ // Finding relations with a filter only returns a subset.
949
+ let relations = self
950
+ . find_event_relations ( room_id, eid1, Some ( & [ RelationType :: Replacement ] ) )
951
+ . await
952
+ . unwrap ( ) ;
953
+ assert_eq ! ( relations. len( ) , 1 ) ;
954
+ assert_eq ! ( relations[ 0 ] . event_id( ) . as_deref( ) , Some ( edit_eid1) ) ;
955
+
956
+ let relations = self
957
+ . find_event_relations (
958
+ room_id,
959
+ eid1,
960
+ Some ( & [ RelationType :: Replacement , RelationType :: Annotation ] ) ,
961
+ )
962
+ . await
963
+ . unwrap ( ) ;
964
+ assert_eq ! ( relations. len( ) , 2 ) ;
965
+ assert ! ( relations. iter( ) . any( |r| r. event_id( ) . as_deref( ) == Some ( edit_eid1) ) ) ;
966
+ assert ! ( relations. iter( ) . any( |r| r. event_id( ) . as_deref( ) == Some ( reaction_eid1) ) ) ;
967
+
968
+ // We can't find relations using the wrong room.
969
+ let relations = self
970
+ . find_event_relations ( another_room_id, eid1, Some ( & [ RelationType :: Replacement ] ) )
971
+ . await
972
+ . unwrap ( ) ;
973
+ assert ! ( relations. is_empty( ) ) ;
974
+ }
975
+
976
+ async fn test_save_event ( & self ) {
977
+ let room_id = room_id ! ( "!r0:matrix.org" ) ;
978
+ let another_room_id = room_id ! ( "!r1:matrix.org" ) ;
979
+
980
+ let event = |msg : & str | make_test_event ( room_id, msg) ;
981
+ let event_comte = event ( "comté" ) ;
982
+ let event_gruyere = event ( "gruyère" ) ;
983
+
984
+ // Add one event in one room.
985
+ self . save_event ( room_id, event_comte. clone ( ) ) . await . unwrap ( ) ;
986
+
987
+ // Add another event in another room.
988
+ self . save_event ( another_room_id, event_gruyere. clone ( ) ) . await . unwrap ( ) ;
989
+
990
+ // Events can be found, when searched in their own rooms.
991
+ let event = self
992
+ . find_event ( room_id, event_comte. event_id ( ) . unwrap ( ) . as_ref ( ) )
993
+ . await
994
+ . expect ( "failed to query for finding an event" )
995
+ . expect ( "failed to find an event" ) ;
996
+ assert_eq ! ( event. event_id( ) , event_comte. event_id( ) ) ;
997
+
998
+ let event = self
999
+ . find_event ( another_room_id, event_gruyere. event_id ( ) . unwrap ( ) . as_ref ( ) )
1000
+ . await
1001
+ . expect ( "failed to query for finding an event" )
1002
+ . expect ( "failed to find an event" ) ;
1003
+ assert_eq ! ( event. event_id( ) , event_gruyere. event_id( ) ) ;
1004
+
1005
+ // But they won't be returned when searching in the wrong room.
1006
+ assert ! ( self
1007
+ . find_event( another_room_id, event_comte. event_id( ) . unwrap( ) . as_ref( ) )
1008
+ . await
1009
+ . expect( "failed to query for finding an event" )
1010
+ . is_none( ) ) ;
1011
+ assert ! ( self
1012
+ . find_event( room_id, event_gruyere. event_id( ) . unwrap( ) . as_ref( ) )
1013
+ . await
1014
+ . expect( "failed to query for finding an event" )
1015
+ . is_none( ) ) ;
879
1016
}
880
1017
}
881
1018
@@ -980,6 +1117,20 @@ macro_rules! event_cache_store_integration_tests {
980
1117
get_event_cache_store( ) . await . unwrap( ) . into_event_cache_store( ) ;
981
1118
event_cache_store. test_find_event( ) . await ;
982
1119
}
1120
+
1121
+ #[ async_test]
1122
+ async fn test_find_event_relations( ) {
1123
+ let event_cache_store =
1124
+ get_event_cache_store( ) . await . unwrap( ) . into_event_cache_store( ) ;
1125
+ event_cache_store. test_find_event_relations( ) . await ;
1126
+ }
1127
+
1128
+ #[ async_test]
1129
+ async fn test_save_event( ) {
1130
+ let event_cache_store =
1131
+ get_event_cache_store( ) . await . unwrap( ) . into_event_cache_store( ) ;
1132
+ event_cache_store. test_save_event( ) . await ;
1133
+ }
983
1134
}
984
1135
} ;
985
1136
}
0 commit comments