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::message::MessagePayload;
  9use crate::presence::PresencePayload;
 10use crate::util::helpers::PlainText;
 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 jid::BareJid;
 38    use std::convert::TryFrom;
 39    use std::str::FromStr;
 40
 41    #[cfg(target_pointer_width = "32")]
 42    #[test]
 43    fn test_size() {
 44        assert_size!(Delay, 68);
 45    }
 46
 47    #[cfg(target_pointer_width = "64")]
 48    #[test]
 49    fn test_size() {
 50        assert_size!(Delay, 120);
 51    }
 52
 53    #[test]
 54    fn test_simple() {
 55        let elem: Element =
 56            "<delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25Z'/>"
 57                .parse()
 58                .unwrap();
 59        let delay = Delay::try_from(elem).unwrap();
 60        assert_eq!(delay.from.unwrap(), BareJid::domain("capulet.com"));
 61        assert_eq!(
 62            delay.stamp,
 63            DateTime::from_str("2002-09-10T23:08:25Z").unwrap()
 64        );
 65        assert_eq!(delay.data, None);
 66    }
 67
 68    #[test]
 69    fn test_unknown() {
 70        let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>"
 71            .parse()
 72            .unwrap();
 73        let error = Delay::try_from(elem).unwrap_err();
 74        let message = match error {
 75            Error::ParseError(string) => string,
 76            _ => panic!(),
 77        };
 78        assert_eq!(message, "This is not a delay element.");
 79    }
 80
 81    #[test]
 82    fn test_invalid_child() {
 83        let elem: Element = "<delay xmlns='urn:xmpp:delay'><coucou/></delay>"
 84            .parse()
 85            .unwrap();
 86        let error = Delay::try_from(elem).unwrap_err();
 87        let message = match error {
 88            Error::ParseError(string) => string,
 89            _ => panic!(),
 90        };
 91        assert_eq!(message, "Unknown child in delay element.");
 92    }
 93
 94    #[test]
 95    fn test_serialise() {
 96        let elem: Element = "<delay xmlns='urn:xmpp:delay' stamp='2002-09-10T23:08:25+00:00'/>"
 97            .parse()
 98            .unwrap();
 99        let delay = Delay {
100            from: None,
101            stamp: DateTime::from_str("2002-09-10T23:08:25Z").unwrap(),
102            data: None,
103        };
104        let elem2 = delay.into();
105        assert_eq!(elem, elem2);
106    }
107
108    #[test]
109    fn test_serialise_data() {
110        let elem: Element = "<delay xmlns='urn:xmpp:delay' from='juliet@example.org' stamp='2002-09-10T23:08:25+00:00'>Reason</delay>".parse().unwrap();
111        let delay = Delay {
112            from: Some(Jid::Bare(BareJid::new("juliet", "example.org"))),
113            stamp: DateTime::from_str("2002-09-10T23:08:25Z").unwrap(),
114            data: Some(String::from("Reason")),
115        };
116        let elem2 = delay.into();
117        assert_eq!(elem, elem2);
118    }
119}