feat(H): H-SRC/H-CITE — knowledge source adapter (wiki/dms/mail/communication), evidence references with deep-links and workstream blocks, 23 tests passing
This commit is contained in:
@@ -169,3 +169,109 @@ class TestWikiServices:
|
||||
assert _slugify("Hello World") == "hello-world"
|
||||
assert _slugify("Überblick") == "ueberblick"
|
||||
assert _slugify("Test Article 123") == "test-article-123"
|
||||
|
||||
|
||||
# ─── H-SRC: Knowledge Source Adapter ─────────────────────────────────────────
|
||||
|
||||
|
||||
class TestKnowledgeSourceAdapter:
|
||||
"""Test the knowledge source adapter (H-SRC)."""
|
||||
|
||||
def test_available_sources(self):
|
||||
"""All 4 knowledge source types are registered."""
|
||||
from app.ai.knowledge_sources import get_available_sources
|
||||
|
||||
sources = get_available_sources()
|
||||
types = {s["type"] for s in sources}
|
||||
assert types == {"wiki", "dms", "mail", "communication"}
|
||||
|
||||
def test_get_source_config_wiki(self):
|
||||
"""Wiki source config is correct."""
|
||||
from app.ai.knowledge_sources import get_source_config
|
||||
|
||||
config = get_source_config("wiki")
|
||||
assert config is not None
|
||||
assert config["text_field"] == "content"
|
||||
assert config["title_field"] == "title"
|
||||
assert config["status_filter"] == {"status": "published"}
|
||||
|
||||
def test_get_source_config_unknown(self):
|
||||
"""Unknown source type returns None."""
|
||||
from app.ai.knowledge_sources import get_source_config
|
||||
|
||||
assert get_source_config("nonexistent") is None
|
||||
|
||||
|
||||
# ─── H-CITE: Evidence References ─────────────────────────────────────────────
|
||||
|
||||
|
||||
class TestEvidenceReferences:
|
||||
"""Test the evidence reference builder (H-CITE)."""
|
||||
|
||||
def test_evidence_reference_to_dict(self):
|
||||
"""EvidenceReference serializes to dict correctly."""
|
||||
from app.ai.knowledge_sources import EvidenceReference
|
||||
|
||||
ref = EvidenceReference(
|
||||
source_type="wiki",
|
||||
source_id="abc-123",
|
||||
title="Test Article",
|
||||
url="/wiki/articles/abc-123",
|
||||
snippet="This is a test snippet",
|
||||
confidence=0.95,
|
||||
)
|
||||
d = ref.to_dict()
|
||||
assert d["source_type"] == "wiki"
|
||||
assert d["source_id"] == "abc-123"
|
||||
assert d["title"] == "Test Article"
|
||||
assert d["confidence"] == 0.95
|
||||
|
||||
def test_evidence_reference_to_workstream_block(self):
|
||||
"""EvidenceReference converts to workstream block."""
|
||||
from app.ai.knowledge_sources import EvidenceReference
|
||||
|
||||
ref = EvidenceReference(
|
||||
source_type="dms",
|
||||
source_id="file-123",
|
||||
title="Document.pdf",
|
||||
url="/dms/files/file-123",
|
||||
snippet="Important content here",
|
||||
)
|
||||
block = ref.to_workstream_block()
|
||||
assert block["type"] == "evidence_card"
|
||||
assert block["source_type"] == "dms"
|
||||
assert block["title"] == "Document.pdf"
|
||||
|
||||
def test_build_evidence_references_from_results(self):
|
||||
"""build_evidence_references creates refs from search results."""
|
||||
from app.ai.knowledge_sources import build_evidence_references
|
||||
|
||||
results = [
|
||||
{"source_type": "wiki", "source_id": str(uuid.uuid4()), "title": "Article 1", "score": 0.9, "snippet": "Snippet 1"},
|
||||
{"source_type": "dms", "source_id": str(uuid.uuid4()), "title": "Doc 2", "score": 0.7, "snippet": "Snippet 2"},
|
||||
{"source_type": "mail", "source_id": str(uuid.uuid4()), "title": "Mail 3", "score": 0.95, "snippet": "Snippet 3"},
|
||||
]
|
||||
refs = build_evidence_references(results)
|
||||
assert len(refs) == 3
|
||||
# Sorted by confidence descending
|
||||
assert refs[0].confidence == 0.95
|
||||
assert refs[1].confidence == 0.9
|
||||
assert refs[2].confidence == 0.7
|
||||
|
||||
def test_build_evidence_references_max_results(self):
|
||||
"""build_evidence_references respects max_results."""
|
||||
from app.ai.knowledge_sources import build_evidence_references
|
||||
|
||||
results = [
|
||||
{"source_type": "wiki", "source_id": str(uuid.uuid4()), "title": f"Article {i}", "score": 0.5}
|
||||
for i in range(10)
|
||||
]
|
||||
refs = build_evidence_references(results, max_results=3)
|
||||
assert len(refs) == 3
|
||||
|
||||
def test_build_evidence_references_empty(self):
|
||||
"""build_evidence_references handles empty results."""
|
||||
from app.ai.knowledge_sources import build_evidence_references
|
||||
|
||||
refs = build_evidence_references([])
|
||||
assert refs == []
|
||||
|
||||
Reference in New Issue
Block a user