Files
myagents/tests/test_ensure_agent_cmd.py
Zhengshou Lai 3f79301eb3 feat: ensure-agent + resolve npm-global CLIs without PATH
Add guided multi-select ensure-agent, resolve backend binaries via npm
prefix when not on PATH, and optionally persist npm bin in shell rc.
2026-08-09 16:53:06 +08:00

100 lines
3.0 KiB
Python

"""Tests for ``myagents ensure-agent`` multi-select."""
from __future__ import annotations
from unittest.mock import patch
from click.testing import CliRunner
from myagents.commands.ensure_agent import ensure_agent_cmd, run_ensure_agents
def test_ensure_agent_all_present() -> None:
with patch(
"myagents.commands.ensure_agent.backend_available", return_value=True
):
result = CliRunner().invoke(ensure_agent_cmd, [])
assert result.exit_code == 0, result.output
assert "ready" in result.output.lower()
def test_run_ensure_agents_noninteractive_installs_missing() -> None:
def available(name: str) -> bool:
return name != "claude"
with (
patch(
"myagents.commands.ensure_agent.backend_available",
side_effect=available,
),
patch(
"myagents.commands.ensure_agent._is_interactive", return_value=False
),
patch(
"myagents.commands.ensure_agent.ensure_backend", return_value=True
) as ensure,
):
still = run_ensure_agents()
assert still == []
assert any(c.args[0] == "claude" for c in ensure.call_args_list)
# Selected path uses yes=True (no second prompt).
assert ensure.call_args.kwargs.get("yes") is True
def test_run_ensure_agents_interactive_select() -> None:
def available(name: str) -> bool:
return name not in ("claude", "codex")
with (
patch(
"myagents.commands.ensure_agent.backend_available",
side_effect=available,
),
patch(
"myagents.commands.ensure_agent._is_interactive", return_value=True
),
patch(
"myagents.commands.ensure_agent.Prompt.ask", return_value="1"
),
patch(
"myagents.commands.ensure_agent.ensure_backend", return_value=True
) as ensure,
):
still = run_ensure_agents()
# Only first missing (claude) selected.
assert ensure.call_count == 1
assert ensure.call_args.args[0] == "claude"
assert "codex" in still
def test_run_ensure_agents_prefer_on_enter() -> None:
def available(name: str) -> bool:
return name not in ("claude", "codex")
with (
patch(
"myagents.commands.ensure_agent.backend_available",
side_effect=available,
),
patch(
"myagents.commands.ensure_agent._is_interactive", return_value=True
),
patch(
"myagents.commands.ensure_agent.Prompt.ask", return_value=""
),
patch(
"myagents.commands.ensure_agent.ensure_backend", return_value=True
) as ensure,
):
still = run_ensure_agents(prefer=["codex"])
assert ensure.call_count == 1
assert ensure.call_args.args[0] == "codex"
assert "claude" in still
def test_ensure_agent_help() -> None:
result = CliRunner().invoke(ensure_agent_cmd, ["--help"])
assert result.exit_code == 0
assert "multi-select" in result.output.lower() or "ensure-agent" in result.output
assert "--yes" not in result.output