use crate::model_explainer::{ModelExplainer, SecurityConfig};
use crate::model_optimizer::ModelParameters;
use crate::ml_metrics::ModelMetrics;
use std::time::Duration;
#[test]
fn test_model_explanation() {
let feature_names = vec![
"time_of_day".to_string(),
"location".to_string(),
"device_type".to_string(),
"failed_attempts".to_string(),
];
let security_config = SecurityConfig {
false_positive_weight: 0.7,
false_negative_weight: 0.3,
risk_threshold: 0.8,
};
let explainer = ModelExplainer::new(feature_names, security_config);
let params = ModelParameters {
learning_rate: 0.01,
batch_size: 32,
num_trees: 100,
max_depth: 10,
feature_sampling_ratio: 0.7,
};
let metrics = create_test_metrics();
let explanation = explainer.explain_model(¶ms, &metrics);
assert!(!explanation.feature_importance.is_empty());
assert!(explanation.feature_importance.values().all(|&v| v >= 0.0 && v <= 1.0));
assert!(explanation.security_impact.false_positive_impact >= 0.0);
assert!(explanation.security_impact.false_negative_impact >= 0.0);
assert!(!explanation.security_impact.risk_factors.is_empty());
}
#[test]
fn test_security_impact_analysis() {
let feature_names = vec!["test_feature".to_string()];
let security_config = SecurityConfig {
false_positive_weight: 0.8,
false_negative_weight: 0.2,
risk_threshold: 0.9,
};
let explainer = ModelExplainer::new(feature_names, security_config);
let metrics = create_test_metrics();
let security_impact = explainer.analyze_security_impact(&metrics);
assert!(!security_impact.risk_factors.is_empty());
for factor in &security_impact.risk_factors {
assert!(factor.impact_score >= 0.0 && factor.impact_score <= 1.0);
assert!(!factor.mitigation_strategy.is_empty());
}
}
fn create_test_metrics() -> ModelMetrics {
ModelMetrics {
model_id: "test_model".to_string(),
timestamp: chrono::Utc::now(),
accuracy: 0.85,
precision: 0.82,
recall: 0.88,
f1_score: 0.85,
confusion_matrix: Default::default(),
feature_importance: Default::default(),
training_duration: Duration::from_secs(60),
}
}