"""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.RunnerManager") def test_install(self, mock_manager_class: MagicMock) -> None: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner(env={"GITEA_URL": "https://git.example.com"}) result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--token", "tok"]) assert result.exit_code == 0 mock_manager.install.assert_called_once_with( host="host1", user="ubuntu", key=None, name=None, token="tok", gitea_url="https://git.example.com", mode="docker", ask_become_pass=False, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_install_missing_url(self, mock_manager_class: MagicMock) -> None: with patch.dict("os.environ", {"GITEA_REGISTRATION_TOKEN": "tok"}, clear=True): runner = CliRunner() result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--token", "tok"]) assert result.exit_code != 0 assert "GITEA_URL must be set" in result.output @patch("gitea_runner_manager.cli.RunnerManager") def test_install_missing_token(self, mock_manager_class: MagicMock) -> None: with patch.dict("os.environ", {"GITEA_URL": "https://git.example.com"}, clear=True): runner = CliRunner() result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu"]) assert result.exit_code != 0 assert "GITEA_REGISTRATION_TOKEN must be set" in result.output @patch("gitea_runner_manager.cli.RunnerManager") def test_install_with_options(self, mock_manager_class: MagicMock) -> None: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner(env={"GITEA_URL": "https://git.example.com"}) 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", gitea_url="https://git.example.com", mode="docker", ask_become_pass=False, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_install_ask_become_pass(self, mock_manager_class: MagicMock) -> None: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner(env={"GITEA_URL": "https://git.example.com"}) result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--token", "tok", "--ask-become-pass"]) assert result.exit_code == 0 mock_manager.install.assert_called_once_with( host="host1", user="ubuntu", key=None, name=None, token="tok", gitea_url="https://git.example.com", mode="docker", ask_become_pass=True, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_install_binary_mode(self, mock_manager_class: MagicMock) -> None: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner(env={"GITEA_URL": "https://git.example.com"}) result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--token", "tok", "--mode", "binary"]) assert result.exit_code == 0 mock_manager.install.assert_called_once_with( host="host1", user="ubuntu", key=None, name=None, token="tok", gitea_url="https://git.example.com", mode="binary", ask_become_pass=False, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_install_error(self, mock_manager_class: MagicMock) -> None: 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(env={"GITEA_URL": "https://git.example.com"}) result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--token", "tok"]) assert result.exit_code != 0 assert "fail" in result.output @patch("gitea_runner_manager.cli.RunnerManager") def test_update(self, mock_manager_class: MagicMock) -> None: 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", mode="docker", ask_become_pass=False, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_update_ask_become_pass(self, mock_manager_class: MagicMock) -> None: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["update", "host1", "--user", "ubuntu", "--ask-become-pass"]) assert result.exit_code == 0 mock_manager.update.assert_called_once_with( host="host1", user="ubuntu", key=None, version=None, mode="docker", ask_become_pass=True, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_update_binary_mode(self, mock_manager_class: MagicMock) -> None: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke(cli, ["update", "host1", "--user", "ubuntu", "--mode", "binary"]) assert result.exit_code == 0 mock_manager.update.assert_called_once_with( host="host1", user="ubuntu", key=None, version=None, mode="binary", ask_become_pass=False, ) @patch("gitea_runner_manager.cli.RunnerManager") def test_update_error(self, mock_manager_class: MagicMock) -> None: 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