rants 0.6.0

An async NATS client library.
Documentation
use super::*;
use crate::{types::*, util::*};

#[test]
fn parse_subject() {
    let s = "FOO";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "BAR";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "foo.bar";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "foo.BAR";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "FOO.BAR";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "FOO.BAR.BAZ";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "*";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = ">";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "foo.>";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "foo.*.baz";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "foo.>";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);
    let s = "foo.a-b_c+d#e";
    assert_eq!(&s.parse::<Subject>().unwrap().to_string(), s);

    assert!("FOO. BAR".parse::<Subject>().is_err());
    assert!("".parse::<Subject>().is_err());
    assert!("foo.".parse::<Subject>().is_err());
    assert!(".bar ".parse::<Subject>().is_err());
    assert!("foo..bar".parse::<Subject>().is_err());
    assert!("foo*.bar".parse::<Subject>().is_err());
    assert!("f*o.b*r".parse::<Subject>().is_err());
    assert!("foo>".parse::<Subject>().is_err());
    assert!("foo>.bar".parse::<Subject>().is_err());
    assert!(">.bar".parse::<Subject>().is_err());
}

#[test]
fn parse_info() {
    assert_eq!(
        ServerControl::from_str(
            "INFO {\"server_id\":\"Zk0GQ3JBSrg3oyxCRRlE09\",\"\
             version\":\"1.2.0\",\"proto\":1,\"go\":\"go1.10.3\",\"\
             host\":\"0.0.0.0\",\"port\":4222,\"max_payload\":\
             1048576,\"client_id\":2392}\r\n"
        )
        .unwrap(),
        ServerControl::Info(Info {
            server_id: String::from("Zk0GQ3JBSrg3oyxCRRlE09"),
            version: String::from("1.2.0"),
            go: String::from("go1.10.3"),
            host: String::from("0.0.0.0"),
            port: 4222,
            max_payload: 1048576,
            proto: 1,
            client_id: Some(2392),
            auth_required: false,
            tls_required: false,
            tls_verify: false,
            connect_urls: Vec::new(),
        })
    );

    assert_eq!(
        ServerControl::from_str(
            "INFO {\"server_id\":\"EIcTs1hcrlywWCrsUATcqP\",\"version\":\"1.1.0\",\
             \"git_commit\":\"add6d79\",\"go\":\"go1.9.4\",\"host\":\"0.0.0.0\",\
             \"port\":4222,\"auth_required\":false,\"tls_required\":false,\
             \"tls_verify\":false,\"max_payload\":1048576} \r\n"
        )
        .unwrap(),
        ServerControl::Info(Info {
            server_id: String::from("EIcTs1hcrlywWCrsUATcqP"),
            version: String::from("1.1.0"),
            go: String::from("go1.9.4"),
            host: String::from("0.0.0.0"),
            port: 4222,
            max_payload: 1048576,
            proto: 0,
            client_id: None,
            auth_required: false,
            tls_required: false,
            tls_verify: false,
            connect_urls: Vec::new(),
        })
    );
}

#[test]
fn parse_msg() {
    let s = Subject::from_str("FOO.BAR").unwrap();
    assert_eq!(
        control_line("MSG FOO.BAR 9 1032\r\n").unwrap().1,
        ServerControl::Msg {
            subject: s,
            sid: 9,
            reply_to: None,
            len: 1032,
        }
    );

    let s = Subject::from_str("FOO.BAR").unwrap();
    let s2 = Subject::from_str("INBOX.34").unwrap();
    assert_eq!(
        ServerControl::from_str("MSG FOO.BAR 9 INBOX.34 11\r\n").unwrap(),
        ServerControl::Msg {
            subject: s,
            sid: 9,
            reply_to: Some(s2),
            len: 11,
        }
    );
    assert!(ServerControl::from_str("MSG FOO.BAR 9 INBOX.34 abc\r\n").is_err());
}

#[test]
fn parse_ping() {
    assert_eq!(
        ServerControl::from_str("PiNG\r\n").unwrap(),
        ServerControl::Ping
    );
}

#[test]
fn parse_pong() {
    assert_eq!(
        ServerControl::from_str("poNG\r\n").unwrap(),
        ServerControl::Pong
    );
}

#[test]
fn parse_ok() {
    assert_eq!(
        ServerControl::from_str("+ok\r\n").unwrap(),
        ServerControl::Ok
    );
    assert_eq!(
        ServerControl::from_str("+OK\r\n").unwrap(),
        ServerControl::Ok
    );
}

#[test]
fn parse_err() {
    let m = format!("-err '{}'\r\n", UNKNOWN_PROTOCOL_OPERATION);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::UnknownProtocolOperation)
    );

    let m = format!("-err '{}'\r\n", UNKNOWN_PROTOCOL_OPERATION);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::UnknownProtocolOperation)
    );
    let m = format!("-err '{}'\r\n", ATTEMPTED_TO_CONNECT_TO_ROUTE_PORT);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::AttemptedToConnectToRoutePort)
    );
    let m = format!("-err '{}'\r\n", AUTHORIZATION_VIOLATION);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::AuthorizationViolation)
    );
    let m = format!("-err '{}'\r\n", AUTHORIZATION_TIMEOUT);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::AuthorizationTimeout)
    );
    let m = format!("-err '{}'\r\n", INVALID_CLIENT_PROTOCOL);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::InvalidClientProtocol)
    );
    let m = format!("-err '{}'\r\n", MAXIMUM_CONTROL_LINE_EXCEEDED);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::MaximumControlLineExceeded)
    );
    let m = format!("-err '{}'\r\n", PARSER_ERROR);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::ParserError)
    );
    let m = format!("-err '{}'\r\n", SECURE_CONNECTION_TLS_REQUIRED);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::SecureConnectionTlsRequired)
    );
    let m = format!("-err '{}'\r\n", STALE_CONNECTION);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::StaleConnection)
    );
    let m = format!("-err '{}'\r\n", MAXIMUM_CONNECTIONS_EXCEEDED);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::MaximumConnectionsExceeded)
    );
    let m = format!("-err '{}'\r\n", SLOW_CONSUMER);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::SlowConsumer)
    );
    let m = format!("-err '{}'\r\n", MAXIMUM_PAYLOAD_VIOLATION);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::MaximumPayloadViolation)
    );
    let m = format!("-err '{}'\r\n", INVALID_SUBJECT);
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::InvalidSubject)
    );
    let s = Subject::from_str("test.x.*.y.>").unwrap();

    let m = format!(
        "-err '{} test.x.*.y.>'\r\n",
        PERMISSIONS_VIOLATION_FOR_SUBSCRIPTION
    );
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::PermissionsViolationForSubscription(
            s.clone()
        ))
    );
    let m = format!(
        "-err '{} test.x.*.y.>'\r\n",
        PERMISSIONS_VIOLATION_FOR_PUBLISH
    );
    assert_eq!(
        ServerControl::from_str(&m).unwrap(),
        ServerControl::Err(ProtocolError::PermissionsViolationForPublish(s))
    );
}

#[test]
fn parse_fails() {
    assert!(ServerControl::from_str("+ok").is_err());
    assert!(ServerControl::from_str("+ok\r\n some more").is_err());
    assert!(ServerControl::from_str("+err 'test'\r\n").is_err());
    assert!(ServerControl::from_str("some_random_text\r\n").is_err());
}