use std::sync::Arc;
use zeph_llm::any::AnyProvider;
use zeph_llm::mock::MockProvider;
use crate::embedding_store::EmbeddingStore;
use crate::error::MemoryError;
use crate::in_memory_store::InMemoryVectorStore;
use crate::semantic::SemanticMemory;
use crate::store::SqliteStore;
use crate::token_counter::TokenCounter;
pub async fn mock_semantic_memory() -> Result<Arc<SemanticMemory>, MemoryError> {
let mut mock = MockProvider::default();
mock.supports_embeddings = true;
mock.embedding = vec![0.1_f32; 384];
let provider = AnyProvider::Mock(mock);
let sqlite = mock_store().await?;
let pool = sqlite.pool().clone();
let qdrant = Some(Arc::new(EmbeddingStore::with_store(
Box::new(InMemoryVectorStore::new()),
pool,
)));
Ok(Arc::new(SemanticMemory::from_parts(
sqlite,
qdrant,
provider,
"mock-embed",
0.7,
0.3,
Arc::new(TokenCounter::new()),
)))
}
#[cfg(feature = "sqlite")]
async fn mock_store() -> Result<SqliteStore, MemoryError> {
SqliteStore::with_pool_size(":memory:", 1).await
}
#[cfg(all(feature = "postgres", not(feature = "sqlite")))]
async fn mock_store() -> Result<SqliteStore, MemoryError> {
let url = std::env::var("ZEPH_TEST_POSTGRES_URL").map_err(|_| {
MemoryError::Other(
"mock_semantic_memory requires the ZEPH_TEST_POSTGRES_URL environment variable \
when built with the postgres backend and no sqlite backend"
.to_string(),
)
})?;
let pool = zeph_db::DbConfig { url, pool_size: 1 }.connect().await?;
SqliteStore::from_pool(pool).await
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn mock_semantic_memory_creates_successfully() {
let memory = mock_semantic_memory().await;
assert!(memory.is_ok(), "mock_semantic_memory should not fail");
}
}