use crate::time_series_analyzer::{TimeSeriesAnalyzer, TimeSeriesConfig};
use crate::alert_storage::StoredAlert;
use chrono::{Utc, Duration};
#[test]
fn test_time_series_analysis() {
let config = TimeSeriesConfig {
min_data_points: 10,
forecast_horizon: Duration::hours(24),
seasonality_threshold: 0.3,
trend_threshold: 0.1,
};
let analyzer = TimeSeriesAnalyzer::new(config);
let alerts = create_test_time_series();
let analysis = analyzer.analyze(&alerts).expect("Analysis failed");
assert!(analysis.trend.confidence > 0.0);
assert!(analysis.trend.confidence <= 1.0);
assert!(!analysis.seasonality.daily_peak_hours.is_empty());
assert!(analysis.seasonality.confidence > 0.0);
assert!(!analysis.forecasts.is_empty());
for forecast in &analysis.forecasts {
assert!(forecast.confidence_interval.0 <= forecast.expected_value);
assert!(forecast.confidence_interval.1 >= forecast.expected_value);
assert!(forecast.probability >= 0.0 && forecast.probability <= 1.0);
}
}
fn create_test_time_series() -> Vec<StoredAlert> {
let base_time = Utc::now() - Duration::hours(48);
let mut alerts = Vec::new();
for i in 0..48 {
let hour = i % 24;
let base_value = match hour {
9..=17 => 80.0,
_ => 40.0,
};
let trend = i as f64 * 0.5;
let noise = rand::random::<f64>() * 10.0;
alerts.push(StoredAlert {
id: uuid::Uuid::new_v4(),
incident_id: format!("INC_{}", i),
severity: "Warning".to_string(),
message: "Test alert".to_string(),
metric_name: "cpu_usage".to_string(),
current_value: base_value + trend + noise,
threshold: 90.0,
created_at: base_time + Duration::hours(i),
resolved_at: None,
metadata: serde_json::Value::Null,
});
}
alerts
}