use std::path::PathBuf;
use pretty_assertions::assert_eq;
use random_image_server::cache::{CacheBackend, CacheKey, CacheValue, FileSystemCache};
use url::Url;
#[test]
fn test_new_cache() {
let cache = FileSystemCache::new();
assert_eq!(cache.size(), 0);
assert!(cache.is_empty());
assert!(cache.keys().is_empty());
}
#[test]
fn test_set_and_get() {
let mut cache = FileSystemCache::new();
let key = CacheKey::ImagePath(PathBuf::from("/test/image.jpg"));
let value = CacheValue {
data: vec![1, 2, 3, 4],
content_type: "image/jpeg".to_string(),
};
assert!(cache.set(key.clone(), value.clone()).is_ok());
assert_eq!(cache.size(), 1);
assert!(!cache.is_empty());
assert_eq!(cache.get(key), Some(value));
}
#[test]
fn test_get_nonexistent() {
let cache = FileSystemCache::new();
let key = CacheKey::ImagePath(PathBuf::from("/nonexistent.jpg"));
assert_eq!(cache.get(key), None);
}
#[test]
fn test_remove() {
let mut cache = FileSystemCache::new();
let key = CacheKey::ImagePath(PathBuf::from("/test/image.jpg"));
let value = CacheValue {
data: vec![1, 2, 3, 4],
content_type: "image/jpeg".to_string(),
};
cache.set(key.clone(), value).unwrap();
assert_eq!(cache.size(), 1);
let _removed = cache.remove(&key);
assert_eq!(cache.size(), 0);
}
#[test]
fn test_get_random_empty_cache() {
let cache = FileSystemCache::new();
assert_eq!(cache.get_random(), None);
}
#[test]
fn test_get_random_single_item() {
let mut cache = FileSystemCache::new();
let key = CacheKey::ImagePath(PathBuf::from("/test/image.jpg"));
let value = CacheValue {
data: vec![1, 2, 3, 4],
content_type: "image/jpeg".to_string(),
};
cache.set(key, value.clone()).unwrap();
assert_eq!(cache.get_random(), Some(value));
}
#[test]
fn test_clear() {
let mut cache = FileSystemCache::new();
let key = CacheKey::ImagePath(PathBuf::from("/test/image.jpg"));
let value = CacheValue {
data: vec![1, 2, 3, 4],
content_type: "image/jpeg".to_string(),
};
cache.set(key, value).unwrap();
assert_eq!(cache.size(), 1);
assert!(cache.clear().is_ok());
assert_eq!(cache.size(), 0);
assert!(cache.is_empty());
}
#[test]
fn test_keys() {
let mut cache = FileSystemCache::new();
let k1 = CacheKey::ImagePath(PathBuf::from("/test/image1.jpg"));
let k2 = CacheKey::ImageUrl(Url::parse("https://example.com/image.jpg").unwrap());
let value = CacheValue {
data: vec![1, 2, 3, 4],
content_type: "image/jpeg".to_string(),
};
cache.set(k1.clone(), value.clone()).unwrap();
cache.set(k2.clone(), value).unwrap();
let keys = cache.keys();
assert_eq!(keys.len(), 2);
assert!(keys.contains(&k1));
assert!(keys.contains(&k2));
}
#[test]
fn test_hash_validation() {
let mut cache = FileSystemCache::new();
let key = CacheKey::ImagePath(PathBuf::from("/test/image.jpg"));
let value = CacheValue {
data: vec![1, 2, 3, 4],
content_type: "image/jpeg".to_string(),
};
cache.set(key.clone(), value).unwrap();
if let Some(fs_value) = cache.cache.get(&key) {
std::fs::write(&fs_value.path, vec![9, 9, 9, 9]).unwrap();
assert_eq!(cache.get(key), None);
assert!(!fs_value.path.exists());
}
}