git-bot-feedback 0.9.0

A library designed for CI tools that posts comments on a Pull Request.
Documentation
use git_bot_feedback::client::{LocalClient, RestApiClient};

#[test]
fn local_is_none() {
    assert_eq!(LocalClient.workspace_root().unwrap(), None);
}

#[cfg(any(feature = "github", feature = "gitea"))]
mod ci {
    use git_bot_feedback::{RestClientError, client::init_client};
    use std::{env, path::PathBuf};

    const WORKSPACE: &str = "/home/runner/work/project";
    #[cfg(feature = "gitea")]
    const OTHER_WORKSPACE: &str = "/home/runner/work/other";

    fn assert_env_var_error(err: RestClientError, expected_name: &str) {
        match err {
            RestClientError::EnvVar { name, source } => {
                assert_eq!(name, expected_name);
                assert_eq!(source, env::VarError::NotPresent);
            }
            _ => panic!("expected an EnvVar error, got {err:?}"),
        }
    }

    #[cfg(feature = "github")]
    fn set_github_env(workspace: Option<&str>) {
        unsafe {
            env::set_var("GITHUB_ACTIONS", "true");
            env::remove_var("GITEA_ACTIONS");
            env::set_var("GITHUB_REPOSITORY", "2bndy5/git-bot-feedback");
            env::set_var("GITHUB_SHA", "DEADBEEF");
            env::set_var("GITHUB_EVENT_NAME", "push");
            env::set_var("GITHUB_API_URL", "https://api.github.com");
            match workspace {
                Some(path) => env::set_var("GITHUB_WORKSPACE", path),
                None => env::remove_var("GITHUB_WORKSPACE"),
            }
        }
    }

    #[cfg(feature = "github")]
    #[test]
    fn github_workspace() {
        set_github_env(Some(WORKSPACE));
        let client = init_client().unwrap();
        assert_eq!(client.client_kind(), "github");
        assert_eq!(
            client.workspace_root().unwrap(),
            Some(PathBuf::from(WORKSPACE))
        );
    }

    #[cfg(feature = "github")]
    #[test]
    fn github_without_workspace() {
        set_github_env(None);
        let client = init_client().unwrap();
        assert_env_var_error(client.workspace_root().unwrap_err(), "GITHUB_WORKSPACE");
    }

    #[cfg(feature = "gitea")]
    fn set_gitea_env(gitea_workspace: Option<&str>, github_workspace: Option<&str>) {
        unsafe {
            env::set_var("GITEA_ACTIONS", "true");
            env::set_var("GITEA_REPOSITORY", "2bndy5/git-bot-feedback");
            env::set_var("GITEA_SHA", "DEADBEEF");
            env::set_var("GITEA_EVENT_NAME", "push");
            env::set_var("GITEA_API_URL", "https://gitea.com/api/v1");
            for (name, value) in [
                ("GITEA_WORKSPACE", gitea_workspace),
                ("GITHUB_WORKSPACE", github_workspace),
            ] {
                match value {
                    Some(path) => env::set_var(name, path),
                    None => env::remove_var(name),
                }
            }
        }
    }

    #[cfg(feature = "gitea")]
    #[test]
    fn gitea_workspace() {
        set_gitea_env(Some(WORKSPACE), Some(OTHER_WORKSPACE));
        let client = init_client().unwrap();
        assert_eq!(client.client_kind(), "gitea");
        assert_eq!(
            client.workspace_root().unwrap(),
            Some(PathBuf::from(WORKSPACE))
        );
    }

    #[cfg(feature = "gitea")]
    #[test]
    fn gitea_falls_back_to_github_workspace() {
        set_gitea_env(None, Some(OTHER_WORKSPACE));
        let client = init_client().unwrap();
        assert_eq!(client.client_kind(), "gitea");
        assert_eq!(
            client.workspace_root().unwrap(),
            Some(PathBuf::from(OTHER_WORKSPACE))
        );
    }

    #[cfg(feature = "gitea")]
    #[test]
    fn gitea_without_workspace() {
        set_gitea_env(None, None);
        let client = init_client().unwrap();
        assert_eq!(client.client_kind(), "gitea");
        assert_env_var_error(
            client.workspace_root().unwrap_err(),
            "GITEA_WORKSPACE or GITHUB_WORKSPACE",
        );
    }
}