import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts")) from knowledge_base import KnowledgeBase def test_ingest_python_file_extracts_ast_facts(tmp_path: Path) -> None: source = tmp_path / "demo_module.py" source.write_text( "import os\n" "from pathlib import Path\n\n" "CONSTANT = 7\n\n" "def helper(x):\n" " return x + 1\n\n" "class Demo:\n" " def method(self):\n" " return helper(CONSTANT)\n" ) kb = KnowledgeBase() facts = kb.ingest_python_file(source) assert facts, "AST ingestion should add symbolic facts" assert kb.query("defines_function", "demo_module", "helper") == [{}] assert kb.query("defines_class", "demo_module", "Demo") == [{}] assert kb.query("defines_method", "Demo", "method") == [{}] assert kb.query("imports", "demo_module", "os") == [{}] assert kb.query("imports", "demo_module", "pathlib.Path") == [{}] assert kb.query("defines_constant", "demo_module", "CONSTANT") == [{}] def test_ingest_python_file_rejects_invalid_syntax(tmp_path: Path) -> None: broken = tmp_path / "broken.py" broken.write_text("def nope(:\n pass\n") kb = KnowledgeBase() try: kb.ingest_python_file(broken) except SyntaxError: return raise AssertionError("Expected SyntaxError for invalid Python source")