From cc107106f03cc7b334cc96b964ef699b17f25fd6 Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Fri, 21 Jun 2019 16:02:53 -0700 Subject: [PATCH] Continue implementation of m.room.power_levels and add tests. --- src/room.rs | 2 +- src/room/name.rs | 28 ++++++++++++- src/room/power_levels.rs | 87 +++++++++++++++++++++++++++++----------- 3 files changed, 92 insertions(+), 25 deletions(-) diff --git a/src/room.rs b/src/room.rs index 8e2e0db3..6acee293 100644 --- a/src/room.rs +++ b/src/room.rs @@ -20,7 +20,7 @@ pub mod join_rules; // pub mod message; pub mod name; pub mod pinned_events; -// pub mod power_levels; +pub mod power_levels; pub mod redaction; pub mod server_acl; pub mod third_party_invite; diff --git a/src/room/name.rs b/src/room/name.rs index 22aa32ac..ebdcb4a9 100644 --- a/src/room/name.rs +++ b/src/room/name.rs @@ -203,7 +203,33 @@ mod raw { #[cfg(test)] mod tests { - use super::NameEvent; + use std::convert::TryFrom; + + use js_int::UInt; + use ruma_identifiers::{EventId, UserId}; + + use super::{NameEvent, NameEventContent}; + + #[test] + fn serialization_with_optional_fields_as_none() { + let name_event = NameEvent { + content: NameEventContent { + name: Some("The room name".to_string()), + }, + event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), + origin_server_ts: UInt::try_from(1).unwrap(), + prev_content: None, + room_id: None, + unsigned: None, + sender: UserId::try_from("@carl:matrix.org").unwrap(), + state_key: "".to_string(), + }; + + let actual = serde_json::to_string(&name_event).unwrap(); + let expected = r#"{"content":{"name":"The room name"},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:matrix.org","state_key":"","type":"m.room.name"}"#; + + assert_eq!(actual, expected); + } #[test] fn absent_field_as_none() { diff --git a/src/room/power_levels.rs b/src/room/power_levels.rs index e205bc08..62ecf003 100644 --- a/src/room/power_levels.rs +++ b/src/room/power_levels.rs @@ -2,15 +2,12 @@ use std::{collections::HashMap, convert::TryFrom, str::FromStr}; -use js_int::UInt; +use js_int::{Int, UInt}; use ruma_identifiers::{EventId, RoomId, UserId}; use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer}; use serde_json::Value; -use crate::{ - Event, EventType, InvalidEvent, InvalidInput, RoomEvent, StateEvent, -}; - +use crate::{Event, EventType, InvalidEvent, InvalidInput, RoomEvent, StateEvent}; /// Defines the power levels (privileges) of users in the room. #[derive(Clone, Debug, PartialEq)] @@ -26,7 +23,7 @@ pub struct PowerLevelsEvent { pub origin_server_ts: UInt, /// The previous content for this state key, if any. - pub prev_content: Option, + pub prev_content: Option, /// The unique identifier for the room associated with this event. pub room_id: Option, @@ -110,20 +107,18 @@ impl FromStr for PowerLevelsEvent { }, event_id: raw.event_id, origin_server_ts: raw.origin_server_ts, - prev_content: raw - .prev_content - .map(|prev| PowerLevelsEventContent { - ban: prev.ban, - events: prev.events, - events_default: prev.events_default, - invite: prev.invite, - kick: prev.kick, - redact: prev.redact, - state_default: prev.state_default, - users: prev.users, - users_default: prev.users_default, - notifications: prev.notifications, - }), + prev_content: raw.prev_content.map(|prev| PowerLevelsEventContent { + ban: prev.ban, + events: prev.events, + events_default: prev.events_default, + invite: prev.invite, + kick: prev.kick, + redact: prev.redact, + state_default: prev.state_default, + users: prev.users, + users_default: prev.users_default, + notifications: prev.notifications, + }), room_id: raw.room_id, unsigned: raw.unsigned, sender: raw.sender, @@ -141,7 +136,7 @@ impl<'a> TryFrom<&'a str> for PowerLevelsEvent { } } -impl Serialize for NameEvent { +impl Serialize for PowerLevelsEvent { fn serialize(&self, serializer: S) -> Result where S: Serializer, @@ -186,7 +181,11 @@ impl Serialize for NameEvent { } } -impl_state_event!(PowerLevelsEvent, PowerLevelsEventContent, EventType::RoomPowerLevels); +impl_state_event!( + PowerLevelsEvent, + PowerLevelsEventContent, + EventType::RoomPowerLevels +); mod raw { use super::*; @@ -205,7 +204,7 @@ mod raw { pub origin_server_ts: UInt, /// The previous content for this state key, if any. - pub prev_content: Option, + pub prev_content: Option, /// The unique identifier for the room associated with this event. pub room_id: Option, @@ -280,3 +279,45 @@ pub struct NotificationPowerLevels { fn default_power_level() -> Int { Int::from(50) } + +#[cfg(test)] +mod tests { + use std::{collections::HashMap, convert::TryFrom}; + + use js_int::{Int, UInt}; + use ruma_identifiers::{EventId, UserId}; + + use super::{NotificationPowerLevels, PowerLevelsEvent, PowerLevelsEventContent}; + + #[test] + fn serialization_with_optional_fields_as_none() { + let default = Int::try_from(50).unwrap(); + + let power_levels_event = PowerLevelsEvent { + content: PowerLevelsEventContent { + ban: default, + events: HashMap::new(), + events_default: default, + invite: default, + kick: default, + redact: default, + state_default: default, + users: HashMap::new(), + users_default: default, + notifications: NotificationPowerLevels { room: default }, + }, + event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), + origin_server_ts: UInt::try_from(1).unwrap(), + prev_content: None, + room_id: None, + unsigned: None, + sender: UserId::try_from("@carl:matrix.org").unwrap(), + state_key: "".to_string(), + }; + + let actual = serde_json::to_string(&power_levels_event).unwrap(); + let expected = r#"{"content":{"ban":50,"events":{},"events_default":50,"invite":50,"kick":50,"redact":50,"state_default":50,"users":{},"users_default":50,"notifications":{"room":50}},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:matrix.org","state_key":"","type":"m.room.power_levels"}"#; + + assert_eq!(actual, expected); + } +}