use bytes::Bytes;
use multi_tier_cache::error::CacheError;
use multi_tier_cache::{CacheStrategy, CacheSystem};
use std::time::Duration;
use tokio::time::sleep;
mod common;
#[tokio::test]
async fn test_real_time_strategy_expiry() -> anyhow::Result<()> {
let cache = CacheSystem::new().await?;
let manager = cache.cache_manager();
let key = common::test_key("realtime");
let value = Bytes::from("{\"status\": \"live\"}");
manager
.set_with_strategy(
&key,
value.clone(),
CacheStrategy::Custom(Duration::from_secs(1)),
)
.await?;
let retrieved = manager.get(&key).await?;
assert_eq!(retrieved, Some(value));
sleep(Duration::from_millis(1100)).await;
let expired = manager.get(&key).await?;
assert_eq!(expired, None, "Key should have expired");
Ok(())
}
#[tokio::test]
async fn test_manual_l1_invalidation_check() -> anyhow::Result<()> {
let cache = CacheSystem::new().await?;
let manager = cache.cache_manager();
let key = common::test_key("manual_inv");
let value = Bytes::from("{\"data\": 123}");
manager
.set_with_strategy(&key, value.clone(), CacheStrategy::ShortTerm)
.await?;
assert!(manager.get(&key).await?.is_some());
manager.invalidate(&key).await?;
assert!(manager.get(&key).await?.is_none());
Ok(())
}
#[tokio::test]
async fn test_get_or_compute_error_propagation() -> anyhow::Result<()> {
let cache = CacheSystem::new().await?;
let manager = cache.cache_manager();
let key = common::test_key("compute_err");
let result = manager
.get_or_compute_with(&key, CacheStrategy::ShortTerm, || async {
Err(CacheError::InternalError("Database failure".to_string()))
})
.await;
assert!(result.is_err());
assert_eq!(
result
.err()
.unwrap_or_else(|| panic!("Should be error"))
.to_string(),
"Internal error: Database failure"
);
assert!(manager.get(&key).await?.is_none());
Ok(())
}