Skip to content

Commit b55362a

Browse files
committed
Merge branch 'forget'
2 parents 88b6495 + e1d78c0 commit b55362a

File tree

7 files changed

+909
-131
lines changed

7 files changed

+909
-131
lines changed

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

Lines changed: 157 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,24 @@ impl MemoryStore {
438438

439439
Ok(())
440440
}
441+
442+
async fn remove_room(&self, room_id: &RoomId) -> Result<()> {
443+
self.members.remove(room_id);
444+
self.profiles.remove(room_id);
445+
self.display_names.remove(room_id);
446+
self.joined_user_ids.remove(room_id);
447+
self.invited_user_ids.remove(room_id);
448+
self.room_info.remove(room_id);
449+
self.room_state.remove(room_id);
450+
self.room_account_data.remove(room_id);
451+
self.stripped_room_info.remove(room_id);
452+
self.stripped_room_state.remove(room_id);
453+
self.stripped_members.remove(room_id);
454+
self.room_user_receipts.remove(room_id);
455+
self.room_event_receipts.remove(room_id);
456+
457+
Ok(())
458+
}
441459
}
442460

443461
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
@@ -584,111 +602,116 @@ impl StateStore for MemoryStore {
584602
async fn remove_media_content_for_uri(&self, uri: &MxcUri) -> Result<()> {
585603
self.remove_media_content_for_uri(uri).await
586604
}
605+
606+
async fn remove_room(&self, room_id: &RoomId) -> Result<()> {
607+
self.remove_room(room_id).await
608+
}
587609
}
588610

589611
#[cfg(test)]
590612
mod test {
591-
use matrix_sdk_test::async_test;
613+
use matrix_sdk_test::{async_test, test_json};
592614
use ruma::{
593-
api::client::r0::media::get_content_thumbnail::Method, event_id, mxc_uri,
594-
receipt::ReceiptType, room_id, uint, user_id, UserId,
615+
api::client::r0::media::get_content_thumbnail::Method,
616+
events::{AnyEphemeralRoomEventContent, AnySyncEphemeralRoomEvent, EventType},
617+
mxc_uri,
618+
receipt::ReceiptType,
619+
uint,
595620
};
596-
use serde_json::json;
621+
use serde_json::Value as JsonValue;
597622

598623
use super::{MemoryStore, StateChanges};
599-
use crate::media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType};
600-
601-
fn user_id() -> &'static UserId {
602-
user_id!("@example:localhost")
603-
}
624+
use crate::{
625+
media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType},
626+
store::test::{
627+
first_receipt_event_id, populated_store, room_id, second_receipt_event_id,
628+
stripped_room_id, user_id,
629+
},
630+
};
604631

605632
#[async_test]
606633
async fn test_receipts_saving() {
607634
let store = MemoryStore::new();
608635

609-
let room_id = room_id!("!test:localhost");
610-
611-
let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org").to_owned();
612-
let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org").to_owned();
613-
614-
let first_receipt_event = serde_json::from_value(json!({
615-
first_event_id.clone(): {
616-
"m.read": {
617-
user_id().to_owned(): {
618-
"ts": 1436451550453u64
619-
}
620-
}
621-
}
622-
}))
623-
.unwrap();
636+
let user_id = user_id();
637+
let room_id = room_id();
638+
let first_event_id = first_receipt_event_id();
639+
let second_event_id = second_receipt_event_id();
640+
641+
let first_receipt_json: &JsonValue = &test_json::READ_RECEIPT;
642+
let first_receipt_event =
643+
serde_json::from_value::<AnySyncEphemeralRoomEvent>(first_receipt_json.clone())
644+
.unwrap();
645+
let first_receipt_content = match first_receipt_event.content() {
646+
AnyEphemeralRoomEventContent::Receipt(content) => content,
647+
_ => panic!(),
648+
};
624649

625-
let second_receipt_event = serde_json::from_value(json!({
626-
second_event_id.clone(): {
627-
"m.read": {
628-
user_id().to_owned(): {
629-
"ts": 1436451551453u64
630-
}
631-
}
632-
}
633-
}))
634-
.unwrap();
650+
let second_receipt_json: &JsonValue = &test_json::READ_RECEIPT_OTHER;
651+
let second_receipt_event =
652+
serde_json::from_value::<AnySyncEphemeralRoomEvent>(second_receipt_json.clone())
653+
.unwrap();
654+
let second_receipt_content = match second_receipt_event.content() {
655+
AnyEphemeralRoomEventContent::Receipt(content) => content,
656+
_ => panic!(),
657+
};
635658

636659
assert!(store
637-
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id())
660+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
638661
.await
639662
.unwrap()
640663
.is_none());
641664
assert!(store
642-
.get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id)
665+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_event_id)
643666
.await
644667
.unwrap()
645668
.is_empty());
646669
assert!(store
647-
.get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id)
670+
.get_event_room_receipt_events(room_id, ReceiptType::Read, second_event_id)
648671
.await
649672
.unwrap()
650673
.is_empty());
651674

652675
let mut changes = StateChanges::default();
653-
changes.add_receipts(room_id, first_receipt_event);
676+
changes.add_receipts(room_id, first_receipt_content);
654677

