"""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