neust 0.0.1

NEU CAS binding for Rust.
Documentation
#![allow(dead_code)]

use tokio;

use neust::auth::Credential;
use neust::Result;
use neust::UserStatus;
use neust::{auth::Token, Session};

#[ignore]
#[tokio::test]
async fn test_login() {
    let session = Session::new();
    let auth = get_credential();
    let token_a = extract_token(session.login(&auth).await);
    let token_b = extract_token(session.check_status().await);
    assert_eq!(token_a, token_b);

    let session = Session::new();
    let auth = Token::new(token_a.clone());
    let token_c = extract_token(session.login(&auth).await);
    assert_eq!(token_a, token_c);
}

#[cfg(feature = "webvpn")]
#[ignore]
#[tokio::test]
async fn test_login_via_webvpn() {
    let session = Session::new();
    let auth = get_credential();
    extract_token(session.login(&auth).await);

    let token_a = extract_token(session.login_via_webvpn(&auth).await);
    let token_b = extract_token(session.check_status_via_webvpn().await);

    assert_eq!(token_a, token_b);

    let session = Session::new();
    let auth = Token::new(token_a.clone());
    let token_c = extract_token(session.login_via_webvpn(&auth).await);
    assert_eq!(token_a, token_c);
}

macro_rules! read_env {
    ($name:expr) => {
        std::env::var($name).expect(concat!("missing env `", $name, "` for test"))
    };
}

fn extract_token(result: Result<UserStatus>) -> String {
    let status = result.expect("some error occurs due to network or the CAS");
    if let UserStatus::Active { username, token } = status {
        assert_eq!(read_env!("TEST_USERNAME"), username);
        assert_ne!(token.len(), 0);
        token
    } else {
        panic!("something wrong, please check account status: {}", status);
    }
}

fn get_credential() -> Credential {
    Credential::new(read_env!("TEST_USERNAME"), read_env!("TEST_PASSWORD"))
}