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()