ruma_events/room/
canonical_alias.rs1use ruma_common::OwnedRoomAliasId;
6use ruma_macros::EventContent;
7use serde::{Deserialize, Serialize};
8
9use crate::EmptyStateKey;
10
11#[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)]
15#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
16#[ruma_event(type = "m.room.canonical_alias", kind = State, state_key_type = EmptyStateKey)]
17pub struct RoomCanonicalAliasEventContent {
18 #[serde(
23 default,
24 deserialize_with = "ruma_common::serde::empty_string_as_none",
25 skip_serializing_if = "Option::is_none"
26 )]
27 pub alias: Option<OwnedRoomAliasId>,
28
29 #[serde(default, skip_serializing_if = "Vec::is_empty")]
31 pub alt_aliases: Vec<OwnedRoomAliasId>,
32}
33
34impl RoomCanonicalAliasEventContent {
35 pub fn new() -> Self {
37 Self { alias: None, alt_aliases: Vec::new() }
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use ruma_common::{canonical_json::assert_to_canonical_json_eq, owned_room_alias_id};
44 use serde_json::{from_value as from_json_value, json};
45 use strass::assert_variant_eq;
46
47 use super::RoomCanonicalAliasEventContent;
48 use crate::OriginalStateEvent;
49
50 #[test]
51 fn serialization_with_optional_fields_as_none() {
52 let content = RoomCanonicalAliasEventContent {
53 alias: Some(owned_room_alias_id!("#somewhere:localhost")),
54 alt_aliases: Vec::new(),
55 };
56
57 assert_to_canonical_json_eq!(
58 content,
59 json!({
60 "alias": "#somewhere:localhost",
61 }),
62 );
63 }
64
65 #[test]
66 fn absent_field_as_none() {
67 let json_data = json!({
68 "content": {},
69 "event_id": "$h29iv0s8:example.com",
70 "origin_server_ts": 1,
71 "room_id": "!dummy:example.com",
72 "sender": "@carl:example.com",
73 "state_key": "",
74 "type": "m.room.canonical_alias"
75 });
76
77 assert_eq!(
78 from_json_value::<OriginalStateEvent<RoomCanonicalAliasEventContent>>(json_data)
79 .unwrap()
80 .content
81 .alias,
82 None
83 );
84 }
85
86 #[test]
87 fn null_field_as_none() {
88 let json_data = json!({
89 "content": {
90 "alias": null
91 },
92 "event_id": "$h29iv0s8:example.com",
93 "origin_server_ts": 1,
94 "room_id": "!dummy:example.com",
95 "sender": "@carl:example.com",
96 "state_key": "",
97 "type": "m.room.canonical_alias"
98 });
99 assert_eq!(
100 from_json_value::<OriginalStateEvent<RoomCanonicalAliasEventContent>>(json_data)
101 .unwrap()
102 .content
103 .alias,
104 None
105 );
106 }
107
108 #[test]
109 fn empty_field_as_none() {
110 let json_data = json!({
111 "content": {
112 "alias": ""
113 },
114 "event_id": "$h29iv0s8:example.com",
115 "origin_server_ts": 1,
116 "room_id": "!dummy:example.com",
117 "sender": "@carl:example.com",
118 "state_key": "",
119 "type": "m.room.canonical_alias"
120 });
121 assert_eq!(
122 from_json_value::<OriginalStateEvent<RoomCanonicalAliasEventContent>>(json_data)
123 .unwrap()
124 .content
125 .alias,
126 None
127 );
128 }
129
130 #[test]
131 fn nonempty_field_as_some() {
132 let json_data = json!({
133 "content": {
134 "alias": "#somewhere:localhost"
135 },
136 "event_id": "$h29iv0s8:example.com",
137 "origin_server_ts": 1,
138 "room_id": "!dummy:example.com",
139 "sender": "@carl:example.com",
140 "state_key": "",
141 "type": "m.room.canonical_alias"
142 });
143 assert_variant_eq!(
144 from_json_value::<OriginalStateEvent<RoomCanonicalAliasEventContent>>(json_data)
145 .unwrap()
146 .content
147 .alias,
148 Some("#somewhere:localhost")
149 );
150 }
151}