Skip to main content

ruma_events/room/
canonical_alias.rs

1//! Types for the [`m.room.canonical_alias`] event.
2//!
3//! [`m.room.canonical_alias`]: https://spec.matrix.org/v1.19/client-server-api/#mroomcanonical_alias
4
5use ruma_common::OwnedRoomAliasId;
6use ruma_macros::EventContent;
7use serde::{Deserialize, Serialize};
8
9use crate::EmptyStateKey;
10
11/// The content of an `m.room.canonical_alias` event.
12///
13/// Informs the room as to which alias is the canonical one.
14#[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    /// The canonical alias.
19    ///
20    /// Rooms with `alias: None` should be treated the same as a room
21    /// with no canonical alias.
22    #[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    /// List of alternative aliases to the room.
30    #[serde(default, skip_serializing_if = "Vec::is_empty")]
31    pub alt_aliases: Vec<OwnedRoomAliasId>,
32}
33
34impl RoomCanonicalAliasEventContent {
35    /// Creates an empty `RoomCanonicalAliasEventContent`.
36    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}