use super::{
GH_TOKEN_ENV_VAR, GH_USER_ENV_VAR, find_pinned_gh_account, resolve_gh_account_env_for_registry,
resolve_gh_account_env_with,
};
use crate::project::Project;
use crate::project::ProjectRegistry;
#[test]
fn resolve_gh_account_env_with_unset_is_none() {
let result = resolve_gh_account_env_with(None, |_| Ok("unused".to_string()));
assert!(result.is_none());
}
#[test]
fn resolve_gh_account_env_with_blank_is_none() {
let result = resolve_gh_account_env_with(Some(" "), |_| Ok("unused".to_string()));
assert!(result.is_none());
}
#[test]
fn resolve_gh_account_env_with_success_returns_token_and_user() {
let result = resolve_gh_account_env_with(Some("bobmatnyc"), |account| {
assert_eq!(account, "bobmatnyc");
Ok("ghp_fake_token".to_string())
});
let vars = result.expect("some").expect("ok");
assert_eq!(
vars,
vec![
(GH_TOKEN_ENV_VAR.to_string(), "ghp_fake_token".to_string()),
(GH_USER_ENV_VAR.to_string(), "bobmatnyc".to_string()),
]
);
}
#[test]
fn resolve_gh_account_env_with_failure_returns_err() {
let result = resolve_gh_account_env_with(Some("bob-duetto"), |_| {
Err("account 'bob-duetto' is not logged in".to_string())
});
let err = result.expect("some").expect_err("err");
assert!(err.contains("bob-duetto"), "err: {err}");
}
#[test]
fn resolve_gh_account_env_with_trims_account_name() {
let result = resolve_gh_account_env_with(Some(" bobmatnyc "), |account| {
assert_eq!(account, "bobmatnyc");
Ok("tok".to_string())
});
let vars = result.expect("some").expect("ok");
assert!(vars.contains(&(GH_USER_ENV_VAR.to_string(), "bobmatnyc".to_string())));
}
fn project(name: &str, repo_url: &str, gh_account: Option<&str>) -> Project {
Project {
name: name.to_string(),
repo_url: repo_url.to_string(),
default_branch: "main".to_string(),
stack_hint: None,
tags: vec![],
description: None,
gh_user: None,
gh_account: gh_account.map(str::to_string),
github: None,
commit_name: None,
commit_email: None,
worktree: None,
}
}
#[tokio::test]
async fn resolve_gh_account_env_for_registry_picks_up_registered_gh_account() {
let dir = tempfile::tempdir().expect("tempdir");
let registry = ProjectRegistry::load(dir.path()).await.expect("load");
registry
.register(project(
"widget",
"https://github.com/acme/widget",
Some("bobmatnyc"),
))
.await
.expect("register");
let found = find_pinned_gh_account(®istry, "https://github.com/acme/widget").await;
assert_eq!(found.as_deref(), Some("bobmatnyc"));
let found_git_suffix =
find_pinned_gh_account(®istry, "https://github.com/acme/widget.git").await;
assert_eq!(found_git_suffix.as_deref(), Some("bobmatnyc"));
}
#[tokio::test]
async fn resolve_gh_account_env_for_registry_no_match_is_none() {
let dir = tempfile::tempdir().expect("tempdir");
let registry = ProjectRegistry::load(dir.path()).await.expect("load");
registry
.register(project(
"widget",
"https://github.com/acme/widget",
Some("bobmatnyc"),
))
.await
.expect("register");
let found = find_pinned_gh_account(®istry, "https://github.com/acme/other-repo").await;
assert_eq!(found, None);
}
#[tokio::test]
async fn resolve_gh_account_env_for_registry_registered_without_gh_account_is_none() {
let dir = tempfile::tempdir().expect("tempdir");
let registry = ProjectRegistry::load(dir.path()).await.expect("load");
registry
.register(project("widget", "https://github.com/acme/widget", None))
.await
.expect("register");
let found = find_pinned_gh_account(®istry, "https://github.com/acme/widget").await;
assert_eq!(found, None);
}
#[tokio::test]
async fn resolve_gh_account_env_for_registry_no_origin_is_empty() {
let dir = tempfile::tempdir().expect("tempdir");
let registry = ProjectRegistry::load(dir.path()).await.expect("load");
let workspace = tempfile::tempdir().expect("workspace tempdir");
let vars = resolve_gh_account_env_for_registry(®istry, workspace.path()).await;
assert!(vars.is_empty(), "vars: {vars:?}");
}