Ctrl K
ComunidadGuías…

tests/test_gemini_hook.py

Rama v8 · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""The Gemini CLI BeforeTool guard nudges toward the graph, shell-agnostically.

Since #522 it runs as `graphify hook-guard gemini` (not a `python -c` one-liner
that depended on a bare `python` on PATH and embedded PowerShell-hostile
backticks). It always returns {"decision":"allow"} so a tool is never blocked,
and appends additionalContext only when a graph exists.
"""
import json
import os
import subprocess
import sys

from graphify.__main__ import _gemini_hook


def _env():
    e = dict(os.environ)
    e.pop("GRAPHIFY_OUT", None)
    return e


def _run(cwd, *, graph: bool):
    if graph:
        (cwd / "graphify-out").mkdir(parents=True, exist_ok=True)
        (cwd / "graphify-out" / "graph.json").write_text("{}", encoding="utf-8")
    return subprocess.run(
        [sys.executable, "-m", "graphify", "hook-guard", "gemini"],
        input="", capture_output=True, text=True, cwd=cwd, env=_env(),
    )


def test_matcher_and_command_shape():
    h = _gemini_hook()
    assert h["matcher"] == "read_file|list_directory"
    cmd = h["hooks"][0]["command"]
    # #522: no bare `python` dependency, no embedded quote/backtick soup.
    assert "python -c" not in cmd
    assert "graphify" in cmd and "hook-guard gemini" in cmd


def test_allows_and_nudges_with_graph(tmp_path):
    out = _run(tmp_path, graph=True).stdout
    payload = json.loads(out)
    assert payload["decision"] == "allow"
    assert "graphify query" in payload["additionalContext"]


def test_allows_without_nudge_when_no_graph(tmp_path):
    out = _run(tmp_path, graph=False).stdout
    payload = json.loads(out)
    assert payload["decision"] == "allow"
    assert "additionalContext" not in payload


def test_never_blocks(tmp_path):
    r = _run(tmp_path, graph=True)
    assert r.returncode == 0
    payload = json.loads(r.stdout)
    assert payload["decision"] == "allow"


def test_honors_graphify_out_override(tmp_path):
    custom = tmp_path / "custom-out"
    custom.mkdir()
    (custom / "graph.json").write_text("{}", encoding="utf-8")
    env = dict(os.environ, GRAPHIFY_OUT=str(custom))
    r = subprocess.run(
        [sys.executable, "-m", "graphify", "hook-guard", "gemini"],
        input="", capture_output=True, text=True, cwd=tmp_path, env=env,
    )
    assert "graphify query" in json.loads(r.stdout).get("additionalContext", "")