benchie 0.5.0

A benchmarking tool
Documentation
mod common;

use crate::common::{build_git_repo, commit};
use benchie::{read_git_info, GitError};
use common::with_temp_dir;
use git2::Repository;
use serial_test::serial;
use std::fs;
use std::process::Command;

#[test]
#[serial]
fn git_info_without_git_repo() {
    with_temp_dir(|_| {
        let result = read_git_info();

        assert!(matches!(result, Err(GitError::NotFound)));
    });
}

#[test]
#[serial]
fn git_info_of_fresh_git_repo() {
    with_temp_dir(|dir| {
        let _ = Repository::init(dir.path()).unwrap();

        let result = read_git_info();

        assert!(matches!(result, Err(GitError::NoCommit)));
    });
}

#[test]
#[serial]
fn git_info_of_repo_with_head() {
    with_temp_dir(|dir| {
        build_git_repo(dir.path());

        let result = read_git_info();

        assert!(result.is_ok());

        let info = result.unwrap();
        assert!(!info.is_dirty);
    });
}

#[test]
#[serial]
fn git_info_of_dirty_repository() {
    with_temp_dir(|dir| {
        build_git_repo(dir.path());
        let _ = fs::write("./README.md", "# Header and new content");

        let result = read_git_info();

        assert!(result.is_ok());

        let info = result.unwrap();
        assert!(info.is_dirty);
    });
}

#[test]
#[serial]
fn git_info_of_repo_with_commit_history() {
    with_temp_dir(|dir| {
        build_git_repo(dir.path());
        let _ = fs::write("./README.md", "# Header and new content");

        commit(&["README.md"], "update");

        let result = read_git_info();

        assert!(result.is_ok());

        let info = result.unwrap();
        assert!(!info.is_dirty);
        assert_eq!(
            info.commit_id.len(),
            40,
            "valid commit hash is 40 chars long"
        );
        assert_eq!(
            info.commit_message, "update",
            "verify that we get the latest commit message"
        );
    });
}

#[test]
#[serial]
fn git_info_if_repo_is_not_at_head_commit() {
    with_temp_dir(|dir| {
        build_git_repo(dir.path());
        let _ = fs::write("./README.md", "# Header and new content");

        commit(&["README.md"], "update");

        let _ = Command::new("git")
            .args(["checkout", "HEAD~1"])
            .output()
            .expect("failed to execute process");

        let result = read_git_info();

        assert!(result.is_ok());

        let info = result.unwrap();
        assert!(!info.is_dirty);
        assert_eq!(
            info.commit_id.len(),
            40,
            "valid commit hash is 40 chars long"
        );
        assert_eq!(
            info.commit_message, "initial commit",
            "verify that we get the latest commit message"
        );
    });
}