use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct AnalyticsResponse {
pub collection: String,
pub period_24h: PeriodStats,
pub period_7d: PeriodStats,
pub period_30d: PeriodStats,
pub top_queries: Vec<TopQuery>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PeriodStats {
pub query_count: u32,
pub avg_latency_ms: f64,
pub avg_score: f64,
pub avg_result_count: f64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TopQuery {
pub query: String,
pub count: u32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_analytics_response() {
let json = r#"{
"collection": "docs",
"period_24h": {"query_count": 10, "avg_latency_ms": 50.5, "avg_score": 0.85, "avg_result_count": 5.2},
"period_7d": {"query_count": 70, "avg_latency_ms": 48.0, "avg_score": 0.82, "avg_result_count": 4.8},
"period_30d": {"query_count": 300, "avg_latency_ms": 52.1, "avg_score": 0.80, "avg_result_count": 5.0},
"top_queries": [{"query": "how to deploy", "count": 15}]
}"#;
let resp: AnalyticsResponse = serde_json::from_str(json).unwrap();
assert_eq!(resp.collection, "docs");
assert_eq!(resp.period_24h.query_count, 10);
assert_eq!(resp.top_queries.len(), 1);
assert_eq!(resp.top_queries[0].count, 15);
}
}