thot-local 0.10.0-intermediate

Local functionality for Thot data management and analysis software.
Documentation
use fake::Fake;
use crate::system::resources::project::Project;
use crate::result::{Error, ResourceError};
use fake::locales::EN;
use fake::faker::filesystem::raw::DirPath;
use super::*;
use crate::types::ResourceId;

#[test]
fn register_project_should_work() {
    let prj = create_project();
    let rid = prj.rid.clone();
    register_project(prj).expect("register__project should work");

    let projects = load_projects().expect("load_projects should work");
    let mut prjs = projects.projects;
    prjs.retain(|p| p.rid == rid);

    assert_eq!(
        1, prjs.len(),
        "zero or more than one matching project found"
    );
}

#[test]
fn register_project_should_error_if_id_already_exists(){
    let prj0 = create_project();
    let prj1 = prj0.clone();

    register_project(prj0).expect("register_project should work");
    match register_project(prj1) {
        Err(Error::ResourceError(ResourceError::DuplicateId(_))) => {},  // expected error
        res => panic!("Unexpected result. Expected duplicate id error found {:?}", res),
    };
}

#[test]
fn deregister_project_should_work() {
    let prj = create_project();
    register_project(prj.clone()).expect("register_project should work");
    deregister_project(&prj.rid).expect("deregister_project should work");

    let projects = load_projects().expect("load_projects should work");
    let mut prjs = projects.projects.clone();
    prjs.retain(|p| p.rid == prj.rid);

    assert_eq!(
        0, prjs.len(),
        "project not removed"
    );
}

#[test]
fn deregister_project_should_exit_silently_if_project_did_not_exist() {
    let prj = create_project();
    deregister_project(&prj.rid).expect("deregister_project should work");
}

#[test]
fn project_by_id_should_work() {
    let prj = create_project();
    let rid = prj.rid.clone();
    register_project(prj).expect("register_project should work");

    let found_prj = project_by_id(&rid).expect("project should be found").unwrap();
    assert_eq!(
        rid, found_prj.rid,
        "resource ids should match"
    );

    // clean up
    deregister_project(&rid).expect("deregister_project should work");
}

#[test]
fn project_by_id_should_return_none_if_project_does_not_exist() {
    let prj = create_project();
    let prj = project_by_id(&prj.rid).expect("should not error");

    assert_eq!(
        None, prj,
        "project should be none"
    );
}

#[test]
fn project_by_id_should_error_if_multiple_projects_exist() {
    let prj0 = create_project();
    let prj1 = prj0.clone();
    let rid = prj0.rid.clone();

    let mut projects = load_projects().expect("load_projects should work");
    projects.projects.push(prj0);
    projects.projects.push(prj1);
    projects.save().expect("saving projects should work");
    drop(projects); // free projects

    match project_by_id(&rid) {
        Err(Error::ResourceError(ResourceError::DuplicateId(eid))) => {
            assert_eq!(
                rid, eid,
                "incorrect resource id"
            )
        },
        _ => panic!("project_by_id did not error"),
    };

    // clean up
    deregister_project(&rid).expect("deregister_project should work");
}

// ************************
// *** helper functions ***
// ************************

fn create_project() -> Project {
    let rid = ResourceId::new();
    let path = DirPath(EN).fake();
    Project::new(rid, path)
}