consul 0.4.2

Rust client libray for Consul HTTP API
Documentation
extern crate consul;
extern crate rand;

use consul::session::{Session, SessionEntry};
use consul::{Client, Config};
use rand::distributions::Alphanumeric;
use rand::{thread_rng, Rng};
use rstest::*;

#[rstest]
fn session_create_test() {
    let (client, unique_test_identifier) = set_up();

    assert_eq!(
        get_number_of_session_entries_with_matching_name(&client, &unique_test_identifier),
        0
    );

    let entry = SessionEntry {
        Name: Some(unique_test_identifier.to_string()),
        ..Default::default()
    };

    let (created_session_entry, _) = client.create(&entry, None).unwrap();

    assert_eq!(
        get_number_of_session_entries_with_matching_name(&client, &unique_test_identifier),
        1
    );

    tear_down(&client, &created_session_entry.ID.unwrap());
}

#[rstest]
fn session_destroy_test() {
    let (client, unique_test_identifier) = set_up();

    let entry = SessionEntry {
        Name: Some(unique_test_identifier.to_string()),
        ..Default::default()
    };

    let (created_session_entry, _) = client.create(&entry, None).unwrap();

    assert_eq!(
        get_number_of_session_entries_with_matching_name(&client, &unique_test_identifier),
        1
    );

    let created_session_entry_id = created_session_entry.ID.unwrap();

    client.destroy(&created_session_entry_id, None).unwrap();

    assert_eq!(
        get_number_of_session_entries_with_matching_name(&client, &unique_test_identifier),
        0
    );

    tear_down(&client, &created_session_entry_id);
}

#[rstest]
fn session_info_test() {
    let (client, unique_test_identifier) = set_up();

    let entry = SessionEntry {
        Name: Some(unique_test_identifier.to_string()),
        ..Default::default()
    };

    let (created_session_entry, _) = client.create(&entry, None).unwrap();

    let created_session_entry_id = created_session_entry.ID.unwrap();

    let (session_entries, _) = client.info(&created_session_entry_id, None).unwrap();

    assert_eq!(session_entries.len(), 1);

    let session_entry = session_entries.get(0);

    assert_eq!(
        *session_entry.as_ref().unwrap().Name.as_ref().unwrap(),
        unique_test_identifier
    );

    tear_down(&client, &created_session_entry_id);
}

#[rstest]
fn session_list_test() {
    let (client, unique_test_identifier) = set_up();

    let entry_names = vec![
        format!("{}-1", unique_test_identifier),
        format!("{}-2", unique_test_identifier),
        format!("{}-3", unique_test_identifier),
    ];

    let mut session_ids = Vec::<String>::new();

    for entry_name in &entry_names {
        let entry = SessionEntry {
            Name: Some(entry_name.to_string()),
            ..Default::default()
        };

        let (created_session_entry, _) = client.create(&entry, None).unwrap();

        session_ids.push(created_session_entry.ID.unwrap());
    }

    let (session_entries, _) = client.list(None).unwrap();

    let filtered_session_entries = session_entries
        .iter()
        .filter(|s| s.Name.as_ref().unwrap().contains(&unique_test_identifier))
        .collect::<Vec<&SessionEntry>>();

    assert_eq!(filtered_session_entries.len(), 3);

    let mut filtered_session_entry_names = filtered_session_entries
        .iter()
        .map(|s| s.Name.as_ref().unwrap().to_string())
        .collect::<Vec<String>>();

    filtered_session_entry_names.sort();

    assert_eq!(filtered_session_entry_names, entry_names);

    for session_id in session_ids {
        tear_down(&client, &session_id);
    }
}

#[rstest]
fn session_node_test() {
    let (client, unique_test_identifier) = set_up();

    let entry = SessionEntry {
        Name: Some(unique_test_identifier.to_string()),
        ..Default::default()
    };

    let (created_session_entry, _) = client.create(&entry, None).unwrap();

    let created_session_entry_id = created_session_entry.ID.unwrap();

    let system_hostname = hostname::get().unwrap().into_string().unwrap();

    let (session_entries, _) = client.node(&system_hostname, None).unwrap();

    let filtered_session_entries: Vec<&SessionEntry> = session_entries
        .iter()
        .filter(|s| s.Name.as_ref().unwrap() == &unique_test_identifier)
        .collect();

    assert_eq!(filtered_session_entries.len(), 1);

    tear_down(&client, &created_session_entry_id);
}

#[rstest]
fn session_renew_test() {
    let (client, unique_test_identifier) = set_up();

    let entry = SessionEntry {
        Name: Some(unique_test_identifier),
        ..Default::default()
    };

    let (created_session_entry, _) = client.create(&entry, None).unwrap();

    let created_session_entry_id = created_session_entry.ID.unwrap();

    client.renew(&created_session_entry_id, None).unwrap();

    tear_down(&client, &created_session_entry_id);
}

fn set_up() -> (Client, String) {
    let config = Config::new().unwrap();
    let client = Client::new(config);

    let unique_test_identifier: String = thread_rng()
        .sample_iter(&Alphanumeric)
        .take(16)
        .map(char::from)
        .collect();

    (client, unique_test_identifier)
}

fn tear_down(client: &Client, session_id: &str) {
    client.destroy(session_id, None).unwrap();
}

fn get_number_of_session_entries_with_matching_name(
    client: &Client,
    unique_test_identifier: &str,
) -> usize {
    let (session_entries, _) = client.list(None).unwrap();

    let filtered_session_entries: Vec<&SessionEntry> = session_entries
        .iter()
        .filter(|s| s.Name.as_ref().unwrap() == unique_test_identifier)
        .collect();

    filtered_session_entries.len()
}