message_correct.rs

 1use minidom::Element;
 2
 3use error::Error;
 4
 5use ns;
 6
 7#[derive(Debug, Clone)]
 8pub struct Replace {
 9    pub id: String,
10}
11
12pub fn parse_replace(root: &Element) -> Result<Replace, Error> {
13    if !root.is("replace", ns::MESSAGE_CORRECT) {
14        return Err(Error::ParseError("This is not a replace element."));
15    }
16    for _ in root.children() {
17        return Err(Error::ParseError("Unknown child in replace element."));
18    }
19    let id = match root.attr("id") {
20        Some(id) => id.to_owned(),
21        None => return Err(Error::ParseError("No 'id' attribute present in replace.")),
22    };
23    Ok(Replace { id: id })
24}
25
26pub fn serialise(replace: &Replace) -> Element {
27    Element::builder("replace")
28            .ns(ns::MESSAGE_CORRECT)
29            .attr("id", replace.id.clone())
30            .build()
31}
32
33#[cfg(test)]
34mod tests {
35    use minidom::Element;
36    use error::Error;
37    use message_correct;
38
39    #[test]
40    fn test_simple() {
41        let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0' id='coucou'/>".parse().unwrap();
42        message_correct::parse_replace(&elem).unwrap();
43    }
44
45    #[test]
46    fn test_invalid_child() {
47        let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'><coucou/></replace>".parse().unwrap();
48        let error = message_correct::parse_replace(&elem).unwrap_err();
49        let message = match error {
50            Error::ParseError(string) => string,
51            _ => panic!(),
52        };
53        assert_eq!(message, "Unknown child in replace element.");
54    }
55
56    #[test]
57    fn test_invalid_id() {
58        let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>".parse().unwrap();
59        let error = message_correct::parse_replace(&elem).unwrap_err();
60        let message = match error {
61            Error::ParseError(string) => string,
62            _ => panic!(),
63        };
64        assert_eq!(message, "No 'id' attribute present in replace.");
65    }
66
67    #[test]
68    fn test_serialise() {
69        let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0' id='coucou'/>".parse().unwrap();
70        let replace = message_correct::Replace { id: String::from("coucou") };
71        let elem2 = message_correct::serialise(&replace);
72        assert_eq!(elem, elem2);
73    }
74}