655678
store.save_changes(&changes).await.unwrap();
656679
assert!(store
657-
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id())
680+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
658681
.await
659682
.unwrap()
660683
.is_some(),);
661684
assert_eq!(
662685
store
663-
.get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id)
686+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_event_id)
664687
.await
665688
.unwrap()
666689
.len(),
667690
1
668691
);
669692
assert!(store
670-
.get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id)
693+
.get_event_room_receipt_events(room_id, ReceiptType::Read, second_event_id)
671694
.await
672695
.unwrap()
673696
.is_empty());
674697

675698
let mut changes = StateChanges::default();
676-
changes.add_receipts(room_id, second_receipt_event);
699+
changes.add_receipts(room_id, second_receipt_content);
677700

678701
store.save_changes(&changes).await.unwrap();
679702
assert!(store
680-
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id())
703+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
681704
.await
682705
.unwrap()
683706
.is_some());
684707
assert!(store
685-
.get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id)
708+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_event_id)
686709
.await
687710
.unwrap()
688711
.is_empty());
689712
assert_eq!(
690713
store
691-
.get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id)
714+
.get_event_room_receipt_events(room_id, ReceiptType::Read, second_event_id)
692715
.await
693716
.unwrap()
694717
.len(),
@@ -734,4 +757,93 @@ mod test {
734757
assert!(store.get_media_content(&request_file).await.unwrap().is_none());
735758
assert!(store.get_media_content(&request_thumbnail).await.unwrap().is_none());
736759
}
760+
761+
#[async_test]
762+
async fn test_populate_store() {
763+
let room_id = room_id();
764+
let user_id = user_id();
765+
766+
let store = populated_store(Box::new(MemoryStore::new())).await.unwrap();
767+
768+
assert!(store.get_sync_token().await.unwrap().is_some());
769+
assert!(store.get_presence_event(user_id).await.unwrap().is_some());
770+
assert_eq!(store.get_room_infos().await.unwrap().len(), 2);
771+
assert_eq!(store.get_stripped_room_infos().await.unwrap().len(), 1);
772+
assert!(store.get_account_data_event(EventType::PushRules).await.unwrap().is_some());
773+
774+
assert!(store.get_state_event(room_id, EventType::RoomName, "").await.unwrap().is_some());
775+
assert_eq!(store.get_state_events(room_id, EventType::RoomTopic).await.unwrap().len(), 1);
776+
assert!(store.get_profile(room_id, user_id).await.unwrap().is_some());
777+
assert!(store.get_member_event(room_id, user_id).await.unwrap().is_some());
778+
assert_eq!(store.get_user_ids(room_id).await.unwrap().len(), 2);
779+
assert_eq!(store.get_invited_user_ids(room_id).await.unwrap().len(), 1);
780+
assert_eq!(store.get_joined_user_ids(room_id).await.unwrap().len(), 1);
781+
assert_eq!(store.get_users_with_display_name(room_id, "example").await.unwrap().len(), 2);
782+
assert!(store
783+
.get_room_account_data_event(room_id, EventType::Tag)
784+
.await
785+
.unwrap()
786+
.is_some());
787+
assert!(store
788+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
789+
.await
790+
.unwrap()
791+
.is_some());
792+
assert_eq!(
793+
store
794+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_receipt_event_id())
795+
.await
796+
.unwrap()
797+
.len(),
798+
1
799+
);
800+
}
801+
802+
#[async_test]
803+
async fn test_room_removal() {
804+
let room_id = room_id();
805+
let user_id = user_id();
806+
let stripped_room_id = stripped_room_id();
807+
808+
let store = populated_store(Box::new(MemoryStore::new())).await.unwrap();
809+
810+
// We assume the store was correctly populated like the test above.
811+
812+
store.remove_room(room_id).await.unwrap();
813+
814+
assert_eq!(store.get_room_infos().await.unwrap().len(), 1);
815+
assert_eq!(store.get_stripped_room_infos().await.unwrap().len(), 1);
816+
817+
assert!(store.get_state_event(room_id, EventType::RoomName, "").await.unwrap().is_none());
818+
assert_eq!(store.get_state_events(room_id, EventType::RoomTopic).await.unwrap().len(), 0);
819+
assert!(store.get_profile(room_id, user_id).await.unwrap().is_none());
820+
assert!(store.get_member_event(room_id, user_id).await.unwrap().is_none());
821+
assert_eq!(store.get_user_ids(room_id).await.unwrap().len(), 0);
822+
assert_eq!(store.get_invited_user_ids(room_id).await.unwrap().len(), 0);
823+
assert_eq!(store.get_joined_user_ids(room_id).await.unwrap().len(), 0);
824+
assert_eq!(store.get_users_with_display_name(room_id, "example").await.unwrap().len(), 0);
825+
assert!(store
826+
.get_room_account_data_event(room_id, EventType::Tag)
827+
.await
828+
.unwrap()
829+
.is_none());
830+
assert!(store
831+
.get_user_room_receipt_event(room_id, ReceiptType::Read, user_id)
832+
.await
833+
.unwrap()
834+
.is_none());
835+
assert_eq!(
836+
store
837+
.get_event_room_receipt_events(room_id, ReceiptType::Read, first_receipt_event_id())
838+
.await
839+
.unwrap()
840+
.len(),
841+
0
842+
);
843+
844+
store.remove_room(stripped_room_id).await.unwrap();
845+
846+
assert_eq!(store.get_room_infos().await.unwrap().len(), 0);
847+
assert_eq!(store.get_stripped_room_infos().await.unwrap().len(), 0);
848+
}
737849
}

0 commit comments

Comments
 (0)