Skip to content

Commit 76d1b6e

Browse files
committed
test(base): Add test to populate a store
1 parent 94e5ee7 commit 76d1b6e

File tree

6 files changed

+520
-8
lines changed

6 files changed

+520
-8
lines changed

crates/matrix-sdk-base/src/store/memory_store.rs

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ mod test {
613613
use matrix_sdk_test::{async_test, test_json};
614614
use ruma::{
615615
api::client::r0::media::get_content_thumbnail::Method,
616-
events::{AnyEphemeralRoomEventContent, AnySyncEphemeralRoomEvent},
616+
events::{AnyEphemeralRoomEventContent, AnySyncEphemeralRoomEvent, EventType},
617617
mxc_uri,
618618
receipt::ReceiptType,
619619
uint,
@@ -623,7 +623,9 @@ mod test {
623623
use super::{MemoryStore, StateChanges};
624624
use crate::{
625625
media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType},
626-
store::test::{first_receipt_event_id, room_id, second_receipt_event_id, user_id},
626+
store::test::{
627+
first_receipt_event_id, populated_store, room_id, second_receipt_event_id, user_id,
628+
},
627629
};
628630

629631
#[async_test]
@@ -754,4 +756,45 @@ mod test {
754756
assert!(store.get_media_content(&request_file).await.unwrap().is_none());
755757
assert!(store.get_media_content(&request_thumbnail).await.unwrap().is_none());
756758
}
759+
760+
#[async_test]
761+
async fn test_populate_store() {
762+
let room_id = room_id();
763+
let user_id = user_id();
764+
765+
let store = populated_store(Box::new(MemoryStore::new())).await.unwrap();
766+
767+
assert!(store.get_sync_token().await.unwrap().is_some());
768+
assert!(store.get_presence_event(user_id).await.unwrap().is_some());
769+
assert_eq!(store.get_room_infos().await.unwrap().len(), 2);
770+
assert_eq!(store.get_stripped_room_infos().await.unwrap().len(), 1);
771+
assert!(store.get_account_data_event(EventType::PushRules).await.unwrap().is_some());
772+
773+
assert!(store.get_state_event(room_id, EventType::RoomName, "").await.unwrap().is_some());
774+
assert_eq!(store.get_state_events(room_id, EventType::RoomTopic).await.unwrap().len(), 1);
775+
assert!(store.get_profile(room_id, user_id).await.unwrap().is_some());
776+
assert!(store.get_member_event(room_id, user_id).await.unwrap().is_some());
777+
assert_eq!(store.get_user_ids(room_id).await.unwrap().len(), 2);
778+
assert_eq!(store.get_invited_user_ids(room_id).await.unwrap().len(), 1);
779+
assert_eq!(store.get_joined_user_ids(room_id).await.unwrap().len(), 1);
780+
assert_eq!(store.get_users_with_display_name(room_id, "example").await.unwrap().len(), 2);
781+
assert!(store
782+
.get_room_account_data_event(room_id, EventType::Tag)
783+
.await
784+
.unwrap()
785+
.is_some());
786+
assert!(store
787+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
788+
.await
789+
.unwrap()
790+
.is_some());
791+
assert_eq!(
792+
store
793+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_receipt_event_id())
794+
.await
795+
.unwrap()
796+
.len(),
797+
1
798+
);
799+
}
757800
}

crates/matrix-sdk-base/src/store/mod.rs

