pub mod memory;
pub use memory::{Memory, MemoryQuery, MemoryStats, MemoryValue, SortOrder};
pub mod in_memory;
pub use in_memory::{InMemoryConfig, InMemoryStorage};
pub mod database;
#[cfg(feature = "database")]
pub use database::{DatabaseConfig, DatabaseStorage};
pub use crate::storage_legacy::*;
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_memory_value_conversions() {
let val = MemoryValue::from("test");
assert_eq!(val.as_string().unwrap(), "test");
let val = MemoryValue::from(42i64);
assert_eq!(val.as_integer().unwrap(), 42);
let val = MemoryValue::from(3.14f64);
assert_eq!(val.as_float().unwrap(), 3.14);
let val = MemoryValue::from(true);
assert_eq!(val.as_boolean().unwrap(), true);
}
#[tokio::test]
async fn test_in_memory_storage() {
let storage = InMemoryStorage::new();
storage
.set("test", MemoryValue::from("value"))
.await
.unwrap();
assert!(storage.exists("test").await.unwrap());
let val = storage.get("test").await.unwrap();
assert_eq!(val.unwrap().as_string().unwrap(), "value");
assert!(storage.delete("test").await.unwrap());
assert!(!storage.exists("test").await.unwrap());
}
#[tokio::test]
async fn test_namespace_operations() {
let storage = InMemoryStorage::new();
storage
.set("users::alice", MemoryValue::from("Alice"))
.await
.unwrap();
storage
.set("users::bob", MemoryValue::from("Bob"))
.await
.unwrap();
storage
.set("sessions::abc", MemoryValue::from("active"))
.await
.unwrap();
assert_eq!(storage.count(Some("users")).await.unwrap(), 2);
assert_eq!(storage.count(Some("sessions")).await.unwrap(), 1);
storage.clear(Some("users")).await.unwrap();
assert_eq!(storage.count(Some("users")).await.unwrap(), 0);
assert_eq!(storage.count(Some("sessions")).await.unwrap(), 1);
}
#[tokio::test]
async fn test_bulk_operations() {
let storage = InMemoryStorage::new();
let pairs = vec![
("key1".to_string(), MemoryValue::from(1i64)),
("key2".to_string(), MemoryValue::from(2i64)),
("key3".to_string(), MemoryValue::from(3i64)),
];
storage.mset(&pairs).await.unwrap();
let keys = vec!["key1".to_string(), "key2".to_string(), "key3".to_string()];
let values = storage.mget(&keys).await.unwrap();
assert_eq!(values.len(), 3);
assert!(values.iter().all(|v| v.is_some()));
let deleted = storage.mdelete(&keys).await.unwrap();
assert_eq!(deleted, 3);
}
#[tokio::test]
async fn test_query_operations() {
let storage = InMemoryStorage::new();
storage
.set("user:1", MemoryValue::from("Alice"))
.await
.unwrap();
storage
.set("user:2", MemoryValue::from("Bob"))
.await
.unwrap();
storage
.set("post:1", MemoryValue::from("Post 1"))
.await
.unwrap();
let query = MemoryQuery::new().with_pattern("user:");
let keys = storage.keys(&query).await.unwrap();
assert_eq!(keys.len(), 2);
let query = MemoryQuery::new().with_limit(1);
let keys = storage.keys(&query).await.unwrap();
assert_eq!(keys.len(), 1);
}
#[tokio::test]
async fn test_stats() {
let storage = InMemoryStorage::new();
storage
.set("test1", MemoryValue::from("value1"))
.await
.unwrap();
storage
.set("test2", MemoryValue::from("value2"))
.await
.unwrap();
let stats = storage.stats().await.unwrap();
assert_eq!(stats.total_keys, 2);
assert_eq!(stats.backend_type, "in_memory");
assert!(stats.memory_bytes > 0);
}
#[tokio::test]
async fn test_health_check() {
let storage = InMemoryStorage::new();
assert!(storage.health_check().await.unwrap());
}
}