bonsai-ninja-sdk 0.2.1

Ergonomic facade SDK for bonsai-ninja.
Documentation
use super::Bonsai;
use std::fs;
use std::path::PathBuf;

fn fresh_tempdir(prefix: &str) -> PathBuf {
    let base = std::env::temp_dir().join(format!(
        "bonsai-rulepack-{prefix}-{}-{}",
        std::process::id(),
        std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap()
            .as_nanos()
    ));
    fs::create_dir_all(&base).unwrap();
    base
}

#[test]
fn env_var_selects_an_explicit_custom_rulepack() {
    let workspace = fresh_tempdir("ws");
    let workspace_local = workspace.join("security-patterns");
    fs::create_dir_all(&workspace_local).unwrap();

    let env_pack = fresh_tempdir("env");

    let env_path = env_pack.clone();
    let resolved = Bonsai::discover_rulepack_root_with(&workspace, |key| {
        if key == "BONSAI_RULES_DIR" {
            Some(env_path.clone())
        } else {
            None
        }
    })
    .unwrap();
    assert_eq!(
        resolved.canonicalize().unwrap(),
        env_pack.canonicalize().unwrap(),
        "BONSAI_RULES_DIR should select the explicit rulepack"
    );

    fs::remove_dir_all(&workspace).ok();
    fs::remove_dir_all(&env_pack).ok();
}

#[test]
fn invalid_env_override_fails_instead_of_falling_back() {
    let workspace = fresh_tempdir("ws-fallback");
    let error = Bonsai::default_rulepack_root_with(|key| {
        if key == "BONSAI_RULES_DIR" {
            Some(PathBuf::from("/nonexistent/path/does/not/exist"))
        } else {
            None
        }
    })
    .unwrap_err();
    assert!(error.to_string().contains("BONSAI_RULES_DIR"));

    fs::remove_dir_all(&workspace).ok();
}

#[test]
fn workspace_local_base_pack_is_not_trusted_implicitly() {
    let workspace = fresh_tempdir("ws-local");
    let workspace_local = workspace.join("security-patterns");
    fs::create_dir_all(&workspace_local).unwrap();

    let resolved = Bonsai::discover_rulepack_root_with(&workspace, |_| None).unwrap();
    assert_ne!(
        resolved.canonicalize().unwrap(),
        workspace_local.canonicalize().unwrap()
    );
    assert!(resolved.join("metadata.yml").is_file());

    fs::remove_dir_all(&workspace).ok();
}

#[test]
fn no_override_materializes_the_bundled_pack() {
    let workspace = fresh_tempdir("ws-empty");
    let found = Bonsai::discover_rulepack_root_with(&workspace, |_| None).unwrap();
    assert!(found.join("metadata.yml").is_file());
    assert!(found.join("langs").is_dir());

    fs::remove_dir_all(&workspace).ok();
}