"""Integration tests for multi-instance support.""" from unittest.mock import MagicMock, patch import pytest from click.testing import CliRunner from gitea_runner_manager.cli import cli @pytest.mark.integration class TestMultiInstanceCLI: """Test that multiple runner instances can be managed independently.""" @patch("gitea_runner_manager.cli.RunnerManager") def test_install_two_instances(self, mock_manager_class: MagicMock) -> None: """Install two named instances on the same host.""" 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 instance A result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--name", "runner-a"]) assert result.exit_code == 0 # Install instance B result = runner.invoke(cli, ["install", "host1", "--user", "ubuntu", "--name", "runner-b"]) assert result.exit_code == 0 assert mock_manager.install.call_count == 2 calls = mock_manager.install.call_args_list assert calls[0].kwargs["name"] == "runner-a" assert calls[1].kwargs["name"] == "runner-b" @patch("gitea_runner_manager.cli.RunnerManager") def test_start_stop_one_instance(self, mock_manager_class: MagicMock) -> None: """Start one instance and stop another independently.""" mock_manager = MagicMock() mock_manager_class.return_value = mock_manager runner = CliRunner() result = runner.invoke( cli, ["start", "runner-a", "--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="runner-a", key=None, ask_become_pass=False, become_password_file=None, verbose=False, ) result = runner.invoke(cli, ["stop", "runner-b", "--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="runner-b", key=None, ask_become_pass=False, become_password_file=None, verbose=False, )