Reorganize flat tests/ directory to mirror source code structure (tools/, gateway/, hermes_cli/, integration/). Add 11 new test files covering previously untested modules: registry, patch_parser, fuzzy_match, todo_tool, approval, file_tools, gateway session/config/ delivery, and hermes_cli config/models. Total: 147 unit tests passing, 9 integration tests gated behind pytest marker.
102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
"""Tests for the todo tool module."""
|
|
|
|
import json
|
|
|
|
from tools.todo_tool import TodoStore, todo_tool
|
|
|
|
|
|
class TestWriteAndRead:
|
|
def test_write_replaces_list(self):
|
|
store = TodoStore()
|
|
items = [
|
|
{"id": "1", "content": "First task", "status": "pending"},
|
|
{"id": "2", "content": "Second task", "status": "in_progress"},
|
|
]
|
|
result = store.write(items)
|
|
assert len(result) == 2
|
|
assert result[0]["id"] == "1"
|
|
assert result[1]["status"] == "in_progress"
|
|
|
|
def test_read_returns_copy(self):
|
|
store = TodoStore()
|
|
store.write([{"id": "1", "content": "Task", "status": "pending"}])
|
|
items = store.read()
|
|
items[0]["content"] = "MUTATED"
|
|
assert store.read()[0]["content"] == "Task"
|
|
|
|
|
|
class TestHasItems:
|
|
def test_empty_store(self):
|
|
store = TodoStore()
|
|
assert store.has_items() is False
|
|
|
|
def test_non_empty_store(self):
|
|
store = TodoStore()
|
|
store.write([{"id": "1", "content": "x", "status": "pending"}])
|
|
assert store.has_items() is True
|
|
|
|
|
|
class TestFormatForInjection:
|
|
def test_empty_returns_none(self):
|
|
store = TodoStore()
|
|
assert store.format_for_injection() is None
|
|
|
|
def test_non_empty_has_markers(self):
|
|
store = TodoStore()
|
|
store.write([
|
|
{"id": "1", "content": "Do thing", "status": "completed"},
|
|
{"id": "2", "content": "Next", "status": "pending"},
|
|
])
|
|
text = store.format_for_injection()
|
|
assert "[x]" in text
|
|
assert "[ ]" in text
|
|
assert "Do thing" in text
|
|
assert "context compression" in text.lower()
|
|
|
|
|
|
class TestMergeMode:
|
|
def test_update_existing_by_id(self):
|
|
store = TodoStore()
|
|
store.write([
|
|
{"id": "1", "content": "Original", "status": "pending"},
|
|
])
|
|
store.write(
|
|
[{"id": "1", "status": "completed"}],
|
|
merge=True,
|
|
)
|
|
items = store.read()
|
|
assert len(items) == 1
|
|
assert items[0]["status"] == "completed"
|
|
assert items[0]["content"] == "Original"
|
|
|
|
def test_merge_appends_new(self):
|
|
store = TodoStore()
|
|
store.write([{"id": "1", "content": "First", "status": "pending"}])
|
|
store.write(
|
|
[{"id": "2", "content": "Second", "status": "pending"}],
|
|
merge=True,
|
|
)
|
|
items = store.read()
|
|
assert len(items) == 2
|
|
|
|
|
|
class TestTodoToolFunction:
|
|
def test_read_mode(self):
|
|
store = TodoStore()
|
|
store.write([{"id": "1", "content": "Task", "status": "pending"}])
|
|
result = json.loads(todo_tool(store=store))
|
|
assert result["summary"]["total"] == 1
|
|
assert result["summary"]["pending"] == 1
|
|
|
|
def test_write_mode(self):
|
|
store = TodoStore()
|
|
result = json.loads(todo_tool(
|
|
todos=[{"id": "1", "content": "New", "status": "in_progress"}],
|
|
store=store,
|
|
))
|
|
assert result["summary"]["in_progress"] == 1
|
|
|
|
def test_no_store_returns_error(self):
|
|
result = json.loads(todo_tool())
|
|
assert "error" in result
|