Lines changed: 161 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,21 +581,181 @@ impl StateChanges {
581581

582582
#[cfg(test)]
583583
mod test {
584-
use ruma::{event_id, room_id, user_id, EventId, RoomId, UserId};
584+
use std::collections::{BTreeMap, BTreeSet};
585+
586+
use matrix_sdk_common::deserialized_responses::{MemberEvent, StrippedMemberEvent};
587+
use matrix_sdk_test::test_json;
588+
use ruma::{
589+
device_id, event_id,
590+
events::{
591+
presence::PresenceEvent, AnyEphemeralRoomEventContent, AnyGlobalAccountDataEvent,
592+
AnyRoomAccountDataEvent, AnyStrippedStateEvent, AnySyncEphemeralRoomEvent,
593+
AnySyncStateEvent, EventContent,
594+
},
595+
room_id,
596+
serde::Raw,
597+
user_id, EventId, RoomId, UserId,
598+
};
599+
use serde_json::Value as JsonValue;
600+
601+
use super::{Result, StateChanges, StateStore, Store};
602+
use crate::{RoomType, Session};
585603

586604
pub(crate) fn user_id() -> &'static UserId {
587605
user_id!("@example:localhost")
588606
}
589607

608+
pub(crate) fn invited_user_id() -> &'static UserId {
609+
user_id!("@invited:localhost")
610+
}
611+
590612
pub(crate) fn room_id() -> &'static RoomId {
591613
room_id!("!test:localhost")
592614
}
593615

616+
pub(crate) fn stripped_room_id() -> &'static RoomId {
617+
room_id!("!stripped:localhost")
618+
}
619+
594620
pub(crate) fn first_receipt_event_id() -> &'static EventId {
595621
event_id!("$example")
596622
}
597623

