use pretty_assertions::assert_eq;
use super::*;
fn reader<'a>(pairs: &'a [(&'a str, &'a str)]) -> impl FnMut(&str) -> Option<String> + 'a {
move |name| {
pairs
.iter()
.find(|(key, _)| *key == name)
.map(|(_, value)| (*value).to_owned())
}
}
#[test]
fn the_child_gets_the_base_set_plus_its_allowlist_and_nothing_else() {
let ambient = [
("PATH", "/usr/bin"),
("MY_HOOK_TOKEN", "token"),
("ANTHROPIC_API_KEY", "secret"),
("UNRELATED", "value"),
];
let environment = child_environment(&["MY_HOOK_TOKEN".to_owned()], reader(&ambient));
assert_eq!(
environment.get("PATH").map(String::as_str),
Some("/usr/bin")
);
assert_eq!(
environment.get("MY_HOOK_TOKEN").map(String::as_str),
Some("token")
);
assert_eq!(environment.get("ANTHROPIC_API_KEY"), None);
assert_eq!(environment.get("UNRELATED"), None);
}
#[test]
fn a_variable_missing_from_the_parent_is_simply_absent() {
let environment = child_environment(&["NOT_SET".to_owned()], reader(&[("PATH", "/usr/bin")]));
assert_eq!(environment.get("NOT_SET"), None);
assert!(environment.contains_key("PATH"));
}
#[test]
fn the_recursion_marker_is_always_set_and_cannot_be_overridden() {
let marker = super::super::IN_HOOK_ENV;
let empty_allowlist: &[String] = &[];
let marker_allowlist = [marker.to_owned()];
for (case, allowlist, ambient) in [
("no allowlist", empty_allowlist, &[][..]),
(
"allowlisted marker",
&marker_allowlist[..],
&[(marker, "0")][..],
),
] {
let environment = child_environment(allowlist, reader(ambient));
assert_eq!(
environment.get(marker).map(String::as_str),
Some("1"),
"{case}"
);
}
}