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::date::DateTime;
8use crate::util::helpers::PlainText;
9use crate::message::MessagePayload;
10use crate::presence::PresencePayload;
11use jid::Jid;
12
13generate_element!(
14 /// Notes when and by whom a message got stored for later delivery.
15 Delay, "delay", DELAY,
16 attributes: [
17 /// The entity which delayed this message.
18 from: Option<Jid> = "from",
19
20 /// The time at which this message got stored.
21 stamp: Required<DateTime> = "stamp"
22 ],
23 text: (
24 /// The optional reason this message got delayed.
25 data: PlainText<Option<String>>
26 )
27);
28
29impl MessagePayload for Delay {}
30impl PresencePayload for Delay {}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 use crate::util::error::Error;
36 use crate::Element;
37 use std::str::FromStr;
38 use std::convert::TryFrom;
39
40 #[cfg(target_pointer_width = "32")]
41 #[test]
42 fn test_size() {
43 assert_size!(Delay, 68);
44 }
45
46 #[cfg(target_pointer_width = "64")]
47 #[test]
48 fn test_size() {
49 assert_size!(Delay, 120);
50 }
51
52 #[test]
53 fn test_simple() {
54 let elem: Element =
55 "<delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25Z'/>"
56 .parse()
57 .unwrap();
58 let delay = Delay::try_from(elem).unwrap();
59 assert_eq!(delay.from, Some(Jid::from_str("capulet.com").unwrap()));
60 assert_eq!(
61 delay.stamp,
62 DateTime::from_str("2002-09-10T23:08:25Z").unwrap()
63 );
64 assert_eq!(delay.data, None);
65 }
66
67 #[test]
68 fn test_unknown() {
69 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>"
70 .parse()
71 .unwrap();
72 let error = Delay::try_from(elem).unwrap_err();
73 let message = match error {
74 Error::ParseError(string) => string,
75 _ => panic!(),
76 };
77 assert_eq!(message, "This is not a delay element.");
78 }
79
80 #[test]
81 fn test_invalid_child() {
82 let elem: Element = "<delay xmlns='urn:xmpp:delay'><coucou/></delay>"
83 .parse()
84 .unwrap();
85 let error = Delay::try_from(elem).unwrap_err();
86 let message = match error {
87 Error::ParseError(string) => string,
88 _ => panic!(),
89 };
90 assert_eq!(message, "Unknown child in delay element.");
91 }
92
93 #[test]
94 fn test_serialise() {
95 let elem: Element = "<delay xmlns='urn:xmpp:delay' stamp='2002-09-10T23:08:25+00:00'/>"
96 .parse()
97 .unwrap();
98 let delay = Delay {
99 from: None,
100 stamp: DateTime::from_str("2002-09-10T23:08:25Z").unwrap(),
101 data: None,
102 };
103 let elem2 = delay.into();
104 assert_eq!(elem, elem2);
105 }
106
107 #[test]
108 fn test_serialise_data() {
109 let elem: Element = "<delay xmlns='urn:xmpp:delay' from='juliet@example.org' stamp='2002-09-10T23:08:25+00:00'>Reason</delay>".parse().unwrap();
110 let delay = Delay {
111 from: Some(Jid::from_str("juliet@example.org").unwrap()),
112 stamp: DateTime::from_str("2002-09-10T23:08:25Z").unwrap(),
113 data: Some(String::from("Reason")),
114 };
115 let elem2 = delay.into();
116 assert_eq!(elem, elem2);
117 }
118}