diff --git a/src/lib.rs b/src/lib.rs index 4765e6b4..d2ac4160 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -169,8 +169,8 @@ pub use self::{ event_type::EventType, from_raw::{FromRaw, TryFromRaw}, json::EventJson, - message::MessageEvent, - state::StateEvent, + message::{AnyMessageEventContent, MessageEvent}, + state::{AnyStateEventContent, StateEvent}, }; /// Extra information about an event that is not incorporated into the event's diff --git a/src/message.rs b/src/message.rs index ce3fa154..ba24b12d 100644 --- a/src/message.rs +++ b/src/message.rs @@ -49,232 +49,3 @@ pub struct MessageEvent { /// Additional key-value pairs not signed by the homeserver. pub unsigned: UnsignedData, } - -#[cfg(test)] -mod tests { - use std::{ - convert::TryFrom, - time::{Duration, UNIX_EPOCH}, - }; - - use js_int::UInt; - use matches::assert_matches; - use ruma_identifiers::{EventId, RoomAliasId, RoomId, UserId}; - use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; - - use super::{AnyMessageEventContent, MessageEvent}; - use crate::{ - call::{answer::AnswerEventContent, SessionDescription, SessionDescriptionType}, - room::{ImageInfo, ThumbnailInfo}, - sticker::StickerEventContent, - EventJson, UnsignedData, - }; - - #[test] - fn message_serialize_sticker() { - let aliases_event = MessageEvent { - content: AnyMessageEventContent::Sticker(StickerEventContent { - body: "Hello".into(), - info: ImageInfo { - height: UInt::new(423), - width: UInt::new(1011), - mimetype: Some("image/png".into()), - size: UInt::new(84242), - thumbnail_info: Some(Box::new(ThumbnailInfo { - width: UInt::new(800), - height: UInt::new(334), - mimetype: Some("image/png".into()), - size: UInt::new(82595), - })), - thumbnail_url: Some("mxc://matrix.org".into()), - thumbnail_file: None, - }, - url: "http://www.matrix.org".into(), - }), - event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), - origin_server_ts: UNIX_EPOCH + Duration::from_millis(1), - room_id: RoomId::try_from("!roomid:room.com").unwrap(), - sender: UserId::try_from("@carl:example.com").unwrap(), - unsigned: UnsignedData::default(), - }; - - let actual = to_json_value(&aliases_event).unwrap(); - let expected = json!({ - "content": { - "body": "Hello", - "info": { - "h": 423, - "mimetype": "image/png", - "size": 84242, - "thumbnail_info": { - "h": 334, - "mimetype": "image/png", - "size": 82595, - "w": 800 - }, - "thumbnail_url": "mxc://matrix.org", - "w": 1011 - }, - "url": "http://www.matrix.org" - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "type": "m.sticker", - }); - - assert_eq!(actual, expected); - } - - #[test] - fn deserialize_message_call_answer_content() { - let json_data = json!({ - "answer": { - "type": "answer", - "sdp": "Hello" - }, - "call_id": "foofoo", - "version": 1 - }); - - assert_matches!( - from_json_value::>(json_data) - .unwrap() - .deserialize_content("m.call.answer") - .unwrap(), - AnyMessageEventContent::CallAnswer(AnswerEventContent { - answer: SessionDescription { - session_type: SessionDescriptionType::Answer, - sdp, - }, - call_id, - version, - }) if sdp == "Hello" && call_id == "foofoo" && version == UInt::new(1).unwrap() - ); - } - - #[test] - fn deserialize_message_call_answer() { - let json_data = json!({ - "content": { - "answer": { - "type": "answer", - "sdp": "Hello" - }, - "call_id": "foofoo", - "version": 1 - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "type": "m.call.answer" - }); - - assert_matches!( - from_json_value::>>(json_data) - .unwrap() - .deserialize() - .unwrap(), - MessageEvent { - content: AnyMessageEventContent::CallAnswer(AnswerEventContent { - answer: SessionDescription { - session_type: SessionDescriptionType::Answer, - sdp, - }, - call_id, - version, - }), - event_id, - origin_server_ts, - room_id, - sender, - unsigned, - } if sdp == "Hello" && call_id == "foofoo" && version == UInt::new(1).unwrap() - && event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() - && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) - && room_id == RoomId::try_from("!roomid:room.com").unwrap() - && sender == UserId::try_from("@carl:example.com").unwrap() - && unsigned.is_empty() - ); - } - - #[test] - fn deserialize_message_sticker() { - let json_data = json!({ - "content": { - "body": "Hello", - "info": { - "h": 423, - "mimetype": "image/png", - "size": 84242, - "thumbnail_info": { - "h": 334, - "mimetype": "image/png", - "size": 82595, - "w": 800 - }, - "thumbnail_url": "mxc://matrix.org", - "w": 1011 - }, - "url": "http://www.matrix.org" - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "type": "m.sticker" - }); - - assert_matches!( - from_json_value::>>(json_data) - .unwrap() - .deserialize() - .unwrap(), - MessageEvent { - content: AnyMessageEventContent::Sticker(StickerEventContent { - body, - info: ImageInfo { - height, - width, - mimetype: Some(mimetype), - size, - thumbnail_info: Some(thumbnail_info), - thumbnail_url: Some(thumbnail_url), - thumbnail_file: None, - }, - url, - }), - event_id, - origin_server_ts, - room_id, - sender, - unsigned - } if event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() - && body == "Hello" - && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) - && room_id == RoomId::try_from("!roomid:room.com").unwrap() - && sender == UserId::try_from("@carl:example.com").unwrap() - && height == UInt::new(423) - && width == UInt::new(1011) - && mimetype == "image/png" - && size == UInt::new(84242) - && thumbnail_url == "mxc://matrix.org" - && matches!( - thumbnail_info.as_ref(), - ThumbnailInfo { - width: thumb_width, - height: thumb_height, - mimetype: thumb_mimetype, - size: thumb_size, - } if *thumb_width == UInt::new(800) - && *thumb_height == UInt::new(334) - && *thumb_mimetype == Some("image/png".to_string()) - && *thumb_size == UInt::new(82595) - ) - && url == "http://www.matrix.org" - && unsigned.is_empty() - ); - } -} diff --git a/src/state.rs b/src/state.rs index 3fc2aeff..b325f990 100644 --- a/src/state.rs +++ b/src/state.rs @@ -69,231 +69,3 @@ pub struct StateEvent { /// Additional key-value pairs not signed by the homeserver. pub unsigned: UnsignedData, } - -#[cfg(test)] -mod tests { - use std::{ - convert::TryFrom, - time::{Duration, UNIX_EPOCH}, - }; - - use js_int::UInt; - use matches::assert_matches; - use ruma_identifiers::{EventId, RoomAliasId, RoomId, UserId}; - use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; - - use super::{AnyStateEventContent, StateEvent}; - use crate::{ - room::{ - aliases::AliasesEventContent, avatar::AvatarEventContent, ImageInfo, ThumbnailInfo, - }, - EventJson, UnsignedData, - }; - - #[test] - fn serialize_aliases_with_prev_content() { - let aliases_event = StateEvent { - content: AnyStateEventContent::RoomAliases(AliasesEventContent { - aliases: vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()], - }), - event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), - origin_server_ts: UNIX_EPOCH + Duration::from_millis(1), - prev_content: Some(AnyStateEventContent::RoomAliases(AliasesEventContent { - aliases: vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()], - })), - room_id: RoomId::try_from("!roomid:room.com").unwrap(), - sender: UserId::try_from("@carl:example.com").unwrap(), - state_key: "".to_string(), - unsigned: UnsignedData::default(), - }; - - let actual = to_json_value(&aliases_event).unwrap(); - let expected = json!({ - "content": { - "aliases": [ "#somewhere:localhost" ] - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "prev_content": { - "aliases": [ "#somewhere:localhost" ] - }, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "state_key": "", - "type": "m.room.aliases", - }); - - assert_eq!(actual, expected); - } - - #[test] - fn serialize_aliases_without_prev_content() { - let aliases_event = StateEvent { - content: AnyStateEventContent::RoomAliases(AliasesEventContent { - aliases: vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()], - }), - event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), - origin_server_ts: UNIX_EPOCH + Duration::from_millis(1), - prev_content: None, - room_id: RoomId::try_from("!roomid:room.com").unwrap(), - sender: UserId::try_from("@carl:example.com").unwrap(), - state_key: "".to_string(), - unsigned: UnsignedData::default(), - }; - - let actual = to_json_value(&aliases_event).unwrap(); - let expected = json!({ - "content": { - "aliases": [ "#somewhere:localhost" ] - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "state_key": "", - "type": "m.room.aliases", - }); - - assert_eq!(actual, expected); - } - - #[test] - fn deserialize_aliases_content() { - let json_data = json!({ - "aliases": [ "#somewhere:localhost" ] - }); - - assert_matches!( - from_json_value::>(json_data) - .unwrap() - .deserialize_content("m.room.aliases") - .unwrap(), - AnyStateEventContent::RoomAliases(content) - if content.aliases == vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()] - ); - } - - #[test] - fn deserialize_aliases_with_prev_content() { - let json_data = json!({ - "content": { - "aliases": [ "#somewhere:localhost" ] - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "prev_content": { - "aliases": [ "#inner:localhost" ] - }, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "state_key": "", - "type": "m.room.aliases" - }); - - assert_matches!( - from_json_value::>>(json_data) - .unwrap() - .deserialize() - .unwrap(), - StateEvent { - content: AnyStateEventContent::RoomAliases(content), - event_id, - origin_server_ts, - prev_content: Some(AnyStateEventContent::RoomAliases(prev_content)), - room_id, - sender, - state_key, - unsigned, - } if content.aliases == vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()] - && event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() - && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) - && prev_content.aliases == vec![RoomAliasId::try_from("#inner:localhost").unwrap()] - && room_id == RoomId::try_from("!roomid:room.com").unwrap() - && sender == UserId::try_from("@carl:example.com").unwrap() - && state_key == "" - && unsigned.is_empty() - ); - } - - #[test] - fn deserialize_avatar_without_prev_content() { - let json_data = json!({ - "content": { - "info": { - "h": 423, - "mimetype": "image/png", - "size": 84242, - "thumbnail_info": { - "h": 334, - "mimetype": "image/png", - "size": 82595, - "w": 800 - }, - "thumbnail_url": "mxc://matrix.org", - "w": 1011 - }, - "url": "http://www.matrix.org" - }, - "event_id": "$h29iv0s8:example.com", - "origin_server_ts": 1, - "room_id": "!roomid:room.com", - "sender": "@carl:example.com", - "state_key": "", - "type": "m.room.avatar" - }); - - assert_matches!( - from_json_value::>>(json_data) - .unwrap() - .deserialize() - .unwrap(), - StateEvent { - content: AnyStateEventContent::RoomAvatar(AvatarEventContent { - info: Some(info), - url, - }), - event_id, - origin_server_ts, - prev_content: None, - room_id, - sender, - state_key, - unsigned - } if event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() - && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) - && room_id == RoomId::try_from("!roomid:room.com").unwrap() - && sender == UserId::try_from("@carl:example.com").unwrap() - && state_key == "" - && matches!( - info.as_ref(), - ImageInfo { - height, - width, - mimetype: Some(mimetype), - size, - thumbnail_info: Some(thumbnail_info), - thumbnail_url: Some(thumbnail_url), - thumbnail_file: None, - } if *height == UInt::new(423) - && *width == UInt::new(1011) - && *mimetype == "image/png" - && *size == UInt::new(84242) - && matches!( - thumbnail_info.as_ref(), - ThumbnailInfo { - width: thumb_width, - height: thumb_height, - mimetype: thumb_mimetype, - size: thumb_size, - } if *thumb_width == UInt::new(800) - && *thumb_height == UInt::new(334) - && *thumb_mimetype == Some("image/png".to_string()) - && *thumb_size == UInt::new(82595) - && *thumbnail_url == "mxc://matrix.org" - ) - ) - && url == "http://www.matrix.org" - && unsigned.is_empty() - ); - } -} diff --git a/tests/message_event.rs b/tests/message_event.rs new file mode 100644 index 00000000..384acb68 --- /dev/null +++ b/tests/message_event.rs @@ -0,0 +1,223 @@ +use std::{ + convert::TryFrom, + time::{Duration, UNIX_EPOCH}, +}; + +use js_int::UInt; +use matches::assert_matches; +use ruma_events::{ + call::{answer::AnswerEventContent, SessionDescription, SessionDescriptionType}, + room::{ImageInfo, ThumbnailInfo}, + sticker::StickerEventContent, + AnyMessageEventContent, EventJson, MessageEvent, UnsignedData, +}; +use ruma_identifiers::{EventId, RoomId, UserId}; +use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; + +#[test] +fn message_serialize_sticker() { + let aliases_event = MessageEvent { + content: AnyMessageEventContent::Sticker(StickerEventContent { + body: "Hello".into(), + info: ImageInfo { + height: UInt::new(423), + width: UInt::new(1011), + mimetype: Some("image/png".into()), + size: UInt::new(84242), + thumbnail_info: Some(Box::new(ThumbnailInfo { + width: UInt::new(800), + height: UInt::new(334), + mimetype: Some("image/png".into()), + size: UInt::new(82595), + })), + thumbnail_url: Some("mxc://matrix.org".into()), + thumbnail_file: None, + }, + url: "http://www.matrix.org".into(), + }), + event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), + origin_server_ts: UNIX_EPOCH + Duration::from_millis(1), + room_id: RoomId::try_from("!roomid:room.com").unwrap(), + sender: UserId::try_from("@carl:example.com").unwrap(), + unsigned: UnsignedData::default(), + }; + + let actual = to_json_value(&aliases_event).unwrap(); + let expected = json!({ + "content": { + "body": "Hello", + "info": { + "h": 423, + "mimetype": "image/png", + "size": 84242, + "thumbnail_info": { + "h": 334, + "mimetype": "image/png", + "size": 82595, + "w": 800 + }, + "thumbnail_url": "mxc://matrix.org", + "w": 1011 + }, + "url": "http://www.matrix.org" + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "type": "m.sticker", + }); + + assert_eq!(actual, expected); +} + +#[test] +fn deserialize_message_call_answer_content() { + let json_data = json!({ + "answer": { + "type": "answer", + "sdp": "Hello" + }, + "call_id": "foofoo", + "version": 1 + }); + + assert_matches!( + from_json_value::>(json_data) + .unwrap() + .deserialize_content("m.call.answer") + .unwrap(), + AnyMessageEventContent::CallAnswer(AnswerEventContent { + answer: SessionDescription { + session_type: SessionDescriptionType::Answer, + sdp, + }, + call_id, + version, + }) if sdp == "Hello" && call_id == "foofoo" && version == UInt::new(1).unwrap() + ); +} + +#[test] +fn deserialize_message_call_answer() { + let json_data = json!({ + "content": { + "answer": { + "type": "answer", + "sdp": "Hello" + }, + "call_id": "foofoo", + "version": 1 + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "type": "m.call.answer" + }); + + assert_matches!( + from_json_value::>>(json_data) + .unwrap() + .deserialize() + .unwrap(), + MessageEvent { + content: AnyMessageEventContent::CallAnswer(AnswerEventContent { + answer: SessionDescription { + session_type: SessionDescriptionType::Answer, + sdp, + }, + call_id, + version, + }), + event_id, + origin_server_ts, + room_id, + sender, + unsigned, + } if sdp == "Hello" && call_id == "foofoo" && version == UInt::new(1).unwrap() + && event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() + && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) + && room_id == RoomId::try_from("!roomid:room.com").unwrap() + && sender == UserId::try_from("@carl:example.com").unwrap() + && unsigned.is_empty() + ); +} + +#[test] +fn deserialize_message_sticker() { + let json_data = json!({ + "content": { + "body": "Hello", + "info": { + "h": 423, + "mimetype": "image/png", + "size": 84242, + "thumbnail_info": { + "h": 334, + "mimetype": "image/png", + "size": 82595, + "w": 800 + }, + "thumbnail_url": "mxc://matrix.org", + "w": 1011 + }, + "url": "http://www.matrix.org" + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "type": "m.sticker" + }); + + assert_matches!( + from_json_value::>>(json_data) + .unwrap() + .deserialize() + .unwrap(), + MessageEvent { + content: AnyMessageEventContent::Sticker(StickerEventContent { + body, + info: ImageInfo { + height, + width, + mimetype: Some(mimetype), + size, + thumbnail_info: Some(thumbnail_info), + thumbnail_url: Some(thumbnail_url), + thumbnail_file: None, + }, + url, + }), + event_id, + origin_server_ts, + room_id, + sender, + unsigned + } if event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() + && body == "Hello" + && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) + && room_id == RoomId::try_from("!roomid:room.com").unwrap() + && sender == UserId::try_from("@carl:example.com").unwrap() + && height == UInt::new(423) + && width == UInt::new(1011) + && mimetype == "image/png" + && size == UInt::new(84242) + && thumbnail_url == "mxc://matrix.org" + && matches!( + thumbnail_info.as_ref(), + ThumbnailInfo { + width: thumb_width, + height: thumb_height, + mimetype: thumb_mimetype, + size: thumb_size, + } if *thumb_width == UInt::new(800) + && *thumb_height == UInt::new(334) + && *thumb_mimetype == Some("image/png".to_string()) + && *thumb_size == UInt::new(82595) + ) + && url == "http://www.matrix.org" + && unsigned.is_empty() + ); +} diff --git a/tests/state_event.rs b/tests/state_event.rs new file mode 100644 index 00000000..e19559cf --- /dev/null +++ b/tests/state_event.rs @@ -0,0 +1,220 @@ +use std::{ + convert::TryFrom, + time::{Duration, UNIX_EPOCH}, +}; + +use js_int::UInt; +use matches::assert_matches; +use ruma_events::{ + room::{aliases::AliasesEventContent, avatar::AvatarEventContent, ImageInfo, ThumbnailInfo}, + AnyStateEventContent, EventJson, StateEvent, UnsignedData, +}; +use ruma_identifiers::{EventId, RoomAliasId, RoomId, UserId}; +use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; + +#[test] +fn serialize_aliases_with_prev_content() { + let aliases_event = StateEvent { + content: AnyStateEventContent::RoomAliases(AliasesEventContent { + aliases: vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()], + }), + event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), + origin_server_ts: UNIX_EPOCH + Duration::from_millis(1), + prev_content: Some(AnyStateEventContent::RoomAliases(AliasesEventContent { + aliases: vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()], + })), + room_id: RoomId::try_from("!roomid:room.com").unwrap(), + sender: UserId::try_from("@carl:example.com").unwrap(), + state_key: "".to_string(), + unsigned: UnsignedData::default(), + }; + + let actual = to_json_value(&aliases_event).unwrap(); + let expected = json!({ + "content": { + "aliases": [ "#somewhere:localhost" ] + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "prev_content": { + "aliases": [ "#somewhere:localhost" ] + }, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "state_key": "", + "type": "m.room.aliases", + }); + + assert_eq!(actual, expected); +} + +#[test] +fn serialize_aliases_without_prev_content() { + let aliases_event = StateEvent { + content: AnyStateEventContent::RoomAliases(AliasesEventContent { + aliases: vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()], + }), + event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), + origin_server_ts: UNIX_EPOCH + Duration::from_millis(1), + prev_content: None, + room_id: RoomId::try_from("!roomid:room.com").unwrap(), + sender: UserId::try_from("@carl:example.com").unwrap(), + state_key: "".to_string(), + unsigned: UnsignedData::default(), + }; + + let actual = to_json_value(&aliases_event).unwrap(); + let expected = json!({ + "content": { + "aliases": [ "#somewhere:localhost" ] + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "state_key": "", + "type": "m.room.aliases", + }); + + assert_eq!(actual, expected); +} + +#[test] +fn deserialize_aliases_content() { + let json_data = json!({ + "aliases": [ "#somewhere:localhost" ] + }); + + assert_matches!( + from_json_value::>(json_data) + .unwrap() + .deserialize_content("m.room.aliases") + .unwrap(), + AnyStateEventContent::RoomAliases(content) + if content.aliases == vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()] + ); +} + +#[test] +fn deserialize_aliases_with_prev_content() { + let json_data = json!({ + "content": { + "aliases": [ "#somewhere:localhost" ] + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "prev_content": { + "aliases": [ "#inner:localhost" ] + }, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "state_key": "", + "type": "m.room.aliases" + }); + + assert_matches!( + from_json_value::>>(json_data) + .unwrap() + .deserialize() + .unwrap(), + StateEvent { + content: AnyStateEventContent::RoomAliases(content), + event_id, + origin_server_ts, + prev_content: Some(AnyStateEventContent::RoomAliases(prev_content)), + room_id, + sender, + state_key, + unsigned, + } if content.aliases == vec![RoomAliasId::try_from("#somewhere:localhost").unwrap()] + && event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() + && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) + && prev_content.aliases == vec![RoomAliasId::try_from("#inner:localhost").unwrap()] + && room_id == RoomId::try_from("!roomid:room.com").unwrap() + && sender == UserId::try_from("@carl:example.com").unwrap() + && state_key == "" + && unsigned.is_empty() + ); +} + +#[test] +fn deserialize_avatar_without_prev_content() { + let json_data = json!({ + "content": { + "info": { + "h": 423, + "mimetype": "image/png", + "size": 84242, + "thumbnail_info": { + "h": 334, + "mimetype": "image/png", + "size": 82595, + "w": 800 + }, + "thumbnail_url": "mxc://matrix.org", + "w": 1011 + }, + "url": "http://www.matrix.org" + }, + "event_id": "$h29iv0s8:example.com", + "origin_server_ts": 1, + "room_id": "!roomid:room.com", + "sender": "@carl:example.com", + "state_key": "", + "type": "m.room.avatar" + }); + + assert_matches!( + from_json_value::>>(json_data) + .unwrap() + .deserialize() + .unwrap(), + StateEvent { + content: AnyStateEventContent::RoomAvatar(AvatarEventContent { + info: Some(info), + url, + }), + event_id, + origin_server_ts, + prev_content: None, + room_id, + sender, + state_key, + unsigned + } if event_id == EventId::try_from("$h29iv0s8:example.com").unwrap() + && origin_server_ts == UNIX_EPOCH + Duration::from_millis(1) + && room_id == RoomId::try_from("!roomid:room.com").unwrap() + && sender == UserId::try_from("@carl:example.com").unwrap() + && state_key == "" + && matches!( + info.as_ref(), + ImageInfo { + height, + width, + mimetype: Some(mimetype), + size, + thumbnail_info: Some(thumbnail_info), + thumbnail_url: Some(thumbnail_url), + thumbnail_file: None, + } if *height == UInt::new(423) + && *width == UInt::new(1011) + && *mimetype == "image/png" + && *size == UInt::new(84242) + && matches!( + thumbnail_info.as_ref(), + ThumbnailInfo { + width: thumb_width, + height: thumb_height, + mimetype: thumb_mimetype, + size: thumb_size, + } if *thumb_width == UInt::new(800) + && *thumb_height == UInt::new(334) + && *thumb_mimetype == Some("image/png".to_string()) + && *thumb_size == UInt::new(82595) + && *thumbnail_url == "mxc://matrix.org" + ) + ) + && url == "http://www.matrix.org" + && unsigned.is_empty() + ); +}