use clap::Parser;
use crate::cli::{Cli, Command, ProjectAction};
use crate::commands::project::trust_cmd;
#[test]
fn cli_parses_project_trust() {
let cli = Cli::try_parse_from(["trusty-mpm", "project", "trust", "--dir", "/work/p"]).unwrap();
match cli.command.unwrap() {
Command::Project {
action: ProjectAction::Trust { dir, revoke },
} => {
assert_eq!(dir.as_deref(), Some("/work/p"));
assert!(!revoke);
}
other => panic!("expected project trust, got {other:?}"),
}
}
#[test]
fn cli_parses_project_trust_revoke() {
let cli = Cli::try_parse_from(["trusty-mpm", "project", "trust", "--revoke"]).unwrap();
match cli.command.unwrap() {
Command::Project {
action: ProjectAction::Trust { dir, revoke },
} => {
assert_eq!(dir, None);
assert!(revoke);
}
other => panic!("expected project trust --revoke, got {other:?}"),
}
}
fn with_fake_home<F: FnOnce()>(home: &std::path::Path, body: F) {
let prev = std::env::var("HOME").ok();
unsafe { std::env::set_var("HOME", home) };
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(body));
match prev {
Some(p) => unsafe { std::env::set_var("HOME", p) },
None => unsafe { std::env::remove_var("HOME") },
}
if let Err(e) = result {
std::panic::resume_unwind(e);
}
}
#[test]
#[serial_test::serial]
fn project_trust_grants_and_revokes() {
let home = tempfile::tempdir().unwrap();
let project = tempfile::tempdir().unwrap();
let project_dir = project.path().to_string_lossy().to_string();
with_fake_home(home.path(), || {
assert!(!trusty_mpm::core::project_trust::is_project_trusted(
project.path()
));
trust_cmd(Some(project_dir.clone()), false).expect("trust succeeds");
assert!(trusty_mpm::core::project_trust::is_project_trusted(
project.path()
));
assert!(
!project.path().join("project-trust.json").exists(),
"trust state must never be written inside the project directory"
);
let store_path = home
.path()
.join(".trusty-tools")
.join("trusty-mpm")
.join("project-trust.json");
assert!(
store_path.exists(),
"trust state must live under the user-scope tm config dir"
);
trust_cmd(Some(project_dir), true).expect("revoke succeeds");
assert!(!trusty_mpm::core::project_trust::is_project_trusted(
project.path()
));
});
}