use crate::simulator::PerformanceSimulator;
use async_trait::async_trait;
use mockforge_core::middleware_traits;
use serde_json::Value;
use std::sync::Arc;
#[derive(Clone)]
pub struct PerformanceMiddlewareAdapter {
inner: Arc<PerformanceSimulator>,
}
impl PerformanceMiddlewareAdapter {
pub fn new(simulator: Arc<PerformanceSimulator>) -> Self {
Self { inner: simulator }
}
pub fn inner(&self) -> &Arc<PerformanceSimulator> {
&self.inner
}
}
#[async_trait]
impl middleware_traits::PerformanceMiddleware for PerformanceMiddlewareAdapter {
async fn record_request(&self, path: &str, method: &str, duration_ms: u64, status: u16) {
let error = if status >= 400 {
Some(format!("HTTP {}", status))
} else {
None
};
self.inner.record_completion(path, method, duration_ms, status, error).await;
}
async fn report(&self) -> Value {
let snapshot = self.inner.get_snapshot().await;
serde_json::to_value(&snapshot).unwrap_or(Value::Null)
}
async fn reset(&self) {
self.inner.stop().await;
}
async fn is_running(&self) -> bool {
self.inner.is_running().await
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::simulator::SimulatorConfig;
use mockforge_core::middleware_traits::PerformanceMiddleware as PerformanceMiddlewareTrait;
#[tokio::test]
async fn test_adapter_creation() {
let config = SimulatorConfig::new(10.0);
let simulator = Arc::new(PerformanceSimulator::new(config));
let adapter = PerformanceMiddlewareAdapter::new(simulator);
assert!(!adapter.is_running().await);
}
#[tokio::test]
async fn test_adapter_record_and_report() {
let config = SimulatorConfig::new(10.0);
let simulator = Arc::new(PerformanceSimulator::new(config));
let adapter = PerformanceMiddlewareAdapter::new(simulator);
adapter.record_request("/api/users", "GET", 50, 200).await;
let report = adapter.report().await;
assert!(report.is_object());
assert!(report.get("metrics").is_some());
}
#[tokio::test]
async fn test_adapter_as_trait_object() {
let config = SimulatorConfig::new(10.0);
let simulator = Arc::new(PerformanceSimulator::new(config));
let adapter = PerformanceMiddlewareAdapter::new(simulator);
let trait_obj: Arc<dyn PerformanceMiddlewareTrait> = Arc::new(adapter);
assert!(!trait_obj.is_running().await);
let report = trait_obj.report().await;
assert!(report.is_object());
}
}