diff --git a/matrix_sdk_base/src/store/memory_store.rs b/matrix_sdk_base/src/store/memory_store.rs index 1e93d1d0..edee0ba3 100644 --- a/matrix_sdk_base/src/store/memory_store.rs +++ b/matrix_sdk_base/src/store/memory_store.rs @@ -502,3 +502,111 @@ impl StateStore for MemoryStore { self.get_event_room_receipt_events(room_id, receipt_type, event_id).await } } + +#[cfg(test)] +#[cfg(not(feature = "sled_state_store"))] +mod test { + use matrix_sdk_common::{ + identifiers::{event_id, room_id, user_id}, + receipt::ReceiptType, + }; + use matrix_sdk_test::async_test; + use serde_json::json; + + use super::{MemoryStore, StateChanges}; + + #[async_test] + async fn test_receipts_saving() { + let store = MemoryStore::new(); + + let room_id = room_id!("!test:localhost"); + let user_id = user_id!("@rikj:jki.re"); + + let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org"); + let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org"); + + let first_receipt_event = serde_json::from_value(json!({ + first_event_id.clone(): { + "m.read": { + user_id.clone(): { + "ts": 1436451550453u64 + } + } + } + })) + .unwrap(); + + let second_receipt_event = serde_json::from_value(json!({ + second_event_id.clone(): { + "m.read": { + user_id.clone(): { + "ts": 1436451551453u64 + } + } + } + })) + .unwrap(); + + assert!(store + .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id) + .await + .unwrap() + .is_none()); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .await + .unwrap() + .is_empty()); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .await + .unwrap() + .is_empty()); + + let mut changes = StateChanges::default(); + changes.add_receipts(&room_id, first_receipt_event); + + store.save_changes(&changes).await.unwrap(); + assert!(store + .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id) + .await + .unwrap() + .is_some(),); + assert_eq!( + store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .await + .unwrap() + .len(), + 1 + ); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .await + .unwrap() + .is_empty()); + + let mut changes = StateChanges::default(); + changes.add_receipts(&room_id, second_receipt_event); + + store.save_changes(&changes).await.unwrap(); + assert!(store + .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id) + .await + .unwrap() + .is_some()); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .await + .unwrap() + .is_empty()); + assert_eq!( + store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .await + .unwrap() + .len(), + 1 + ); + } +} diff --git a/matrix_sdk_base/src/store/sled_store/mod.rs b/matrix_sdk_base/src/store/sled_store/mod.rs index a5451444..a32b2105 100644 --- a/matrix_sdk_base/src/store/sled_store/mod.rs +++ b/matrix_sdk_base/src/store/sled_store/mod.rs @@ -844,7 +844,8 @@ mod test { }, AnySyncStateEvent, EventType, Unsigned, }, - identifiers::{room_id, user_id, EventId, UserId}, + identifiers::{event_id, room_id, user_id, EventId, UserId}, + receipt::ReceiptType, MilliSecondsSinceUnixEpoch, Raw, }; use matrix_sdk_test::async_test; @@ -929,4 +930,99 @@ mod test { .unwrap() .is_some()); } + + #[async_test] + async fn test_receipts_saving() { + let store = SledStore::open().unwrap(); + + let room_id = room_id!("!test:localhost"); + let user_id = user_id!("@rikj:jki.re"); + + let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org"); + let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org"); + + let first_receipt_event = serde_json::from_value(json!({ + first_event_id.clone(): { + "m.read": { + user_id.clone(): { + "ts": 1436451550453u64 + } + } + } + })) + .unwrap(); + + let second_receipt_event = serde_json::from_value(json!({ + second_event_id.clone(): { + "m.read": { + user_id.clone(): { + "ts": 1436451551453u64 + } + } + } + })) + .unwrap(); + + assert!(store + .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id) + .await + .unwrap() + .is_none()); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .await + .unwrap() + .is_empty()); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .await + .unwrap() + .is_empty()); + + let mut changes = StateChanges::default(); + changes.add_receipts(&room_id, first_receipt_event); + + store.save_changes(&changes).await.unwrap(); + assert!(store + .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id) + .await + .unwrap() + .is_some(),); + assert_eq!( + store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .await + .unwrap() + .len(), + 1 + ); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .await + .unwrap() + .is_empty()); + + let mut changes = StateChanges::default(); + changes.add_receipts(&room_id, second_receipt_event); + + store.save_changes(&changes).await.unwrap(); + assert!(store + .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id) + .await + .unwrap() + .is_some()); + assert!(store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .await + .unwrap() + .is_empty()); + assert_eq!( + store + .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .await + .unwrap() + .len(), + 1 + ); + } }