odysseus/tests/test_docs_query_nondict_rows.py
RaresKeY 8cb8b074a4
fix(docs): map live VectorRAG result shapes (#5960)
* fix(docs): map live VectorRAG result shapes

* fix(docs): normalize optional VectorRAG fields

---------

Co-authored-by: Alexandre Teixeira <alexandremagteixeira@gmail.com>
2026-08-17 00:07:12 +01:00

95 lines
2.7 KiB
Python

import asyncio
from services.docs.service import DocsService
class _FakeRag:
"""Stands in for RAGManager.search. A corrupt or stale Chroma index can
return a non-dict row alongside the well-formed ones."""
def search(self, query, k=5):
return [
{
"document": "alpha",
"metadata": {"source": "a.txt"},
"similarity": 0.9,
},
"corrupt-row",
None,
]
def index_personal_documents(self, directory):
return {"indexed_count": 7, "failed_count": 2, "errors": ["bad.pdf"]}
def test_query_skips_non_dict_rag_rows():
# Bypass __init__ (it builds a real RAGManager / Chroma client) and inject
# a fake search backend.
svc = DocsService.__new__(DocsService)
svc.rag = _FakeRag()
out = asyncio.run(svc.query("anything"))
# old code called r.get(...) on the str/None rows and raised AttributeError.
assert [c.text for c in out] == ["alpha"]
assert out[0].source == "a.txt"
assert out[0].score == 0.9
def test_index_maps_live_vectorrag_result_shape():
svc = DocsService.__new__(DocsService)
svc.rag = _FakeRag()
out = asyncio.run(svc.index("/documents"))
assert out.indexed == 7
assert out.failed == 2
assert out.errors == ["bad.pdf"]
def test_query_normalizes_null_canonical_fields_and_malformed_metadata():
class _MalformedRag:
def search(self, query, k=5):
return [
{
"document": None,
"text": "legacy text",
"source": None,
"similarity": None,
"score": 0.4,
"metadata": "not-a-dict",
},
{
"document": "canonical zero",
"similarity": 0.0,
"metadata": {"source": "nested.txt"},
},
{
"document": None,
"text": None,
"content": "content fallback",
"similarity": 0.2,
"metadata": ["unexpected"],
},
]
svc = DocsService.__new__(DocsService)
svc.rag = _MalformedRag()
out = asyncio.run(svc.query("query"))
assert [chunk.text for chunk in out] == [
"legacy text",
"canonical zero",
"content fallback",
]
assert out[0].source == "unknown"
assert out[0].score == 0.4
assert out[0].metadata == {}
assert out[1].source == "nested.txt"
assert out[1].score == 0.0
assert out[1].metadata == {"source": "nested.txt"}
assert out[2].source == "unknown"
assert out[2].score == 0.2
assert out[2].metadata == {}