use crate::adaptive_learning::{AdaptiveAnalyzer, AdaptiveConfig, ModelHealth};
use crate::behavioral::{AccessEvent, Anomaly};
use chrono::{Utc, Duration};
use std::time::Duration as StdDuration;
#[tokio::test]
async fn test_adaptive_learning() {
let config = AdaptiveConfig {
performance_window_size: 5,
min_performance_threshold: 0.7,
max_history_size: 100,
auto_retrain: true,
};
let mut analyzer = AdaptiveAnalyzer::new(config);
let events = generate_test_events();
let anomalies = generate_test_anomalies();
let initial_metrics = analyzer.update_model(&events, &anomalies)
.expect("Model training failed");
assert!(initial_metrics.current_performance.accuracy > 0.0);
let test_event = AccessEvent {
user_id: "test_user".to_string(),
resource: "sensitive_data".to_string(),
timestamp: Utc::now(),
duration: StdDuration::from_secs(30),
success: true,
};
let prediction = analyzer.analyze(&test_event)
.expect("Prediction failed");
match prediction.model_health {
ModelHealth::Healthy => println!("Model is healthy"),
ModelHealth::NeedsAttention => println!("Model needs attention"),
ModelHealth::Critical => println!("Model is critical"),
}
assert!(prediction.confidence_adjustment > 0.0);
assert!(prediction.confidence_adjustment <= 1.0);
}
#[tokio::test]
async fn test_model_optimization() {
let config = AdaptiveConfig {
performance_window_size: 5,
min_performance_threshold: 0.7,
max_history_size: 100,
auto_retrain: true,
};
let mut analyzer = AdaptiveAnalyzer::new(config);
let events = generate_test_events();
let anomalies = generate_test_anomalies();
analyzer.update_model(&events, &anomalies).expect("Model training failed");
if let Some(optimization_result) = analyzer.optimize_model() {
assert!(optimization_result.performance_improvement >= 0.0);
assert!(optimization_result.best_params.learning_rate > 0.0);
assert!(optimization_result.best_params.learning_rate < 1.0);
}
let test_event = generate_single_test_event();
let prediction = analyzer.analyze(&test_event).expect("Prediction failed");
assert!(prediction.confidence_adjustment > 0.0);
assert!(matches!(prediction.model_health, ModelHealth::Healthy | ModelHealth::NeedsAttention));
}
fn generate_test_events() -> Vec<AccessEvent> {
vec![
AccessEvent {
user_id: "user1".to_string(),
resource: "resource1".to_string(),
timestamp: Utc::now(),
duration: StdDuration::from_secs(10),
success: true,
},
]
}
fn generate_test_anomalies() -> Vec<Anomaly> {
vec![
Anomaly {
anomaly_type: crate::behavioral::AnomalyType::UnusualAccessTime,
severity: 0.8,
description: "Unusual access time".to_string(),
timestamp: Utc::now(),
},
]
}
fn generate_single_test_event() -> AccessEvent {
AccessEvent {
user_id: "test_user".to_string(),
resource: "sensitive_data".to_string(),
timestamp: chrono::Utc::now(),
duration: std::time::Duration::from_secs(30),
success: true,
}
}