44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
|
|
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")
|