Files
OpenJarvis/tests/tools/test_retrieval.py
T
Jon Saad-FalconandClaude Opus 4.6 301e9cd2d4 Implement OpenJarvis v1.0 — all five pillars, SDK, benchmarks, Docker
Complete implementation across six development phases (v0.1 through v1.0):

- Core: Registry system, config, event bus, types (Phase 0)
- Intelligence + Inference: Model routing, Ollama/vLLM/llama.cpp/Cloud engines (Phase 1)
- Memory: SQLite/FAISS/ColBERT/BM25/Hybrid backends, document ingest, context injection (Phase 2)
- Agents: Simple/Orchestrator/Custom/OpenClaw agents, tool system (Phase 3)
- Learning: HeuristicRouter, reward functions, GRPO stub, telemetry aggregation (Phase 4)
- SDK: Jarvis class, OpenClaw protocol/transport, benchmarks, Docker deployment (Phase 5)

520 tests passing, 8 skipped (optional deps). Ruff lint clean.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 00:52:48 +00:00

100 lines
3.1 KiB
Python

"""Tests for the retrieval tool."""
from __future__ import annotations
from typing import Any, Dict, List, Optional
from openjarvis.memory._stubs import MemoryBackend, RetrievalResult
from openjarvis.tools.retrieval import RetrievalTool
class _FakeBackend(MemoryBackend):
"""In-memory fake backend for testing."""
backend_id = "fake"
def __init__(self, results: Optional[List[RetrievalResult]] = None) -> None:
self._results = results or []
def store(
self, content: str, *, source: str = "",
metadata: Optional[Dict[str, Any]] = None,
) -> str:
return "fake-id"
def retrieve(
self, query: str, *, top_k: int = 5, **kwargs: Any,
) -> List[RetrievalResult]:
return self._results[:top_k]
def delete(self, doc_id: str) -> bool:
return False
def clear(self) -> None:
self._results.clear()
class _ErrorBackend(_FakeBackend):
def retrieve(
self, query: str, *, top_k: int = 5, **kwargs: Any,
) -> List[RetrievalResult]:
raise RuntimeError("backend error")
class TestRetrievalTool:
def test_spec(self):
tool = RetrievalTool()
assert tool.spec.name == "retrieval"
assert tool.spec.category == "memory"
def test_no_backend(self):
tool = RetrievalTool()
result = tool.execute(query="test")
assert result.success is False
assert "No memory backend" in result.content
def test_empty_query(self):
tool = RetrievalTool(backend=_FakeBackend())
result = tool.execute(query="")
assert result.success is False
def test_no_results(self):
tool = RetrievalTool(backend=_FakeBackend())
result = tool.execute(query="test")
assert result.success is True
assert "No relevant results" in result.content
def test_with_results(self):
results = [
RetrievalResult(content="Answer 1", score=0.9, source="doc.md"),
RetrievalResult(content="Answer 2", score=0.8, source="other.md"),
]
tool = RetrievalTool(backend=_FakeBackend(results))
result = tool.execute(query="test")
assert result.success is True
assert "Answer 1" in result.content
assert "[Source: doc.md]" in result.content
assert result.metadata["num_results"] == 2
def test_top_k_override(self):
results = [
RetrievalResult(content="A", score=0.9),
RetrievalResult(content="B", score=0.8),
RetrievalResult(content="C", score=0.7),
]
tool = RetrievalTool(backend=_FakeBackend(results), top_k=10)
result = tool.execute(query="test", top_k=1)
assert result.success is True
assert "A" in result.content
def test_backend_error(self):
tool = RetrievalTool(backend=_ErrorBackend())
result = tool.execute(query="test")
assert result.success is False
assert "Retrieval error" in result.content
def test_openai_function(self):
tool = RetrievalTool()
fn = tool.to_openai_function()
assert fn["function"]["name"] == "retrieval"