106 lines
3.0 KiB
Python
106 lines
3.0 KiB
Python
"""Tests for on_file_read.sh hook — skip rules and dedup logic."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
|
|
SCRIPT = os.path.join(os.path.dirname(__file__), "..", "scripts", "on_file_read.sh")
|
|
|
|
|
|
def _run_hook(file_path: str, env_overrides: dict | None = None) -> subprocess.CompletedProcess:
|
|
env = {
|
|
**os.environ,
|
|
"MEM0_API_KEY": "",
|
|
"CLAUDE_PLUGIN_OPTION_API_KEY": "",
|
|
"CLAUDE_PLUGIN_OPTION_MEM0_API_KEY": "",
|
|
"USER": "testuser",
|
|
}
|
|
if env_overrides:
|
|
env.update(env_overrides)
|
|
|
|
payload = json.dumps({"tool_name": "Read", "tool_input": {"file_path": file_path}})
|
|
return subprocess.run(
|
|
["bash", SCRIPT],
|
|
input=payload,
|
|
capture_output=True,
|
|
text=True,
|
|
env=env,
|
|
timeout=8,
|
|
)
|
|
|
|
|
|
def test_skip_png():
|
|
result = _run_hook("/project/logo.png")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_lockfile():
|
|
result = _run_hook("/project/package-lock.json")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_min_js():
|
|
result = _run_hook("/project/dist/bundle.min.js")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_node_modules():
|
|
result = _run_hook("/project/node_modules/lodash/index.js")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_git_dir():
|
|
result = _run_hook("/project/.git/config")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_pycache():
|
|
result = _run_hook("/project/__pycache__/module.cpython-311.pyc")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_no_api_key(tmp_path):
|
|
"""Code file but no API key — should exit cleanly with no output."""
|
|
result = _run_hook("/project/src/app.py", {"MEM0_API_KEY": "", "HOME": str(tmp_path)})
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_skip_empty_file_path():
|
|
"""Empty file_path — should exit cleanly."""
|
|
result = _run_hook("")
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
|
|
|
|
def test_dedup_repeated_reads(tmp_path):
|
|
"""Same file read twice — second should be skipped (via dedup file)."""
|
|
dedup_file = str(tmp_path / "mem0_recent_reads_testuser")
|
|
env = {"MEM0_API_KEY": "fake-key", "USER": "testuser"}
|
|
|
|
# Write the file path into the dedup tracking file
|
|
with open(dedup_file, "w") as f:
|
|
f.write("/project/src/app.py\n")
|
|
|
|
# Patch RECENT_FILE by providing the USER env and ensuring /tmp has the file
|
|
# Since the script uses /tmp/mem0_recent_reads_${USER}, we create it there
|
|
tmp_dedup = "/tmp/mem0_recent_reads_testuser"
|
|
try:
|
|
with open(tmp_dedup, "w") as f:
|
|
f.write("/project/src/app.py\n")
|
|
|
|
result = _run_hook("/project/src/app.py", env)
|
|
assert result.returncode == 0
|
|
assert result.stdout == ""
|
|
finally:
|
|
if os.path.exists(tmp_dedup):
|
|
os.remove(tmp_dedup)
|