use smith_config::{Config, NatsLoggingConfig};
use std::time::Duration;
use tokio::time::sleep;
use tracing::{error, info, warn};
#[tokio::test]
async fn test_console_logging_initialization() {
let result = smith_logging::init_console_logging("debug");
assert!(result.is_ok());
info!("Test info message");
warn!("Test warning message");
error!("Test error message");
}
#[tokio::test]
async fn test_logging_config_loading() {
let config = Config::development();
assert!(config.logging.nats.enabled);
assert_eq!(config.logging.nats.buffer_size, 500);
assert!(!config.logging.nats.target_filters.is_empty());
let config = Config::production();
assert!(config.logging.nats.enabled);
assert_eq!(config.logging.nats.buffer_size, 2000);
assert!(config.logging.nats.batch_enabled);
let config = Config::testing();
assert!(!config.logging.nats.enabled); }
#[tokio::test]
async fn test_nats_logging_config_environments() {
let dev_config = NatsLoggingConfig::development();
assert!(dev_config.enabled);
assert!(!dev_config.batch_enabled); assert!(dev_config.include_traces); assert_eq!(dev_config.rate_limit, 0);
let prod_config = NatsLoggingConfig::production();
assert!(prod_config.enabled);
assert!(prod_config.batch_enabled); assert!(!prod_config.include_traces); assert!(prod_config.rate_limit > 0);
let test_config = NatsLoggingConfig::testing();
assert!(!test_config.enabled); }
#[tokio::test]
async fn test_structured_logging_with_fields() {
let _ = smith_logging::init_console_logging("info");
info!(
user_id = "user123",
action = "login",
ip_address = "192.168.1.1",
session_duration_ms = 1500,
success = true,
"User logged in successfully"
);
warn!(
error_count = 3,
service = "database",
latency_ms = 2500,
"High latency detected"
);
error!(
error_code = 500,
error_type = "connection_timeout",
retry_attempts = 3,
"Database connection failed"
);
}
#[tokio::test]
async fn test_performance_logging() {
let _ = smith_logging::init_console_logging("debug");
let start = std::time::Instant::now();
sleep(Duration::from_millis(10)).await;
let duration = start.elapsed();
info!(
performance_category = "api_request",
duration_ms = duration.as_millis() as u64,
endpoint = "/api/users",
status_code = 200,
"API request completed"
);
}
#[tokio::test]
async fn test_error_handling_logging() {
let _ = smith_logging::init_console_logging("error");
let result: Result<(), &str> = Err("Simulated error");
if let Err(e) = result {
error!(
error_message = e,
error_source = "test_function",
context = "integration_test",
"Test error occurred"
);
}
}