598624
pub(crate) fn second_receipt_event_id() -> &'static EventId {
599625
event_id!("$other")
600626
}
627+
628+
/// Populate the given `StateStore`.
629+
pub(crate) async fn populated_store(inner: Box<dyn StateStore>) -> Result<Store> {
630+
let mut changes = StateChanges::default();
631+
let store = Store::new(inner);
632+
633+
let user_id = user_id();
634+
let invited_user_id = invited_user_id();
635+
let room_id = room_id();
636+
let stripped_room_id = stripped_room_id();
637+
let device_id = device_id!("device");
638+
639+
let session = Session {
640+
access_token: "token".to_string(),
641+
user_id: user_id.to_owned(),
642+
device_id: device_id.to_owned(),
643+
};
644+
store.restore_session(session).await.unwrap();
645+
646+
changes.sync_token = Some("t392-516_47314_0_7_1_1_1_11444_1".to_string());
647+
648+
let presence_json: &JsonValue = &test_json::PRESENCE;
649+
let presence_raw =
650+
serde_json::from_value::<Raw<PresenceEvent>>(presence_json.clone()).unwrap();
651+
let presence_event = presence_raw.deserialize().unwrap();
652+
changes.add_presence_event(presence_event, presence_raw);
653+
654+
let pushrules_json: &JsonValue = &test_json::PUSH_RULES;
655+
let pushrules_raw =
656+
serde_json::from_value::<Raw<AnyGlobalAccountDataEvent>>(pushrules_json.clone())
657+
.unwrap();
658+
let pushrules_event = pushrules_raw.deserialize().unwrap();
659+
changes.add_account_data(pushrules_event, pushrules_raw);
660+
661+
let mut room = store.get_or_create_room(room_id, RoomType::Joined).await.clone_info();
662+
room.mark_as_left();
663+
664+
let tag_json: &JsonValue = &test_json::TAG;
665+
let tag_raw =
666+
serde_json::from_value::<Raw<AnyRoomAccountDataEvent>>(tag_json.clone()).unwrap();
667+
let tag_event = tag_raw.deserialize().unwrap();
668+
changes.add_room_account_data(room_id, tag_event, tag_raw);
669+
670+
let name_json: &JsonValue = &test_json::NAME;
671+
let name_raw = serde_json::from_value::<Raw<AnySyncStateEvent>>(name_json.clone()).unwrap();
672+
let name_event = name_raw.deserialize().unwrap();
673+
room.handle_state_event(&name_event.content());
674+
changes.add_state_event(room_id, name_event, name_raw);
675+
676+
let topic_json: &JsonValue = &test_json::TOPIC;
677+
let topic_raw =
678+
serde_json::from_value::<Raw<AnySyncStateEvent>>(topic_json.clone()).unwrap();
679+
let topic_event = topic_raw.deserialize().unwrap();
680+
room.handle_state_event(&topic_event.content());
681+
changes.add_state_event(room_id, topic_event, topic_raw);
682+
683+
let mut room_ambiguity_map = BTreeMap::new();
684+
let mut room_profiles = BTreeMap::new();
685+
let mut room_members = BTreeMap::new();
686+
687+
let member_json: &JsonValue = &test_json::MEMBER;
688+
let member_event = serde_json::from_value::<MemberEvent>(member_json.clone()).unwrap();
689+
let member_event_content = member_event.content.clone();
690+
room_ambiguity_map.insert(
691+
member_event_content.displayname.clone().unwrap(),
692+
BTreeSet::from([user_id.to_owned()]),
693+
);
694+
room_profiles.insert(user_id.to_owned(), member_event.content.clone());
695+
room_members.insert(user_id.to_owned(), member_event);
696+
697+
let member_state_raw =
698+
serde_json::from_value::<Raw<AnySyncStateEvent>>(member_json.clone()).unwrap();
699+
let member_state_event = member_state_raw.deserialize().unwrap();
700+
changes.add_state_event(room_id, member_state_event, member_state_raw);
701+
702+
let invited_member_json: &JsonValue = &test_json::MEMBER_INVITE;
703+
let invited_member_event =
704+
serde_json::from_value::<MemberEvent>(invited_member_json.clone()).unwrap();
705+
room_ambiguity_map
706+
.entry(member_event_content.displayname.clone().unwrap())
707+
.or_default()
708+
.insert(invited_user_id.to_owned());
709+
room_profiles.insert(invited_user_id.to_owned(), invited_member_event.content.clone());
710+
room_members.insert(invited_user_id.to_owned(), invited_member_event);
711+
712+
let invited_member_state_raw =
713+
serde_json::from_value::<Raw<AnySyncStateEvent>>(invited_member_json.clone()).unwrap();
714+
let invited_member_state_event = invited_member_state_raw.deserialize().unwrap();
715+
changes.add_state_event(room_id, invited_member_state_event, invited_member_state_raw);
716+
717+
let receipt_json: &JsonValue = &test_json::READ_RECEIPT;
718+
let receipt_event =
719+
serde_json::from_value::<AnySyncEphemeralRoomEvent>(receipt_json.clone()).unwrap();
720+
let receipt_content = match receipt_event.content() {
721+
AnyEphemeralRoomEventContent::Receipt(content) => content,
722+
_ => panic!(),
723+
};
724+
changes.add_receipts(room_id, receipt_content);
725+
726+
changes.ambiguity_maps.insert(room_id.to_owned(), room_ambiguity_map);
727+
changes.profiles.insert(room_id.to_owned(), room_profiles);
728+
changes.members.insert(room_id.to_owned(), room_members);
729+
changes.add_room(room);
730+
731+
let mut stripped_room =
732+
store.get_or_create_stripped_room(stripped_room_id).await.clone_info();
733+
734+
let stripped_name_json: &JsonValue = &test_json::NAME_STRIPPED;
735+
let stripped_name_raw =
736+
serde_json::from_value::<Raw<AnyStrippedStateEvent>>(stripped_name_json.clone())
737+
.unwrap();
738+
let stripped_name_event = stripped_name_raw.deserialize().unwrap();
739+
stripped_room.handle_state_event(&stripped_name_event.content());
740+
changes.stripped_state.insert(
741+
stripped_room_id.to_owned(),
742+
BTreeMap::from([(
743+
stripped_name_event.content().event_type().to_owned(),
744+
BTreeMap::from([(
745+
stripped_name_event.state_key().to_owned(),
746+
stripped_name_raw.clone(),
747+
)]),
748+
)]),
749+
);
750+
changes.invited_room_info.insert(stripped_room_id.to_owned(), stripped_room.clone());
751+
changes.add_stripped_room(stripped_room);
752+
753+
let stripped_member_json: &JsonValue = &test_json::MEMBER_STRIPPED;
754+
let stripped_member_event =
755+
serde_json::from_value::<StrippedMemberEvent>(stripped_member_json.clone()).unwrap();
756+
changes.add_stripped_member(stripped_room_id, stripped_member_event);
757+
758+
store.save_changes(&changes).await?;
759+
Ok(store)
760+
}
601761
}

