malvin 0.2.5

Non-interactive research and coding agent
use super::{DEFAULT_PI_LIST_MODELS_TIMEOUT_MS, list_pi_models_sync, pi_list_models_timeout};

#[test]
fn pi_list_models_timeout_env_clamps_and_defaults() {
    use crate::test_utils::test_env_lock;

    let _lock = test_env_lock();
    let prior = std::env::var_os("MALVIN_PI_LIST_MODELS_TIMEOUT_MS");
    #[allow(unsafe_code)]
    unsafe {
        std::env::set_var("MALVIN_PI_LIST_MODELS_TIMEOUT_MS", "0");
    }
    assert_eq!(
        pi_list_models_timeout(),
        std::time::Duration::from_millis(1),
        "zero must clamp to at least 1ms"
    );
    #[allow(unsafe_code)]
    unsafe {
        std::env::set_var("MALVIN_PI_LIST_MODELS_TIMEOUT_MS", "not-a-number");
    }
    assert_eq!(
        pi_list_models_timeout(),
        std::time::Duration::from_millis(DEFAULT_PI_LIST_MODELS_TIMEOUT_MS)
    );
    #[allow(unsafe_code)]
    unsafe {
        std::env::set_var("MALVIN_PI_LIST_MODELS_TIMEOUT_MS", "250");
    }
    assert_eq!(
        pi_list_models_timeout(),
        std::time::Duration::from_millis(250)
    );
    #[allow(unsafe_code)]
    unsafe {
        match prior {
            Some(v) => std::env::set_var("MALVIN_PI_LIST_MODELS_TIMEOUT_MS", v),
            None => std::env::remove_var("MALVIN_PI_LIST_MODELS_TIMEOUT_MS"),
        }
    }
}

#[test]
fn list_pi_models_sync_reads_crate_registry() {
    let tmp = tempfile::tempdir().expect("tmpdir");
    crate::test_utils::with_isolated_home(|_| {
        let _saved = crate::test_utils::SavedEnvVars::capture(&[
            "PI_CODING_AGENT_DIR",
            "OPENAI_API_KEY",
            "OPENROUTER_API_KEY",
            "ANTHROPIC_API_KEY",
        ]);
        #[allow(unsafe_code)]
        unsafe {
            std::env::set_var("PI_CODING_AGENT_DIR", tmp.path());
            std::env::remove_var("OPENAI_API_KEY");
            std::env::remove_var("OPENROUTER_API_KEY");
            std::env::remove_var("ANTHROPIC_API_KEY");
        }
        let rows = list_pi_models_sync(false).expect("crate registry");
        assert!(
            rows.iter().any(|row| row.id.contains('/')),
            "expected provider/model ids, got {rows:?}"
        );
    });
}