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}