From f42955602ed8277cb31597c8ec88f605061f8893 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Sun, 8 Nov 2026 20:33:42 +0000 Subject: [PATCH] test: Add unit test for merging threaded and private receipts --- src/service/rooms/read_receipt/mod.rs | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/service/rooms/read_receipt/mod.rs b/src/service/rooms/read_receipt/mod.rs index c463e264e..346120d8b 100644 --- a/src/service/rooms/read_receipt/mod.rs +++ b/src/service/rooms/read_receipt/mod.rs @@ -271,4 +271,54 @@ mod tests { assert!(users.contains_key(user_id!("@alice:example.org"))); assert!(users.contains_key(user_id!("@bob:example.org"))); } + + #[test] + fn pack_receipts_merges_threaded_and_private_receipts() { + let event_a: OwnedEventId = "$event_a:example.org".try_into().expect("valid event ID"); + let event_b: OwnedEventId = "$event_b:example.org".try_into().expect("valid event ID"); + + let mut public_threaded_receipt = Receipt::default(); + public_threaded_receipt.thread = ruma::events::receipt::ReceiptThread::Main; + + let r1_content = ReceiptEventContent::from_iter([( + event_a.clone(), + BTreeMap::from([( + ReceiptType::Read, + BTreeMap::from([( + user_id!("@alice:example.org").to_owned(), + public_threaded_receipt, + )]), + )]), + )]); + let r1: Raw = Raw::from_json( + serde_json::value::to_raw_value(&SyncEphemeralRoomEvent::new(r1_content)).unwrap(), + ); + + let mut private_receipt = Receipt::default(); + private_receipt.thread = ruma::events::receipt::ReceiptThread::Unthreaded; + let r2_content = ReceiptEventContent::from_iter([( + event_b.clone(), + BTreeMap::from([( + ReceiptType::ReadPrivate, + BTreeMap::from([(user_id!("@alice:example.org").to_owned(), private_receipt)]), + )]), + )]); + let r2: Raw = Raw::from_json( + serde_json::value::to_raw_value(&SyncEphemeralRoomEvent::new(r2_content)).unwrap(), + ); + + let packed = pack_receipts([r1, r2].into_iter()); + let packed: SyncEphemeralRoomEvent = + serde_json::from_str(packed.json().get()).expect("packed receipt is valid"); + + assert_eq!( + packed.content[&event_a][&ReceiptType::Read][user_id!("@alice:example.org")].thread, + ruma::events::receipt::ReceiptThread::Main + ); + assert_eq!( + packed.content[&event_b][&ReceiptType::ReadPrivate][user_id!("@alice:example.org")] + .thread, + ruma::events::receipt::ReceiptThread::Unthreaded + ); + } }