"""Integration tests for Gitea Runner lifecycle commands.""" from unittest.mock import MagicMock, patch import pytest from click.testing import CliRunner from grm.cli import cli @pytest.mark.integration class TestLifecycleCLI: """Test the full lifecycle CLI commands end-to-end.""" @patch("grm.cli.RunnerManager") def test_install_start_status_stop_disable_remove(self, mock_manager_class: MagicMock) -> None: """Exercise the full lifecycle via CLI.""" mock_manager = MagicMock() mock_manager_class.return_value = mock_manager env = {"GITEA_URL": "https://git.example.com", "GITEA_REGISTRATION_TOKEN": "tok"} runner = CliRunner(env=env) # Install result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--name", "r1"]) assert result.exit_code == 0 mock_manager.install.assert_called_once() # Start result = runner.invoke(cli, ["start", "r1", "--host", "host1", "--user", "ubuntu", "--no-ask-become-pass"]) assert result.exit_code == 0 mock_manager.start.assert_called_once_with( host="host1", user="ubuntu", name="r1", key=None, ask_become_pass=False, become_password_file=None, verbose=False, ) # Status result = runner.invoke(cli, ["status", "r1", "--host", "host1", "--user", "ubuntu", "--no-ask-become-pass"]) assert result.exit_code == 0 mock_manager.status.assert_called_once_with( host="host1", user="ubuntu", name="r1", key=None, ask_become_pass=False, become_password_file=None, verbose=False, ) # Stop result = runner.invoke(cli, ["stop", "r1", "--host", "host1", "--user", "ubuntu", "--no-ask-become-pass"]) assert result.exit_code == 0 mock_manager.stop.assert_called_once_with( host="host1", user="ubuntu", name="r1", key=None, ask_become_pass=False, become_password_file=None, verbose=False, ) # Disable result = runner.invoke( cli, ["disable", "r1", "--host", "host1", "--user", "ubuntu", "--token", "tok", "--no-ask-become-pass"], ) assert result.exit_code == 0 mock_manager.disable.assert_called_once_with( host="host1", user="ubuntu", name="r1", key=None, token="tok", gitea_url="https://git.example.com", ask_become_pass=False, become_password_file=None, verbose=False, ) # Remove result = runner.invoke( cli, ["remove", "r1", "--host", "host1", "--user", "ubuntu", "--token", "tok", "--no-ask-become-pass"], ) assert result.exit_code == 0 mock_manager.remove.assert_called_once_with( host="host1", user="ubuntu", name="r1", key=None, token="tok", gitea_url="https://git.example.com", ask_become_pass=False, force=False, become_password_file=None, verbose=False, )