"""Unit tests for cli module.""" from unittest.mock import MagicMock, patch from click.testing import CliRunner from gitea_runner_manager.cli import cli class TestCLI: def test_cli_version(self) -> None: runner = CliRunner() result = runner.invoke(cli, ["--version"]) assert result.exit_code == 0 assert "0.1.0" in result.output @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_list_runners(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() mock_manager.list_runners.return_value = [ {"id": 1, "name": "runner1", "status": "online"}, ] mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["list"]) assert result.exit_code == 0 assert "runner1" in result.output assert "online" in result.output @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_list_empty(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() mock_manager.list_runners.return_value = [] mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["list"]) assert result.exit_code == 0 assert "No runners found" in result.output @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_token(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() mock_manager.generate_token.return_value = "tok123" mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["token"]) assert result.exit_code == 0 assert "tok123" in result.output @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_token_error(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() from gitea_runner_manager.exceptions import GiteaAPIError mock_manager.generate_token.side_effect = GiteaAPIError("boom") mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["token"]) assert result.exit_code != 0 assert "boom" in result.output @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_install(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu"]) assert result.exit_code == 0 mock_manager.install.assert_called_once_with(host="host1", user="ubuntu", key=None, name=None, token=None) @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_install_with_options(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke( cli, [ "install", "host1", "--user", "ubuntu", "--key", "/key", "--name", "r1", "--token", "tok", ], ) assert result.exit_code == 0 mock_manager.install.assert_called_once_with( host="host1", user="ubuntu", key="/key", name="r1", token="tok", ) @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_install_error(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() from gitea_runner_manager.exceptions import AnsibleError mock_manager.install.side_effect = AnsibleError("fail") mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu"]) assert result.exit_code != 0 assert "fail" in result.output @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_update(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke( cli, [ "update", "host1", "--user", "ubuntu", "--key", "/key", "--version", "v0.2.0", ], ) assert result.exit_code == 0 mock_manager.update.assert_called_once_with( host="host1", user="ubuntu", key="/key", version="v0.2.0", ) @patch("gitea_runner_manager.cli.GiteaAPIClient") @patch("gitea_runner_manager.cli.RunnerManager") def test_update_error(self, mock_manager_class: MagicMock, mock_client_class: MagicMock) -> None: mock_client = MagicMock() mock_client_class.from_env.return_value = mock_client mock_manager = MagicMock() from gitea_runner_manager.exceptions import AnsibleError mock_manager.update.side_effect = AnsibleError("fail") mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["update", "host1", "--user", "ubuntu"]) assert result.exit_code != 0 assert "fail" in result.output