Files
mem0/mem0-plugin/tests/test_on_file_read.py
T

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)