use super::*;
#[test]
fn install_claude_hooks_at_writes_only_the_managed_config_dir() {
let tmp = tempfile::tempdir().unwrap();
let config_dir = tmp.path().join("claude-config");
std::fs::create_dir_all(&config_dir).unwrap();
let changed = install_claude_hooks_at(&config_dir).unwrap();
assert_eq!(changed, 1, "first install must report one file changed");
let settings_path = config_dir.join("settings.json");
let val: serde_json::Value =
serde_json::from_str(&std::fs::read_to_string(&settings_path).unwrap()).unwrap();
let hooks = val.get("hooks").expect("hooks key must be present");
assert!(hooks.get("PreToolUse").is_some());
assert!(hooks.get("PostToolUse").is_some());
assert!(hooks.get("Stop").is_some());
let cmd = hooks["PreToolUse"][0]["hooks"][0]["command"]
.as_str()
.unwrap();
assert!(cmd.ends_with(" hook"), "got: {cmd:?}");
}
#[test]
fn install_claude_hooks_at_is_idempotent() {
let tmp = tempfile::tempdir().unwrap();
let config_dir = tmp.path().join("claude-config");
std::fs::create_dir_all(&config_dir).unwrap();
let first = install_claude_hooks_at(&config_dir).unwrap();
assert_eq!(first, 1);
let settings_path = config_dir.join("settings.json");
let after_first = std::fs::read_to_string(&settings_path).unwrap();
let second = install_claude_hooks_at(&config_dir).unwrap();
assert_eq!(second, 0, "second install must report no changes");
let after_second = std::fs::read_to_string(&settings_path).unwrap();
assert_eq!(
after_first, after_second,
"re-running install must not rewrite an already-current file"
);
}
#[test]
fn install_claude_hooks_at_never_touches_a_sibling_project_dir() {
let tmp = tempfile::tempdir().unwrap();
let config_dir = tmp.path().join("claude-config");
std::fs::create_dir_all(&config_dir).unwrap();
let sibling_project = tmp.path().join("some-other-project");
let sibling_settings = sibling_project.join(".claude").join("settings.json");
std::fs::create_dir_all(sibling_settings.parent().unwrap()).unwrap();
let sibling_original = r#"{"outputStyle":"claude-mpm"}"#;
std::fs::write(&sibling_settings, sibling_original).unwrap();
install_claude_hooks_at(&config_dir).unwrap();
let sibling_after = std::fs::read_to_string(&sibling_settings).unwrap();
assert_eq!(
sibling_after, sibling_original,
"a sibling project's settings.json must be byte-for-byte unchanged \
by `tm install` — hooks belong solely in the tm-owned config dir"
);
let sibling_val: serde_json::Value = serde_json::from_str(&sibling_after).unwrap();
assert!(
sibling_val.get("hooks").is_none(),
"the sibling project must never gain a `hooks` key from `tm install`"
);
}