Skip to main content

zeph_memory/
testing.rs

1// SPDX-FileCopyrightText: 2026 Andrei G <bug-ops>
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4//! Test helpers for `zeph-memory`.
5//!
6//! Provides `mock_semantic_memory` — a convenience constructor that creates a
7//! fully-wired [`SemanticMemory`] backed by an in-memory `SQLite` database and
8//! [`InMemoryVectorStore`], so tests do not need a real Qdrant or filesystem.
9
10use std::sync::Arc;
11
12use zeph_llm::any::AnyProvider;
13use zeph_llm::mock::MockProvider;
14
15use crate::embedding_store::EmbeddingStore;
16use crate::error::MemoryError;
17use crate::in_memory_store::InMemoryVectorStore;
18use crate::semantic::SemanticMemory;
19use crate::sqlite::SqliteStore;
20use crate::token_counter::TokenCounter;
21
22/// Build a [`SemanticMemory`] that runs entirely in-process with no external
23/// dependencies.
24///
25/// - `SQLite` backend: `:memory:` (in-process, no file I/O)
26/// - Vector backend: [`InMemoryVectorStore`] (cosine similarity search)
27/// - LLM provider: [`MockProvider`] with embedding support enabled
28///
29/// # Errors
30///
31/// Returns `MemoryError` if the in-memory `SQLite` cannot be initialised.
32pub async fn mock_semantic_memory() -> Result<Arc<SemanticMemory>, MemoryError> {
33    let mut mock = MockProvider::default();
34    mock.supports_embeddings = true;
35    mock.embedding = vec![0.1_f32; 384];
36    let provider = AnyProvider::Mock(mock);
37
38    // `:memory:` creates an in-process SQLite database — no disk I/O.
39    let sqlite = SqliteStore::with_pool_size(":memory:", 1).await?;
40    let pool = sqlite.pool().clone();
41
42    // InMemoryVectorStore satisfies the VectorStore trait without Qdrant.
43    let qdrant = Some(Arc::new(EmbeddingStore::with_store(
44        Box::new(InMemoryVectorStore::new()),
45        pool,
46    )));
47
48    Ok(Arc::new(SemanticMemory::from_parts(
49        sqlite,
50        qdrant,
51        provider,
52        "mock-embed",
53        0.7,
54        0.3,
55        Arc::new(TokenCounter::new()),
56    )))
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[tokio::test]
64    async fn mock_semantic_memory_creates_successfully() {
65        let memory = mock_semantic_memory().await;
66        assert!(memory.is_ok(), "mock_semantic_memory should not fail");
67    }
68}