crates/matrix-sdk-base/src/store/sled_store/mod.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1127,7 +1127,9 @@ mod test {
11271127
use crate::{
11281128
deserialized_responses::MemberEvent,
11291129
media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType},
1130-
store::test::{first_receipt_event_id, room_id, second_receipt_event_id, user_id},
1130+
store::test::{
1131+
first_receipt_event_id, populated_store, room_id, second_receipt_event_id, user_id,
1132+
},
11311133
StateStore,
11321134
};
11331135

@@ -1323,4 +1325,45 @@ mod test {
13231325

13241326
Ok(())
13251327
}
1328+
1329+
#[async_test]
1330+
async fn test_populate_store() {
1331+
let room_id = room_id();
1332+
let user_id = user_id();
1333+
1334+
let store = populated_store(Box::new(SledStore::open().unwrap())).await.unwrap();
1335+
1336+
assert!(store.get_sync_token().await.unwrap().is_some());
1337+
assert!(store.get_presence_event(user_id).await.unwrap().is_some());
1338+
assert_eq!(store.get_room_infos().await.unwrap().len(), 2);
1339+
assert_eq!(store.get_stripped_room_infos().await.unwrap().len(), 1);
1340+
assert!(store.get_account_data_event(EventType::PushRules).await.unwrap().is_some());
1341+
1342+
assert!(store.get_state_event(room_id, EventType::RoomName, "").await.unwrap().is_some());
1343+
assert_eq!(store.get_state_events(room_id, EventType::RoomTopic).await.unwrap().len(), 1);
1344+
assert!(store.get_profile(room_id, user_id).await.unwrap().is_some());
1345+
assert!(store.get_member_event(room_id, user_id).await.unwrap().is_some());
1346+
assert_eq!(store.get_user_ids(room_id).await.unwrap().len(), 2);
1347+
assert_eq!(store.get_invited_user_ids(room_id).await.unwrap().len(), 1);
1348+
assert_eq!(store.get_joined_user_ids(room_id).await.unwrap().len(), 1);
1349+
assert_eq!(store.get_users_with_display_name(room_id, "example").await.unwrap().len(), 2);
1350+
assert!(store
1351+
.get_room_account_data_event(room_id, EventType::Tag)
1352+
.await
1353+
.unwrap()
1354+
.is_some());
1355+
assert!(store
1356+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
1357+
.await
1358+
.unwrap()
1359+
.is_some());
1360+
assert_eq!(
1361+
store
1362+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_receipt_event_id())
1363+
.await
1364+
.unwrap()
1365+
.len(),
1366+
1
1367+
);
1368+
}
13261369
}

crates/matrix-sdk-test/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ pub enum EventsJson {
2626
HistoryVisibility,
2727
JoinRules,
2828
Member,
29+
MemberInvite,
2930
MemberNameChange,
3031
MessageEmote,
3132
MessageNotice,
3233
MessageText,
3334
Name,
3435
PowerLevels,
36+
PushRules,
3537
Presence,
3638
ReadReceipt,
3739
ReadReceiptOther,
@@ -122,9 +124,10 @@ impl EventBuilder {
122124
}
123125

124126
/// Add an event to the room events `Vec`.
125-
#[allow(clippy::match_single_binding, unused)]
127+
#[allow(unused)]
126128
pub fn add_account(&mut self, json: EventsJson) -> &mut Self {
127129
let val: &JsonValue = match json {
130+
EventsJson::PushRules => &test_json::PUSH_RULES,
128131
_ => panic!("unknown account event {:?}", json),
129132
};
130133

@@ -137,6 +140,7 @@ impl EventBuilder {
137140
pub fn add_room_event(&mut self, json: EventsJson) -> &mut Self {
138141
let val: &JsonValue = match json {
139142
EventsJson::Member => &test_json::MEMBER,
143+
EventsJson::MemberInvite => &test_json::MEMBER_INVITE,
140144
EventsJson::MemberNameChange => &test_json::MEMBER_NAME_CHANGE,
141145
EventsJson::PowerLevels => &test_json::POWER_LEVELS,
142146
_ => panic!("unknown room event json {:?}", json),

0 commit comments

Comments
 (0)