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