Add guided multi-select ensure-agent, resolve backend binaries via npm prefix when not on PATH, and optionally persist npm bin in shell rc.
100 lines
3.0 KiB
Python
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
|