mneme-brain 0.2.5

Persistent memory system for AI coding agents — Rust + SQLite + FTS5 + MCP. Hybrid search, age encryption, CRDT P2P sync, WASM plugins, TUI with knowledge graph.
Documentation
use mneme::plugins::PluginManager;
use tempfile::TempDir;

fn empty_plugin_dir() -> TempDir {
    tempfile::tempdir().expect("failed to create temp dir")
}

#[test]
fn test_load_from_empty_dir_returns_empty_manager() {
    let dir = empty_plugin_dir();
    let pm = PluginManager::load_from_dir(dir.path()).expect("load should succeed");
    assert!(pm.is_empty());
}

#[test]
fn test_is_empty_returns_true_for_empty_manager() {
    let pm = PluginManager::empty();
    assert!(pm.is_empty());
}

#[test]
fn test_owns_tool_returns_false_for_unknown_tool() {
    let pm = PluginManager::empty();
    assert!(!pm.owns_tool("mem_save"));
    assert!(!pm.owns_tool("nonexistent_plugin_tool"));
}

#[test]
fn test_plugin_tools_returns_empty_vec_for_empty_manager() {
    let pm = PluginManager::empty();
    assert!(pm.plugin_tools().is_empty());
}

#[test]
fn test_call_tool_returns_plugin_error_for_unknown_tool() {
    let pm = PluginManager::empty();
    let result = pm.call_tool("nonexistent_tool", serde_json::json!({}), "test");
    assert!(result.is_err());
    let err = result.unwrap_err();
    assert!(matches!(err, mneme::MnemeError::Plugin(_)));
}

#[test]
fn test_run_pre_save_returns_memory_unchanged_when_no_plugins() {
    let pm = PluginManager::empty();
    let memory = serde_json::json!({ "title": "test", "content": "hello" });
    let result = pm
        .run_pre_save(memory.clone())
        .expect("pre_save should succeed");
    assert_eq!(result, memory);
}

#[test]
fn test_run_post_get_returns_memory_unchanged_when_no_plugins() {
    let pm = PluginManager::empty();
    let memory = serde_json::json!({ "id": "abc", "title": "test" });
    let result = pm
        .run_post_get(memory.clone())
        .expect("post_get should succeed");
    assert_eq!(result, memory);
}

#[test]
fn test_load_from_nonexistent_dir_returns_empty_manager() {
    let pm = PluginManager::load_from_dir(std::path::Path::new("/tmp/mneme_no_such_dir_xyz"))
        .expect("load from missing dir should not error");
    assert!(pm.is_empty());
}