delay.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::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}