diff --git a/tests/test_knowledge_base_ast.py b/tests/test_knowledge_base_ast.py new file mode 100644 index 00000000..287b7d00 --- /dev/null +++ b/tests/test_knowledge_base_ast.py @@ -0,0 +1,43 @@ +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")