use std::path::Path;
use crate::core::doctor::{CheckStatus, DoctorCheck};
use crate::core::gh_org_accounts::OrgAccounts;
const NAME: &str = "org_accounts";
pub(super) fn check_org_accounts(home: &Path) -> DoctorCheck {
match OrgAccounts::inspect(&home.join(".trusty-mpm")) {
Ok((_, Some(warning))) => DoctorCheck::new(NAME, CheckStatus::Warn, warning),
Ok((accounts, None)) if accounts.is_empty() => DoctorCheck::new(
NAME,
CheckStatus::Ok,
"[accounts] missing in ~/.trusty-mpm/config.toml — no org maps to a gh account; \
clones and spawns use the registry pin or the ambient identity",
),
Ok((accounts, None)) => DoctorCheck::new(
NAME,
CheckStatus::Ok,
format!(
"[accounts] maps {} GitHub org(s) to a gh account",
accounts.len()
),
),
Err(e) => DoctorCheck::new(
NAME,
CheckStatus::Fail,
format!(
"{e} — clones refuse and spawned sessions' gh authenticates as nobody until \
it is fixed"
),
),
}
}
#[cfg(test)]
mod tests {
use super::*;
fn home_with(body: &str) -> tempfile::TempDir {
let home = tempfile::tempdir().expect("tempdir");
let root = home.path().join(".trusty-mpm");
std::fs::create_dir_all(&root).expect("mkdir");
std::fs::write(root.join("config.toml"), body).expect("write");
home
}
#[test]
fn an_absent_table_is_ok_and_says_missing() {
for home in [
tempfile::tempdir().expect("tempdir"),
home_with("[models]\n"),
] {
let check = check_org_accounts(home.path());
assert_eq!(check.status, CheckStatus::Ok, "{}", check.message);
assert!(check.message.contains("missing"), "{}", check.message);
}
}
#[test]
fn a_valid_table_is_ok_and_counts_the_orgs() {
let home = home_with("[accounts]\nduettoresearch = \"bob-duetto\"\nacme = \"octo\"\n");
let check = check_org_accounts(home.path());
assert_eq!(check.status, CheckStatus::Ok, "{}", check.message);
assert!(check.message.contains("maps 2"), "{}", check.message);
}
#[test]
fn a_syntax_error_outside_the_table_warns() {
let home = home_with("[models]\ndefault = sonnet\n");
let check = check_org_accounts(home.path());
assert_eq!(check.status, CheckStatus::Warn, "{}", check.message);
assert!(check.message.contains("config.toml"), "{}", check.message);
}
#[test]
fn a_broken_table_fails_with_the_error() {
let home = home_with("[accounts]\nduettoresearch = bob-duetto\n");
let check = check_org_accounts(home.path());
assert_eq!(check.status, CheckStatus::Fail, "{}", check.message);
assert!(check.message.contains("config.toml"), "{}", check.message);
assert!(
check.message.contains("not valid TOML"),
"{}",
check.message
);
}
}