redis-graph 0.4.4

API for Redis graph database types.
Documentation
extern crate redis;
extern crate redis_graph;

#[cfg(test)]
#[path = "./test_graph_assertions.rs"]
mod test_graph_assertions;

use redis::{Commands, Connection};
use redis_graph::*;
use std::env;
use test_graph_assertions::*;

fn get_con() -> Connection {
    let client = redis::Client::open(get_redis_url()).unwrap();
    client
        .get_connection()
        .expect("Failed to get redis connection!")
}

fn ensure_simple_data(name: &str) {
    let mut con = get_con();
    let _: () = con.del(name).unwrap();
    let _ = con.graph_query(
        name,
        "CREATE (:person {name:'Pam', age:27})-[:works {since: 2010}]->(:employer {name:'Dunder Mifflin'})"
    );
}

fn ensure_test_data(name: &str) {
    let mut con = get_con();
    let _: () = con.del(name).unwrap();
    let _ = con.graph_query(
        name,
        "CREATE (:Rider {name:'Valentino Rossi', born:1979})-[:rides]->(:Team {name:'Yamaha'}), \
        (:Rider {name:'Dani Pedrosa', born:1985})-[:rides]->(:Team {name:'Honda'}), \
        (:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})",
    );
}

#[test]
fn test_issue_graph_create_command() {
    let _: () = get_con().del("test_issue_graph_create_command").unwrap();
    let r = get_con().graph_query(
        "test_issue_graph_create_command", 
        "CREATE (:person {name:'Pam', age:27})-[:works {since: 2010}]->(:employer {name:'Dunder Mifflin'})"
    ).unwrap();
    check_graph_create_command(r);
}

#[test]
fn test_match_query_result() {
    ensure_simple_data("test_match_query_result");

    let r = get_con()
        .graph_query(
            "test_match_query_result",
            "MATCH (n1)-[r]->(n2) RETURN n1, r, n2.name",
        )
        .unwrap();

    check_match_query_result(r);
}

#[test]
fn test_match_ro_query_result() {
    ensure_simple_data("test_match_ro_query_result");

    let r = get_con()
        .graph_ro_query(
            "test_match_ro_query_result",
            "MATCH (n1)-[r]->(n2) RETURN n1, r, n2.name",
        )
        .unwrap();

    check_match_query_result(r);
}

#[test]
fn test_match_scalar_result() {
    ensure_test_data("test_match_scalar_result");
    let res = get_con()
        .graph_query(
            "test_match_scalar_result",
            "MATCH (r:Rider)-[:rides]->(t:Team) WHERE t.name = 'Yamaha' RETURN r.name, t.name",
        )
        .unwrap();
    check_match_scalar_result(res);
}

#[test]
fn test_query_all_nodes() {
    ensure_test_data("test_query_all_nodes");
    let res = get_con()
        .graph_query("test_query_all_nodes", "MATCH (r:Rider) RETURN r")
        .unwrap();
    check_query_all_nodes(res);
}

#[test]
fn test_unserialize_option() {
    ensure_test_data("test_unserialize_option");
    let res = get_con()
        .graph_query("test_unserialize_option", "MATCH (r:Rider) RETURN r.born")
        .unwrap();
    check_unserialize_option(res);
}

#[test]
fn test_graph_profile() {
    ensure_test_data("test_graph_profile");
    let res: Vec<String> = get_con()
        .graph_profile("test_graph_profile", "MATCH (r:Rider) RETURN r")
        .unwrap();
    check_graph_profile(res);
}

#[test]
fn test_graph_slowlog() {
    ensure_test_data("test_graph_slowlog");
    let res = get_con().graph_slowlog("test_graph_slowlog").unwrap();
    check_graph_slowlog(res);
}

#[test]
fn test_graph_config_set() {
    let err_res = get_con().graph_config_set("SOME", 1000);
    check_graph_config_set_invalid(err_res);
    let res = get_con().graph_config_set("RESULTSET_SIZE", 500);
    check_graph_config_set_valid(res);
}

#[test]
fn test_graph_config_get() {
    let _ = get_con().graph_config_set("RESULTSET_SIZE", 500).unwrap();
    check_graph_config_get(get_con().graph_config_get("RESULTSET_SIZE"));
}

#[test]
fn test_graph_config_get_all() {
    let _ = get_con().graph_config_set("RESULTSET_SIZE", 500).unwrap();
    check_graph_config_get_all(get_con().graph_config_get_all().unwrap());
}

#[test]
fn test_graph_delete() {
    ensure_test_data("test_graph_delete");
    check_graph_delete_success(get_con().graph_delete("test_graph_delete"));
}

#[test]
fn test_graph_explain() {
    ensure_test_data("test_graph_explain");
    check_graph_explain_result(
        get_con().graph_explain("test_graph_explain", "MATCH (r:Rider) RETURN r"),
    );
}

fn get_redis_url() -> String {
    let redis_host_key = "REDIS_HOST";
    let redis_host_port = "REDIS_PORT";

    let redis_host = match env::var(redis_host_key) {
        Ok(host) => host,
        _ => "localhost".to_string(),
    };

    let redis_port = match env::var(redis_host_port) {
        Ok(port) => port,
        _ => "6379".to_string(),
    };

    format!("redis://{}:{}/", redis_host, redis_port)
}