use super::*;
use std::env;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_builder_new() {
let builder = ConfigBuilder::new();
assert!(builder.nats_url.is_none());
assert!(builder.http_port.is_none());
}
#[test]
fn test_config_builder_with_nats_url() {
let url = "nats://test.example.com:4222";
let builder = ConfigBuilder::new().with_nats_url(url);
assert_eq!(builder.nats_url, Some(url.to_string()));
}
#[test]
fn test_config_builder_with_http_port() {
let port = 8080;
let builder = ConfigBuilder::new().with_http_port(port);
assert_eq!(builder.http_port, Some(port));
}
#[test]
fn test_config_builder_build() {
let config = ConfigBuilder::new()
.with_nats_url("nats://test:4222")
.with_http_port(8080)
.build();
assert_eq!(config.nats.url, "nats://test:4222");
assert_eq!(config.http.port, 8080);
}
#[test]
fn test_config_defaults() {
let config = Config::default();
assert_eq!(config.nats.url, "nats://127.0.0.1:4222");
assert_eq!(config.http.port, 3000);
assert_eq!(config.http.bind_address, "127.0.0.1");
}
#[test]
fn test_config_presets() {
let dev = Config::development();
let prod = Config::production();
let test = Config::testing();
assert!(!dev.logging.level.is_empty());
assert!(!prod.logging.level.is_empty());
assert!(!test.logging.level.is_empty());
let _dev_json = dev.logging.json_format;
let _prod_json = prod.logging.json_format;
let _test_json = test.logging.json_format;
}
#[test]
fn test_config_environment_copy() {
let env1 = ConfigEnvironment::Development;
let env2 = env1;
matches!(env1, ConfigEnvironment::Development);
matches!(env2, ConfigEnvironment::Development);
}
#[test]
fn test_config_serialization() {
let config = Config::default();
let json_result = serde_json::to_string(&config);
assert!(json_result.is_ok());
let json = json_result.unwrap();
assert!(json.contains("nats"));
assert!(json.contains("http"));
}
#[test]
fn test_config_debug_format() {
let config = Config::default();
let debug_str = format!("{:?}", config);
assert!(debug_str.contains("Config"));
assert!(debug_str.contains("nats"));
}
#[test]
fn test_config_clone() {
let original = Config::default();
let cloned = original.clone();
assert_eq!(original.nats.url, cloned.nats.url);
assert_eq!(original.http.port, cloned.http.port);
}
#[test]
fn test_config_validation() {
let config = Config::default();
let result = config.validate();
let _is_valid = result.is_ok();
}
#[test]
fn test_config_from_file_nonexistent() {
let result = Config::from_file("/nonexistent/path/config.toml");
assert!(result.is_err());
}
#[test]
fn test_environment_variable_access() {
let original = env::var("TEST_SMITH_VAR").ok();
env::set_var("TEST_SMITH_VAR", "test_value");
assert_eq!(env::var("TEST_SMITH_VAR").unwrap(), "test_value");
match original {
Some(val) => env::set_var("TEST_SMITH_VAR", val),
None => env::remove_var("TEST_SMITH_VAR"),
}
}
#[test]
fn test_config_builder_default() {
let builder = ConfigBuilder::default();
assert!(builder.nats_url.is_none());
}
#[test]
fn test_config_builder_for_environment() {
let builder = ConfigBuilder::new().for_environment(ConfigEnvironment::Production);
matches!(builder.environment, Some(ConfigEnvironment::Production));
}
#[test]
fn test_config_builder_with_log_level() {
let builder = ConfigBuilder::new().with_log_level("debug");
assert_eq!(builder.log_level, Some("debug".to_string()));
}
#[test]
fn test_config_fields_access() {
let config = Config::default();
let _logging_level = &config.logging.level;
let _policy_enabled = config.executor.capabilities.enforcement_enabled;
let _observability_enabled = config.observability.enabled;
assert!(!config.logging.level.is_empty());
}
#[test]
fn test_config_environment_variants() {
let dev = ConfigEnvironment::Development;
let prod = ConfigEnvironment::Production;
let test = ConfigEnvironment::Testing;
let _ = format!("{:?}", dev);
let _ = format!("{:?}", prod);
let _ = format!("{:?}", test);
}
#[test]
fn test_config_with_different_logging_levels() {
let dev_config = Config::development();
let prod_config = Config::production();
let dev_level = &dev_config.logging.level;
let prod_level = &prod_config.logging.level;
assert!(!dev_level.is_empty());
assert!(!prod_level.is_empty());
let _dev_json = dev_config.logging.json_format;
let _prod_json = prod_config.logging.json_format;
}
#[test]
fn test_config_environment_variable_handling() {
let original_url = env::var("SMITH_NATS_URL").ok();
let original_port = env::var("SMITH_HTTP_PORT").ok();
env::set_var("SMITH_NATS_URL", "nats://env-test:4222");
env::set_var("SMITH_HTTP_PORT", "9999");
assert_eq!(env::var("SMITH_NATS_URL").unwrap(), "nats://env-test:4222");
assert_eq!(env::var("SMITH_HTTP_PORT").unwrap(), "9999");
match original_url {
Some(val) => env::set_var("SMITH_NATS_URL", val),
None => env::remove_var("SMITH_NATS_URL"),
}
match original_port {
Some(val) => env::set_var("SMITH_HTTP_PORT", val),
None => env::remove_var("SMITH_HTTP_PORT"),
}
}
#[test]
fn test_logging_config_validation() {
use crate::LoggingConfig;
let mut config = LoggingConfig::default();
assert!(config.validate().is_ok());
config.level = "invalid_level".to_string();
assert!(config.validate().is_err());
for level in ["error", "warn", "info", "debug", "trace"] {
config.level = level.to_string();
assert!(config.validate().is_ok(), "Level {} should be valid", level);
}
}
#[test]
fn test_metrics_config_validation() {
use crate::MetricsConfig;
let mut config = MetricsConfig::default();
assert!(config.validate().is_ok());
config.prefix = String::new();
assert!(config.validate().is_err());
config.prefix = "smith".to_string();
config.interval_seconds = 0;
assert!(config.validate().is_err());
config.interval_seconds = 15;
config.port = Some(80); assert!(config.validate().is_err());
}
#[test]
fn test_behavior_config_validation() {
use crate::BehaviorConfig;
let mut config = BehaviorConfig::default();
assert!(config.validate().is_ok());
config.default_pack = String::new();
assert!(config.validate().is_err());
config.default_pack = "test-pack".to_string();
config.poll_interval_seconds = 0;
assert!(config.validate().is_err());
config.poll_interval_seconds = 5;
config.max_file_size_bytes = 0;
assert!(config.validate().is_err());
}
#[test]
fn test_monitoring_config_validation() {
use crate::MonitoringConfig;
let mut config = MonitoringConfig::default();
assert!(config.validate().is_ok());
config.health_check_interval = 0;
assert!(config.validate().is_err());
config.health_check_interval = 10;
config.metrics_collection_interval = 0;
assert!(config.validate().is_err());
}
#[test]
fn test_core_config_validation() {
use crate::CoreConfig;
let config = CoreConfig::default();
assert!(config.validate().is_ok());
let dev_config = CoreConfig::development();
let prod_config = CoreConfig::production();
let test_config = CoreConfig::testing();
assert!(dev_config.validate().is_ok());
assert!(prod_config.validate().is_ok());
assert!(test_config.validate().is_ok());
}
#[test]
fn test_admission_config_validation() {
use crate::AdmissionConfig;
let config = AdmissionConfig::default();
assert!(config.validate().is_ok());
let dev_config = AdmissionConfig::development();
let prod_config = AdmissionConfig::production();
let test_config = AdmissionConfig::testing();
assert!(dev_config.validate().is_ok());
assert!(prod_config.validate().is_ok());
assert!(test_config.validate().is_ok());
}
#[test]
fn test_attestation_config_validation() {
use crate::AttestationConfig;
let config = AttestationConfig::default();
assert!(config.validate().is_ok());
let dev_config = AttestationConfig::development();
let prod_config = AttestationConfig::production();
let test_config = AttestationConfig::testing();
assert!(dev_config.validate().is_ok());
assert!(prod_config.validate().is_ok());
assert!(test_config.validate().is_ok());
}
#[test]
fn test_nats_logging_config_environments() {
use crate::NatsLoggingConfig;
let dev_config = NatsLoggingConfig::development();
let prod_config = NatsLoggingConfig::production();
let test_config = NatsLoggingConfig::testing();
assert_ne!(dev_config.enabled, test_config.enabled);
assert_ne!(dev_config.buffer_size, prod_config.buffer_size);
assert_ne!(dev_config.include_traces, prod_config.include_traces);
}
#[test]
fn test_config_port_validation() {
assert!(Config::validate_port(8080, "test").is_ok());
assert!(Config::validate_port(3000, "test").is_ok());
assert!(Config::validate_port(65535, "test").is_ok());
assert!(Config::validate_port(80, "test").is_err()); assert!(Config::validate_port(443, "test").is_err()); assert!(Config::validate_port(1023, "test").is_err()); }
#[test]
fn test_config_bind_address_helpers() {
assert_eq!(Config::development_bind_addr(), "127.0.0.1");
assert_eq!(Config::production_bind_addr(), "0.0.0.0");
}
#[test]
fn test_redaction_level_parsing() {
use crate::RedactionLevel;
assert!(matches!(
Config::parse_redaction_level("strict"),
Ok(RedactionLevel::Strict)
));
assert!(matches!(
Config::parse_redaction_level("balanced"),
Ok(RedactionLevel::Balanced)
));
assert!(Config::parse_redaction_level("invalid").is_err());
assert!(Config::parse_redaction_level("loose").is_err());
assert!(Config::parse_redaction_level("").is_err());
}
#[test]
fn test_config_comprehensive_validation() {
let dev_config = Config::development();
let prod_config = Config::production();
let test_config = Config::testing();
let _dev_result = dev_config.validate();
let _prod_result = prod_config.validate();
let _test_result = test_config.validate();
}
#[test]
fn test_config_builder_comprehensive() {
use std::path::PathBuf;
let config = ConfigBuilder::new()
.with_nats_url("nats://builder-test:4222")
.with_http_port(9001)
.with_executor_work_root(PathBuf::from("/tmp/builder-test"))
.with_log_level("trace")
.for_environment(ConfigEnvironment::Testing)
.build();
assert_eq!(config.nats.url, "nats://builder-test:4222");
assert_eq!(config.http.port, 9001);
assert_eq!(
config.executor.work_root,
PathBuf::from("/tmp/builder-test")
);
assert_eq!(config.logging.level, "trace");
}
#[test]
fn test_environment_specific_configs() {
let dev = Config::development();
let prod = Config::production();
let test = Config::testing();
assert_eq!(dev.logging.level, "debug");
assert_eq!(prod.logging.level, "info");
assert_eq!(test.logging.level, "warn");
assert!(!dev.logging.json_format);
assert!(prod.logging.json_format);
assert!(!test.logging.json_format);
assert!(dev.metrics.enabled);
assert!(prod.metrics.enabled);
assert!(!test.metrics.enabled);
assert_eq!(dev.behavior.default_pack, "eng-alpha");
assert_eq!(prod.behavior.default_pack, "prod-stable");
assert_eq!(test.behavior.default_pack, "shadow-test");
}
#[test]
fn test_config_serialization_comprehensive() {
let config = Config::development();
let json_result = serde_json::to_string(&config);
assert!(json_result.is_ok());
let json = json_result.unwrap();
assert!(json.contains("nats"));
assert!(json.contains("http"));
assert!(json.contains("executor"));
assert!(json.contains("logging"));
assert!(json.contains("metrics"));
assert!(json.contains("behavior"));
assert!(json.contains("monitoring"));
assert!(json.contains("core"));
assert!(json.contains("admission"));
assert!(json.contains("observability"));
}
#[test]
fn test_defaults_comprehensive() {
let config = Config::default();
assert!(!config.nats.url.is_empty());
assert!(config.http.port > 0);
assert!(!config.logging.level.is_empty());
assert!(!config.metrics.prefix.is_empty());
assert!(!config.behavior.default_pack.is_empty());
assert!(config.monitoring.port > 0);
assert!(config.core.port > 0);
assert!(config.admission.port > 0);
}
#[test]
fn test_config_clone_and_debug() {
let original = Config::development();
let cloned = original.clone();
assert_eq!(original.nats.url, cloned.nats.url);
assert_eq!(original.http.port, cloned.http.port);
assert_eq!(original.logging.level, cloned.logging.level);
let debug_str = format!("{:?}", original);
assert!(debug_str.contains("Config"));
assert!(!debug_str.is_empty());
}
}