use std::time::Duration;
use sz_orm_core::{Cache, CacheError, MemoryCache, MultiLevelCache};
#[test]
fn test_cache_get_misses_return_ok_none_contract() {
let cache = MemoryCache::new();
let result = cache.get("missing_key").unwrap();
assert!(result.is_none());
}
#[test]
fn test_cache_set_then_get_contract() {
let cache = MemoryCache::new();
cache.set("k1", b"v1".to_vec(), None).unwrap();
let v = cache.get("k1").unwrap();
assert_eq!(v, Some(b"v1".to_vec()));
}
#[test]
fn test_cache_delete_contract() {
let cache = MemoryCache::new();
cache.set("k1", b"v1".to_vec(), None).unwrap();
assert!(cache.get("k1").unwrap().is_some());
cache.delete("k1").unwrap();
assert!(cache.get("k1").unwrap().is_none());
}
#[test]
fn test_cache_clear_contract() {
let cache = MemoryCache::new();
cache.set("k1", b"v1".to_vec(), None).unwrap();
cache.set("k2", b"v2".to_vec(), None).unwrap();
cache.clear().unwrap();
assert!(cache.get("k1").unwrap().is_none());
assert!(cache.get("k2").unwrap().is_none());
}
#[test]
fn test_cache_exists_contract() {
let cache = MemoryCache::new();
assert!(!cache.exists("k1").unwrap());
cache.set("k1", b"v1".to_vec(), None).unwrap();
assert!(cache.exists("k1").unwrap());
cache.delete("k1").unwrap();
assert!(!cache.exists("k1").unwrap());
}
#[test]
fn test_cache_set_with_ttl_expires_contract() {
let cache = MemoryCache::new();
cache
.set("k1", b"v1".to_vec(), Some(Duration::from_millis(50)))
.unwrap();
assert!(cache.get("k1").unwrap().is_some());
std::thread::sleep(Duration::from_millis(100));
assert!(
cache.get("k1").unwrap().is_none(),
"TTL 过期后 get 应返回 None"
);
}
#[test]
fn test_cache_set_without_ttl_persists_contract() {
let cache = MemoryCache::new();
cache.set("k1", b"v1".to_vec(), None).unwrap();
std::thread::sleep(Duration::from_millis(50));
assert!(cache.get("k1").unwrap().is_some());
}
#[test]
fn test_cache_expire_sets_ttl_contract() {
let cache = MemoryCache::new();
cache.set("k1", b"v1".to_vec(), None).unwrap();
cache.expire("k1", Duration::from_millis(50)).unwrap();
std::thread::sleep(Duration::from_millis(100));
assert!(cache.get("k1").unwrap().is_none());
}
#[test]
fn test_cache_expire_missing_key_returns_not_found_contract() {
let cache = MemoryCache::new();
let err = cache.expire("missing", Duration::from_secs(1)).unwrap_err();
assert!(matches!(err, CacheError::NotFound(_)));
}
#[test]
fn test_cache_ttl_returns_remaining_duration_contract() {
let cache = MemoryCache::new();
cache
.set("k1", b"v1".to_vec(), Some(Duration::from_secs(10)))
.unwrap();
let ttl = cache.ttl("k1").unwrap();
assert!(ttl.is_some(), "有 TTL 的键应返回 Some(剩余时长)");
assert!(ttl.unwrap() <= Duration::from_secs(10));
}
#[test]
fn test_cache_ttl_missing_key_returns_not_found_contract() {
let cache = MemoryCache::new();
let err = cache.ttl("missing").unwrap_err();
assert!(matches!(err, CacheError::NotFound(_)));
}
#[test]
fn test_memory_cache_new_returns_self_contract() {
let cache: MemoryCache = MemoryCache::new();
assert!(!cache.exists("any_key").unwrap());
assert!(cache.get("any_key").unwrap().is_none());
}
#[test]
fn test_memory_cache_default_contract() {
let cache: MemoryCache = Default::default();
assert!(!cache.exists("any_key").unwrap());
assert!(cache.get("any_key").unwrap().is_none());
}
#[test]
fn test_memory_cache_with_ttl_contract() {
let cache = MemoryCache::with_ttl(Duration::from_secs(100));
cache.set("k1", b"v1".to_vec(), None).unwrap();
let ttl = cache.ttl("k1").unwrap();
assert!(ttl.is_some());
}
#[test]
fn test_multi_level_cache_new_contract() {
let cache: MultiLevelCache = MultiLevelCache::new();
assert!(cache.get("any_key").unwrap().is_none());
}
#[test]
fn test_multi_level_cache_empty_misses_contract() {
let cache = MultiLevelCache::new();
assert!(cache.get("k1").unwrap().is_none());
}