rho-coding-agent 2.16.0

A fast Rust agent harness with a small footprint and opinionated defaults
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}"
        );
    }
}