road-runner-common 0.11.0

Shared Rust utilities for exchange ecosystem backend services.
Documentation
use std::sync::{Mutex, OnceLock};

use road_runner_common::config::ServiceConfig;

fn env_lock() -> &'static Mutex<()> {
    static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
    LOCK.get_or_init(|| Mutex::new(()))
}

#[test]
fn default_service_config_uses_platform_defaults() {
    // Arrange / Act
    let cfg = ServiceConfig::default();

    // Assert
    assert_eq!(cfg.service_name, "my-service");
    assert_eq!(cfg.log_level, "info");
    assert_eq!(cfg.log_format, "json");
    assert_eq!(cfg.max_page_size, 100);
}

#[test]
fn from_env_fallback_overrides_valid_values_and_clamps_page_size() {
    let _guard = env_lock().lock().unwrap();
    // Arrange
    std::env::set_var("SERVICE_NAME", "orders");
    std::env::set_var("LOG_LEVEL", "debug");
    std::env::set_var("LOG_FORMAT", "pretty");
    std::env::set_var("MAX_PAGE_SIZE", "0");

    // Act
    let cfg = ServiceConfig::from_env_fallback();

    // Assert
    assert_eq!(cfg.service_name, "orders");
    assert_eq!(cfg.log_level, "debug");
    assert_eq!(cfg.log_format, "pretty");
    assert_eq!(cfg.max_page_size, 1);

    std::env::remove_var("SERVICE_NAME");
    std::env::remove_var("LOG_LEVEL");
    std::env::remove_var("LOG_FORMAT");
    std::env::remove_var("MAX_PAGE_SIZE");
}

#[test]
fn from_env_fallback_keeps_default_for_invalid_page_size() {
    let _guard = env_lock().lock().unwrap();
    // Arrange
    std::env::set_var("MAX_PAGE_SIZE", "not-a-number");

    // Act
    let cfg = ServiceConfig::from_env_fallback();

    // Assert
    assert_eq!(cfg.max_page_size, 100);

    std::env::remove_var("MAX_PAGE_SIZE");
}

#[cfg(feature = "config")]
#[test]
fn load_reads_environment_and_optional_config_file() {
    let _guard = env_lock().lock().unwrap();
    // Arrange
    std::env::set_var("CONFIG_FILE", "/tmp/cex-common-test-config-that-does-not-exist");
    std::env::set_var("SERVICE_NAME", "matching");
    std::env::set_var("LOG_LEVEL", "trace");
    std::env::set_var("LOG_FORMAT", "json");
    std::env::set_var("MAX_PAGE_SIZE", "250");

    // Act
    let cfg = ServiceConfig::load().unwrap();

    // Assert
    assert_eq!(cfg.service_name, "matching");
    assert_eq!(cfg.log_level, "trace");
    assert_eq!(cfg.log_format, "json");
    assert_eq!(cfg.max_page_size, 250);

    std::env::remove_var("CONFIG_FILE");
    std::env::remove_var("SERVICE_NAME");
    std::env::remove_var("LOG_LEVEL");
    std::env::remove_var("LOG_FORMAT");
    std::env::remove_var("MAX_PAGE_SIZE");
}