forwarding.rs

 1// Copyright (c) 2017 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
 2//
 3// This Source Code Form is subject to the terms of the Mozilla Public
 4// License, v. 2.0. If a copy of the MPL was not distributed with this
 5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 6
 7use crate::delay::Delay;
 8use crate::message::Message;
 9
10generate_element!(
11    /// Contains a forwarded stanza, either standalone or part of another
12    /// extension (such as carbons).
13    Forwarded, "forwarded", FORWARD,
14    children: [
15        /// When the stanza originally got sent.
16        delay: Option<Delay> = ("delay", DELAY) => Delay,
17
18        // XXX: really?  Option?
19        /// The stanza being forwarded.
20        stanza: Option<Message> = ("message", DEFAULT_NS) => Message
21
22        // TODO: also handle the two other stanza possibilities.
23    ]
24);
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use crate::Element;
30    use xso::error::{Error, FromElementError};
31
32    #[cfg(target_pointer_width = "32")]
33    #[test]
34    fn test_size() {
35        assert_size!(Forwarded, 140);
36    }
37
38    #[cfg(target_pointer_width = "64")]
39    #[test]
40    fn test_size() {
41        assert_size!(Forwarded, 264);
42    }
43
44    #[test]
45    fn test_simple() {
46        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'/>".parse().unwrap();
47        Forwarded::try_from(elem).unwrap();
48    }
49
50    #[test]
51    fn test_invalid_child() {
52        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'><coucou/></forwarded>"
53            .parse()
54            .unwrap();
55        let error = Forwarded::try_from(elem).unwrap_err();
56        let message = match error {
57            FromElementError::Invalid(Error::Other(string)) => string,
58            _ => panic!(),
59        };
60        assert_eq!(message, "Unknown child in forwarded element.");
61    }
62
63    #[test]
64    fn test_serialise() {
65        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'/>".parse().unwrap();
66        let forwarded = Forwarded {
67            delay: None,
68            stanza: None,
69        };
70        let elem2 = forwarded.into();
71        assert_eq!(elem, elem2);
72    }
73
74    #[test]
75    fn test_serialize_with_delay_and_stanza() {
76        let reference: Element = "<forwarded xmlns='urn:xmpp:forward:0'><delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25+00:00'/><message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/></forwarded>"
77        .parse()
78        .unwrap();
79
80        let elem: Element = "<message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/>"
81          .parse()
82          .unwrap();
83        let message = Message::try_from(elem).unwrap();
84
85        let elem: Element =
86            "<delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25Z'/>"
87                .parse()
88                .unwrap();
89        let delay = Delay::try_from(elem).unwrap();
90
91        let forwarded = Forwarded {
92            delay: Some(delay),
93            stanza: Some(message),
94        };
95
96        let serialized: Element = forwarded.into();
97        assert_eq!(serialized, reference);
98    }
99}