use super::*;
use tempfile::tempdir;
fn write_manifest(project: &std::path::Path, body: &str) {
let dir = project.join(".trusty-mpm").join("framework");
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("manifest.toml"), body).unwrap();
}
#[test]
fn resolve_conditional_mcp_toggles_defaults_to_both_on() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
assert_eq!(resolve_conditional_mcp_toggles(&fw, &project), (true, true));
}
#[test]
fn resolve_conditional_mcp_toggles_honors_project_manifest_toggle() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(&project, "[mcp]\ntrusty_memory = false\n");
assert_eq!(
resolve_conditional_mcp_toggles(&fw, &project),
(false, true)
);
}
#[test]
#[serial_test::serial]
fn session_mcp_env_omits_both_when_both_toggles_are_off() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(
&project,
"[mcp]\ntrusty_memory = false\ntrusty_search = false\n",
);
let env = session_mcp_env_with(&fw, &project, Some("git@github.com:acme/widget.git"));
assert!(env.is_empty(), "both toggles off exports nothing: {env:?}");
}
#[test]
#[serial_test::serial]
fn session_mcp_env_omits_palace_when_memory_disabled() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(
&project,
"[mcp]\ntrusty_memory = false\ntrusty_search = false\n",
);
let env = session_mcp_env_with(&fw, &project, Some("git@github.com:acme/widget.git"));
assert!(
!env.iter()
.any(|(name, _)| name == trusty_common::PALACE_OVERRIDE_ENV),
"a disabled trusty-memory toggle must not export a palace pin: {env:?}"
);
}
#[test]
#[serial_test::serial]
fn session_mcp_env_exports_palace_when_memory_enabled() {
unsafe { std::env::remove_var(trusty_common::PALACE_OVERRIDE_ENV) };
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(&project, "[mcp]\ntrusty_search = false\n");
let env = session_mcp_env_with(&fw, &project, Some("git@github.com:acme/widget.git"));
let palace = env
.iter()
.find(|(name, _)| name == trusty_common::PALACE_OVERRIDE_ENV)
.map(|(_, value)| value.clone());
assert_eq!(
palace.as_deref(),
Some("acme-widget"),
"the exported palace must be the repo identity, not the workspace basename: {env:?}"
);
}
#[test]
#[serial_test::serial]
fn session_mcp_env_omits_index_when_search_disabled() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(&project, "[mcp]\ntrusty_search = false\n");
let env = session_mcp_env_with(&fw, &project, None);
assert!(
!env.iter().any(|(name, _)| name == SEARCH_INDEX_ENV),
"a disabled trusty-search toggle must not export an index pin: {env:?}"
);
}
#[test]
#[serial_test::serial]
fn session_mcp_env_exports_divert_when_enabled() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(
&project,
"[mcp]\ntrusty_memory = false\ntrusty_search = false\n\n\
[divert]\nenabled = true\nmin_lines = 420\n\
worker_model = \"claude-haiku-4-5\"\n",
);
let env = session_mcp_env_with(&fw, &project, None);
let get = |name: &str| {
env.iter()
.find(|(n, _)| n == name)
.map(|(_, v)| v.clone())
.unwrap_or_else(|| panic!("{name} must be exported: {env:?}"))
};
assert_eq!(get(DIVERT_MIN_LINES_ENV), "420");
assert_eq!(get(DIVERT_WORKER_MODEL_ENV), "claude-haiku-4-5");
assert!(
!env.iter()
.any(|(n, _)| n.contains("API_KEY") || n.contains("SECRET") || n.contains("TOKEN")),
"no credential may be exported by the divert path: {env:?}"
);
}
#[test]
#[serial_test::serial]
fn session_mcp_env_omits_divert_when_disabled() {
let tmp = tempdir().unwrap();
let fw = crate::core::paths::FrameworkPaths::under(tmp.path());
let project = tmp.path().join("proj");
std::fs::create_dir_all(&project).unwrap();
write_manifest(
&project,
"[mcp]\ntrusty_memory = false\ntrusty_search = false\n",
);
let env = session_mcp_env_with(&fw, &project, None);
for name in [DIVERT_MIN_LINES_ENV, DIVERT_WORKER_MODEL_ENV] {
assert!(
!env.iter().any(|(n, _)| n == name),
"{name} must not be exported with divert off: {env:?}"
);
}
}