codex-memory 3.0.15

A simple memory storage service with MCP interface for Claude Desktop
Documentation
use codex_memory::Config;
use std::env;

#[test]
fn test_config_from_env_with_all_vars() {
    // Save original values
    let orig_db = env::var("DATABASE_URL").ok();
    let orig_port = env::var("MCP_PORT").ok();
    let orig_level = env::var("LOG_LEVEL").ok();

    // Set up environment
    env::set_var("DATABASE_URL", "postgresql://test:test@localhost/test");
    env::set_var("MCP_PORT", "4444");
    env::set_var("LOG_LEVEL", "debug");

    let config = Config::from_env().expect("Should create config from env");

    assert_eq!(config.database_url, "postgresql://test:test@localhost/test");
    assert_eq!(config.mcp_port, 4444);
    assert_eq!(config.log_level, "debug");

    // Restore original values
    match orig_db {
        Some(val) => env::set_var("DATABASE_URL", val),
        None => env::remove_var("DATABASE_URL"),
    }
    match orig_port {
        Some(val) => env::set_var("MCP_PORT", val),
        None => env::remove_var("MCP_PORT"),
    }
    match orig_level {
        Some(val) => env::set_var("LOG_LEVEL", val),
        None => env::remove_var("LOG_LEVEL"),
    }
}

#[test]
fn test_config_from_env_with_defaults() {
    // Save original values
    let orig_db = env::var("DATABASE_URL").ok();
    let orig_port = env::var("MCP_PORT").ok();
    let orig_level = env::var("LOG_LEVEL").ok();

    // Set only required var
    env::set_var("DATABASE_URL", "postgresql://test:test@localhost/test");

    // Remove optional vars to test defaults
    env::remove_var("MCP_PORT");
    env::remove_var("LOG_LEVEL");

    let config = Config::from_env().expect("Should create config with defaults");

    assert_eq!(config.database_url, "postgresql://test:test@localhost/test");
    assert_eq!(config.mcp_port, 3333); // Default port
    assert_eq!(config.log_level, "info"); // Default log level

    // Restore original values
    match orig_db {
        Some(val) => env::set_var("DATABASE_URL", val),
        None => env::remove_var("DATABASE_URL"),
    }
    match orig_port {
        Some(val) => env::set_var("MCP_PORT", val),
        None => env::remove_var("MCP_PORT"),
    }
    match orig_level {
        Some(val) => env::set_var("LOG_LEVEL", val),
        None => env::remove_var("LOG_LEVEL"),
    }
}

#[test]
fn test_config_from_env_missing_database_url() {
    // This test is tricky because Config::from_env() calls dotenvy::dotenv()
    // which will reload the .env file and restore DATABASE_URL
    // So we need to save and restore but also work around this limitation

    // Save original value
    let orig_db = env::var("DATABASE_URL").ok();

    // Set DATABASE_URL to empty string to simulate "not set" in a way that survives dotenv
    env::set_var("DATABASE_URL", "");

    let result = Config::from_env();
    // from_env should fail because DATABASE_URL is empty (treated as not set)
    assert!(result.is_err());

    if let Err(e) = result {
        // The error message might be different due to empty vs missing
        assert!(e.to_string().contains("DATABASE_URL"));
    }

    // Restore original value
    if let Some(val) = orig_db {
        env::set_var("DATABASE_URL", val);
    } else {
        env::remove_var("DATABASE_URL");
    }
}

#[test]
fn test_config_from_env_invalid_port() {
    // Save original values
    let orig_db = env::var("DATABASE_URL").ok();
    let orig_port = env::var("MCP_PORT").ok();

    env::set_var("DATABASE_URL", "postgresql://test:test@localhost/test");
    env::set_var("MCP_PORT", "not_a_number");

    let result = Config::from_env();
    assert!(result.is_err());

    if let Err(e) = result {
        assert!(e.to_string().contains("Invalid MCP_PORT"));
    }

    // Restore original values
    match orig_db {
        Some(val) => env::set_var("DATABASE_URL", val),
        None => env::remove_var("DATABASE_URL"),
    }
    match orig_port {
        Some(val) => env::set_var("MCP_PORT", val),
        None => env::remove_var("MCP_PORT"),
    }
}

#[test]
fn test_config_default() {
    // Save original value
    let orig_db = env::var("DATABASE_URL").ok();

    // Test with DATABASE_URL not set
    env::remove_var("DATABASE_URL");
    let config = Config::default();
    assert_eq!(config.database_url, ""); // Empty when not set
    assert_eq!(config.mcp_port, 3333);
    assert_eq!(config.log_level, "info");

    // Test with DATABASE_URL set
    env::set_var("DATABASE_URL", "test_url");
    let config2 = Config::default();
    assert_eq!(config2.database_url, "test_url");
    assert_eq!(config2.mcp_port, 3333);
    assert_eq!(config2.log_level, "info");

    // Restore original value
    if let Some(val) = orig_db {
        env::set_var("DATABASE_URL", val);
    } else {
        env::remove_var("DATABASE_URL");
    }
}

#[test]
fn test_config_clone() {
    // Save original value
    let orig_db = env::var("DATABASE_URL").ok();

    env::set_var("DATABASE_URL", "postgresql://test:test@localhost/test");

    let config1 = Config::from_env().expect("Should create config");
    let config2 = config1.clone();

    assert_eq!(config1.database_url, config2.database_url);
    assert_eq!(config1.mcp_port, config2.mcp_port);
    assert_eq!(config1.log_level, config2.log_level);

    // Restore original value
    if let Some(val) = orig_db {
        env::set_var("DATABASE_URL", val);
    } else {
        env::remove_var("DATABASE_URL");
    }
}