76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
import unittest
|
|
import asyncio
|
|
from unittest.mock import MagicMock, patch
|
|
from app.core import chunker
|
|
|
|
class TestWP15Orchestration(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
# Basis Config
|
|
self.config = {
|
|
"strategy": "sliding_window",
|
|
"enable_smart_edge_allocation": True,
|
|
"target": 100, "max": 200
|
|
}
|
|
|
|
@patch("app.core.chunker.get_semantic_analyzer")
|
|
@patch("app.core.chunker.build_edges_for_note")
|
|
def test_smart_allocation_flow(self, mock_build_edges, mock_get_analyzer):
|
|
"""
|
|
Prüft, ob Kanten gefunden, gefiltert und injiziert werden.
|
|
"""
|
|
# 1. Mock Edge Discovery (Simuliert derive_edges.py)
|
|
# Wir simulieren, dass im Text 2 Kanten gefunden wurden.
|
|
mock_build_edges.return_value = [
|
|
{"kind": "uses", "target_id": "tool_a"},
|
|
{"kind": "references", "target_id": "doc_b"}
|
|
]
|
|
|
|
# 2. Mock LLM Analyzer (Simuliert semantic_analyzer.py)
|
|
mock_analyzer_instance = MagicMock()
|
|
mock_get_analyzer.return_value = mock_analyzer_instance
|
|
|
|
# Simuliere LLM Antwort: Chunk 1 bekommt "tool_a", Chunk 2 bekommt nichts.
|
|
async def mock_assign(text, candidates, type):
|
|
if "Tool A" in text:
|
|
return ["uses:tool_a"]
|
|
return []
|
|
|
|
mock_analyzer_instance.assign_edges_to_chunk.side_effect = mock_assign
|
|
|
|
# 3. Run Chunker
|
|
md_text = """
|
|
# Intro
|
|
Hier nutzen wir Tool A für Tests.
|
|
|
|
# Outro
|
|
Hier ist nur Text ohne Tool.
|
|
"""
|
|
|
|
# Wir führen assemble_chunks aus (im Event Loop des Tests)
|
|
chunks = asyncio.run(chunker.assemble_chunks(
|
|
"test_note", md_text, "concept", config=self.config
|
|
))
|
|
|
|
# 4. Assertions
|
|
|
|
# Check: Wurde derive_edges aufgerufen?
|
|
mock_build_edges.assert_called_once()
|
|
|
|
# Check: Wurde LLM Analyzer aufgerufen?
|
|
self.assertTrue(mock_analyzer_instance.assign_edges_to_chunk.called)
|
|
|
|
# Check: Injection in Chunk 1 (Tool A Text)
|
|
chunk_with_tool = next((c for c in chunks if "Tool A" in c.text), None)
|
|
self.assertIsNotNone(chunk_with_tool)
|
|
self.assertIn("[[rel:uses|tool_a]]", chunk_with_tool.text, "Kante wurde nicht injiziert!")
|
|
|
|
# Check: Fallback (Die Kante 'references:doc_b' wurde vom LLM nirgends zugeordnet)
|
|
# Sie sollte also in ALLEN Chunks als Fallback landen.
|
|
for c in chunks:
|
|
self.assertIn("[[rel:references|doc_b]]", c.text, "Fallback-Kante fehlt!")
|
|
|
|
print("✅ WP-15 Logic Test passed.")
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main() |