Files
takopi/tests/test_tool_actions.py

79 lines
2.5 KiB
Python

from __future__ import annotations
import pytest
from takopi.runners import tool_actions
from takopi.utils.paths import reset_run_base_dir, set_run_base_dir
def test_tool_input_path_picks_first_match() -> None:
tool_input = {"path": "src/main.py", "file": "ignored.txt"}
assert (
tool_actions.tool_input_path(tool_input, path_keys=("file", "path"))
== "ignored.txt"
)
assert (
tool_actions.tool_input_path(tool_input, path_keys=("path", "file"))
== "src/main.py"
)
assert tool_actions.tool_input_path(tool_input, path_keys=("missing",)) is None
@pytest.mark.parametrize(
("tool_name", "tool_input", "expected_kind", "expected_title"),
[
("bash", {"command": "echo hi"}, "command", "echo hi"),
("shell", {"command": "pwd"}, "command", "pwd"),
("edit", {"path": "src/app.py"}, "file_change", "src/app.py"),
("write", {"path": "notes.txt"}, "file_change", "notes.txt"),
("read", {"path": "README.md"}, "tool", "read: `README.md`"),
("glob", {"pattern": "*.py"}, "tool", "glob: `*.py`"),
("grep", {"pattern": "TODO"}, "tool", "grep: TODO"),
("find", {"pattern": "*.toml"}, "tool", "find: *.toml"),
("ls", {"path": "src"}, "tool", "ls: `src`"),
("websearch", {"query": "takopi"}, "web_search", "takopi"),
(
"webfetch",
{"url": "https://example.com"},
"web_search",
"https://example.com",
),
("todowrite", {}, "note", "update todos"),
("todoread", {}, "note", "read todos"),
("askuserquestion", {}, "note", "ask user"),
("task", {"description": "do work"}, "subagent", "do work"),
("agent", {"prompt": "assist"}, "subagent", "assist"),
("unknown", {}, "tool", "unknown"),
],
)
def test_tool_kind_and_title_cases(
tool_name: str,
tool_input: dict[str, object],
expected_kind: str,
expected_title: str,
) -> None:
token = set_run_base_dir(None)
try:
kind, title = tool_actions.tool_kind_and_title(
tool_name,
tool_input,
path_keys=("path", "file"),
)
finally:
reset_run_base_dir(token)
assert kind == expected_kind
assert title == expected_title
def test_tool_kind_and_title_task_kind_override() -> None:
kind, title = tool_actions.tool_kind_and_title(
"agent",
{"description": "spawn worker"},
path_keys=(),
task_kind="warning",
)
assert kind == "warning"
assert title == "spawn worker"