use crate::monitoring::{ModelMonitor, MonitoringConfig, HealthStatus, AlertSeverity};
use crate::ml_metrics::ModelMetrics;
use crate::model_explainer::{SecurityImpactAnalysis, RiskFactor};
use chrono::{Duration, Utc};
use std::time::Duration as StdDuration;
#[tokio::test]
async fn test_model_monitoring() {
let config = MonitoringConfig {
metrics_window_size: 10,
performance_threshold: 0.8,
security_threshold: 0.3,
alert_cooldown: Duration::hours(1),
};
let monitor = ModelMonitor::new(config);
let metrics = create_test_metrics(0.75);
monitor.update_metrics(metrics).await;
let security = create_test_security_analysis(0.4);
monitor.update_security_analysis(security).await;
let health = monitor.get_model_health().await;
assert_eq!(health.current_status, HealthStatus::Degraded);
assert!(!health.alerts.is_empty());
let critical_alerts: Vec<_> = health.alerts.iter()
.filter(|a| a.severity == AlertSeverity::Critical)
.collect();
assert!(!critical_alerts.is_empty());
}
fn create_test_metrics(f1_score: f64) -> ModelMetrics {
ModelMetrics {
model_id: "test_model".to_string(),
timestamp: Utc::now(),
accuracy: f1_score,
precision: f1_score,
recall: f1_score,
f1_score,
confusion_matrix: Default::default(),
feature_importance: Default::default(),
training_duration: StdDuration::from_secs(60),
}
}
fn create_test_security_analysis(risk_level: f64) -> SecurityImpactAnalysis {
SecurityImpactAnalysis {
false_positive_impact: risk_level,
false_negative_impact: risk_level / 2.0,
risk_factors: vec![
RiskFactor {
name: "Test Risk".to_string(),
impact_score: risk_level,
mitigation_strategy: "Test mitigation".to_string(),
}
],
}
}