test(event_factory): add room account data support

Add support for room account data events in EventFactory:
- Add RoomAccountData format to EventFormat enum
- Add From implementations for Raw<AnyRoomAccountDataEvent>
- Add room_account_data() generic method
- Add fully_read() helper for m.fully_read events
- Add marked_unread() helper for m.marked_unread events
This commit is contained in:
Benjamin Bouvier
2026-02-16 13:07:01 +01:00
parent 4c6d5f9654
commit b95b0ba1c4
3 changed files with 57 additions and 39 deletions

View File

@@ -29,19 +29,21 @@ use ruma::{
OwnedRoomAliasId, OwnedRoomId, OwnedTransactionId, OwnedUserId, OwnedVoipId, RoomId,
RoomVersionId, TransactionId, UInt, UserId, VoipVersionId,
events::{
AnyGlobalAccountDataEvent, AnyMessageLikeEvent, AnyStateEvent, AnyStrippedStateEvent,
AnySyncEphemeralRoomEvent, AnySyncMessageLikeEvent, AnySyncStateEvent,
AnySyncTimelineEvent, AnyTimelineEvent, BundledMessageLikeRelations,
AnyGlobalAccountDataEvent, AnyMessageLikeEvent, AnyRoomAccountDataEvent, AnyStateEvent,
AnyStrippedStateEvent, AnySyncEphemeralRoomEvent, AnySyncMessageLikeEvent,
AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, BundledMessageLikeRelations,
EphemeralRoomEventContent, EventContentFromType, False, GlobalAccountDataEventContent,
Mentions, MessageLikeEvent, MessageLikeEventContent, PossiblyRedactedStateEventContent,
RedactContent, RedactedMessageLikeEventContent, RedactedStateEventContent, StateEvent,
StateEventContent, StaticEventContent, StaticStateEventContent, StrippedStateEvent,
SyncMessageLikeEvent, SyncStateEvent,
RedactContent, RedactedMessageLikeEventContent, RedactedStateEventContent,
RoomAccountDataEventContent, StateEvent, StateEventContent, StaticEventContent,
StaticStateEventContent, StrippedStateEvent, SyncMessageLikeEvent, SyncStateEvent,
beacon::BeaconEventContent,
call::{SessionDescription, invite::CallInviteEventContent},
direct::{DirectEventContent, OwnedDirectUserIdentifier},
fully_read::FullyReadEventContent,
ignored_user_list::IgnoredUserListEventContent,
macros::EventContent,
marked_unread::MarkedUnreadEventContent,
member_hints::MemberHintsEventContent,
poll::{
unstable_end::UnstablePollEndEventContent,
@@ -180,6 +182,8 @@ enum EventFormat {
Ephemeral,
/// A global account data.
GlobalAccountData,
/// A room account data.
RoomAccountData,
}
impl EventFormat {
@@ -615,6 +619,24 @@ where
}
}
impl<E: StaticEventContent<IsPrefix = False>> From<EventBuilder<E>> for Raw<AnyRoomAccountDataEvent>
where
E: Serialize,
{
fn from(val: EventBuilder<E>) -> Self {
val.format(EventFormat::RoomAccountData).into_raw()
}
}
impl<E: StaticEventContent<IsPrefix = False>> From<EventBuilder<E>> for AnyRoomAccountDataEvent
where
E: Serialize,
{
fn from(val: EventBuilder<E>) -> Self {
Raw::<AnyRoomAccountDataEvent>::from(val).deserialize().expect("expected room account data")
}
}
impl<E: StaticEventContent<IsPrefix = False>> From<EventBuilder<E>> for TimelineEvent
where
E: Serialize,
@@ -1466,6 +1488,24 @@ impl EventFactory {
{
self.event(content).format(EventFormat::GlobalAccountData)
}
/// Create a new room account data event of the given `C` content type.
pub fn room_account_data<C>(&self, content: C) -> EventBuilder<C>
where
C: RoomAccountDataEventContent + StaticEventContent<IsPrefix = False>,
{
self.event(content).format(EventFormat::RoomAccountData)
}
/// Create a new `m.fully_read` room account data event.
pub fn fully_read(&self, event_id: &EventId) -> EventBuilder<FullyReadEventContent> {
self.room_account_data(FullyReadEventContent::new(event_id.to_owned()))
}
/// Create a new `m.marked_unread` room account data event.
pub fn marked_unread(&self, unread: bool) -> EventBuilder<MarkedUnreadEventContent> {
self.room_account_data(MarkedUnreadEventContent::new(unread))
}
}
impl EventBuilder<DirectEventContent> {

View File

@@ -1,7 +1,7 @@
use ruma::{events::AnyRoomAccountDataEvent, serde::Raw};
use serde_json::{Value as JsonValue, from_value as from_json_value};
use ruma::{event_id, events::AnyRoomAccountDataEvent, serde::Raw};
use serde_json::Value as JsonValue;
use crate::test_json;
use crate::event_factory::EventFactory;
/// Test events that can be added to the room account data.
pub enum RoomAccountDataTestEvent {
@@ -10,20 +10,17 @@ pub enum RoomAccountDataTestEvent {
Custom(JsonValue),
}
impl From<RoomAccountDataTestEvent> for JsonValue {
impl From<RoomAccountDataTestEvent> for Raw<AnyRoomAccountDataEvent> {
fn from(val: RoomAccountDataTestEvent) -> Self {
let f = EventFactory::new();
match val {
RoomAccountDataTestEvent::FullyRead => test_json::sync_events::FULLY_READ.to_owned(),
RoomAccountDataTestEvent::MarkedUnread => {
test_json::sync_events::MARKED_UNREAD.to_owned()
RoomAccountDataTestEvent::FullyRead => {
f.fully_read(event_id!("$someplace:example.org")).into()
}
RoomAccountDataTestEvent::MarkedUnread => f.marked_unread(true).into(),
RoomAccountDataTestEvent::Custom(json) => {
serde_json::from_value(json).expect("Custom JSON should be valid")
}
RoomAccountDataTestEvent::Custom(json) => json,
}
}
}
impl From<RoomAccountDataTestEvent> for Raw<AnyRoomAccountDataEvent> {
fn from(val: RoomAccountDataTestEvent) -> Self {
from_json_value(val.into()).unwrap()
}
}

View File

@@ -3,16 +3,6 @@
use once_cell::sync::Lazy;
use serde_json::{Value as JsonValue, json};
pub static FULLY_READ: Lazy<JsonValue> = Lazy::new(|| {
json!({
"content": {
"event_id": "$someplace:example.org"
},
"room_id": "!somewhere:example.org",
"type": "m.fully_read"
})
});
// TODO: Move `prev_content` into `unsigned` once ruma supports it
pub static MEMBER: Lazy<JsonValue> = Lazy::new(|| {
json!({
@@ -198,12 +188,3 @@ pub static TAG: Lazy<JsonValue> = Lazy::new(|| {
"type": "m.tag"
})
});
pub static MARKED_UNREAD: Lazy<JsonValue> = Lazy::new(|| {
json!({
"content": {
"unread": true,
},
"type": "m.marked_unread",
})
});