Skip to content

Commit e42be87

Browse files
committed
test(event cache): add tests for save_event() and find_event_relations()
And fix the sql backend \o/
1 parent 524040b commit e42be87

File tree

2 files changed

+161
-3
lines changed

2 files changed

+161
-3
lines changed

crates/matrix-sdk-base/src/event_cache/store/integration_tests.rs

Lines changed: 153 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,15 @@ use matrix_sdk_common::{
2525
};
2626
use matrix_sdk_test::{event_factory::EventFactory, ALICE, DEFAULT_TEST_ROOM_ID};
2727
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,
3037
};
3138

3239
use super::{media::IgnoreMediaRetentionPolicy, DynEventCacheStore};
@@ -139,6 +146,12 @@ pub trait EventCacheStoreIntegrationTests {
139146

140147
/// Test that an event can be found or not.
141148
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);
142155
}
143156

144157
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
@@ -876,6 +889,130 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
876889
.await
877890
.expect("failed to query for finding an event")
878891
.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());
8791016
}
8801017
}
8811018

@@ -980,6 +1117,20 @@ macro_rules! event_cache_store_integration_tests {
9801117
get_event_cache_store().await.unwrap().into_event_cache_store();
9811118
event_cache_store.test_find_event().await;
9821119
}
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+
}
9831134
}
9841135
};
9851136
}

crates/matrix-sdk-sqlite/src/event_cache_store.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,14 @@ impl EventCacheStore for SqliteEventCacheStore {
993993
.with_transaction(move |txn| -> Result<_> {
994994
let filter_query = if let Some(filters) = compute_filters_string(filters.as_deref())
995995
{
996-
format!(" AND rel_type IN ({})", filters.join(" AND "))
996+
format!(
997+
" AND rel_type IN ({})",
998+
filters
999+
.into_iter()
1000+
.map(|f| format!(r#""{f}""#))
1001+
.collect::<Vec<_>>()
1002+
.join(r#", "#)
1003+
)
9971004
} else {
9981005
"".to_owned()
9991006
};

0 commit comments

Comments
 (0)