#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[tokio::test]
async fn test_configuration_service_creation() {
let config_service = ConfigurationService::new(None);
let config = config_service.get_config().unwrap();
assert_eq!(config.system.project_name, "pmat");
assert_eq!(config.quality.max_complexity, 30);
assert!(!config.quality.allow_satd);
}
#[tokio::test]
async fn test_configuration_save_load() {
let temp_dir = tempdir().unwrap();
let config_path = temp_dir.path().join("test_config.toml");
let config_service = ConfigurationService::new(Some(config_path.clone()));
config_service
.update_config(|config| {
config.system.project_name = "test_project".to_string();
config.quality.max_complexity = 25;
Ok(())
})
.await
.unwrap();
let new_service = ConfigurationService::new(Some(config_path));
new_service.load().await.unwrap();
let loaded_config = new_service.get_config().unwrap();
assert_eq!(loaded_config.system.project_name, "test_project");
assert_eq!(loaded_config.quality.max_complexity, 25);
}
#[tokio::test]
async fn test_configuration_sections() {
let config_service = ConfigurationService::new(None);
let quality_config = config_service.get_quality_config().unwrap();
assert_eq!(quality_config.max_complexity, 30);
let analysis_config = config_service.get_analysis_config().unwrap();
assert!(analysis_config.parallel);
let performance_config = config_service.get_performance_config().unwrap();
assert_eq!(performance_config.test_iterations, 10);
let mcp_config = config_service.get_mcp_config().unwrap();
assert_eq!(mcp_config.server_name, "pmat-mcp-server");
let roadmap_config = config_service.get_roadmap_config().unwrap();
assert!(roadmap_config.auto_generate_todos);
let telemetry_config = config_service.get_telemetry_config().unwrap();
assert!(telemetry_config.enabled);
}
#[tokio::test]
#[ignore] async fn test_service_lifecycle() {
let config_service = ConfigurationService::new(None);
assert!(config_service.start().await.is_ok());
assert!(config_service.health_check().await.unwrap());
let status = config_service.status().await.unwrap();
assert!(status.contains("Configuration service"));
let metrics = config_service.get_metrics().await.unwrap();
assert!(metrics.request_count >= 1);
assert!(config_service.stop().await.is_ok());
}
#[tokio::test]
async fn test_global_configuration_access() {
let config_service = configuration();
let config = config_service.get_config().unwrap();
assert_eq!(config.system.project_name, "pmat");
assert!(config.quality.fail_on_violation);
}
#[test]
fn test_configuration_serialization() {
let config = ConfigurationService::default_config();
let serialized = toml::to_string(&config).unwrap();
assert!(serialized.contains("[system]"));
assert!(serialized.contains("[quality]"));
assert!(serialized.contains("[analysis]"));
assert!(serialized.contains("[performance]"));
assert!(serialized.contains("[mcp]"));
assert!(serialized.contains("[roadmap]"));
assert!(serialized.contains("[telemetry]"));
let deserialized: PmatConfig = toml::from_str(&serialized).unwrap();
assert_eq!(deserialized.system.project_name, config.system.project_name);
assert_eq!(
deserialized.quality.max_complexity,
config.quality.max_complexity
);
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod getter_tests {
use super::*;
#[test]
fn test_default_config_system_values() {
let config = ConfigurationService::default_config();
assert_eq!(config.system.project_name, "pmat");
assert!(config.system.max_concurrent_operations > 0);
assert!(!config.system.verbose);
assert!(!config.system.debug);
assert_eq!(config.system.default_toolchain, "rust");
}
#[test]
fn test_default_config_quality_values() {
let config = ConfigurationService::default_config();
assert_eq!(config.quality.max_complexity, 30);
assert_eq!(config.quality.max_cognitive_complexity, 25);
assert!(config.quality.fail_on_violation);
assert!(!config.quality.allow_satd);
assert!(config.quality.require_docs);
assert!(config.quality.lint_compliance);
}
#[test]
fn test_default_config_analysis_values() {
let config = ConfigurationService::default_config();
assert_eq!(config.analysis.max_file_size, 1024 * 1024); assert_eq!(config.analysis.max_line_length, 100);
assert!(config.analysis.skip_vendor);
assert!(config.analysis.parallel);
assert_eq!(config.analysis.thread_count, 0); assert_eq!(config.analysis.timeout_seconds, 300);
}
#[test]
fn test_default_config_performance_values() {
let config = ConfigurationService::default_config();
assert_eq!(config.performance.test_iterations, 10);
assert_eq!(config.performance.timeout_ms, 30000);
assert!(config.performance.enable_regression_tests);
assert!(config.performance.enable_memory_tests);
assert!(config.performance.enable_throughput_tests);
}
#[test]
fn test_default_config_mcp_values() {
let config = ConfigurationService::default_config();
assert_eq!(config.mcp.server_name, "pmat-mcp-server");
assert!(!config.mcp.server_version.is_empty());
assert!(config.mcp.enable_compression);
assert_eq!(config.mcp.request_timeout_seconds, 30);
assert!(!config.mcp.log_requests);
}
#[test]
fn test_default_config_telemetry_values() {
let config = ConfigurationService::default_config();
assert!(config.telemetry.enabled);
assert_eq!(config.telemetry.collection_interval_seconds, 60);
assert_eq!(config.telemetry.max_data_age_days, 30);
assert!(config.telemetry.enable_aggregation);
assert!(!config.telemetry.enable_export);
}
#[test]
fn test_default_config_semantic_values() {
let config = ConfigurationService::default_config();
assert!(!config.semantic.enabled);
assert!(config.semantic.vector_db_path.is_none());
assert_eq!(config.semantic.embedding_model, "aprender-tfidf-local");
assert_eq!(config.semantic.embedding_dimensions, 256);
}
#[test]
fn test_default_config_custom_empty() {
let config = ConfigurationService::default_config();
assert!(config.custom.is_empty());
}
#[test]
fn test_default_config_roadmap_values() {
let config = ConfigurationService::default_config();
assert!(config.roadmap.auto_generate_todos);
assert!(config.roadmap.enforce_quality_gates);
assert!(config.roadmap.require_task_ids);
assert!(config.roadmap.velocity_tracking);
assert!(!config.roadmap.git.create_branches); }
#[test]
fn test_service_new_without_path() {
let service = ConfigurationService::new(None);
assert!(service.config_path.to_string_lossy().ends_with("pmat.toml"));
}
#[test]
fn test_service_new_with_path() {
let path = PathBuf::from("/tmp/test-config.toml");
let service = ConfigurationService::new(Some(path.clone()));
assert_eq!(service.config_path, path);
}
#[test]
fn test_get_quality_config() {
let service = ConfigurationService::new(None);
let quality = service.get_quality_config().unwrap();
assert_eq!(quality.max_complexity, 30);
}
#[test]
fn test_get_analysis_config() {
let service = ConfigurationService::new(None);
let analysis = service.get_analysis_config().unwrap();
assert_eq!(analysis.max_file_size, 1024 * 1024);
}
#[test]
fn test_get_performance_config() {
let service = ConfigurationService::new(None);
let perf = service.get_performance_config().unwrap();
assert_eq!(perf.test_iterations, 10);
}
#[test]
fn test_get_mcp_config() {
let service = ConfigurationService::new(None);
let mcp = service.get_mcp_config().unwrap();
assert_eq!(mcp.server_name, "pmat-mcp-server");
}
#[test]
fn test_get_roadmap_config() {
let service = ConfigurationService::new(None);
let roadmap = service.get_roadmap_config().unwrap();
assert!(roadmap.auto_generate_todos);
}
#[test]
fn test_get_telemetry_config() {
let service = ConfigurationService::new(None);
let telemetry = service.get_telemetry_config().unwrap();
assert!(telemetry.enabled);
}
#[test]
fn test_get_semantic_config() {
let service = ConfigurationService::new(None);
let semantic = service.get_semantic_config().unwrap();
assert!(!semantic.enabled);
}
#[test]
fn test_get_config_returns_full_config() {
let service = ConfigurationService::new(None);
let config = service.get_config().unwrap();
assert_eq!(config.system.project_name, "pmat");
assert_eq!(config.quality.max_complexity, 30);
assert!(!config.semantic.enabled);
}
}