59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from unittest.mock import MagicMock, AsyncMock, patch
|
|
import pytest
|
|
from main import main
|
|
|
|
pytestmark = pytest.mark.anyio
|
|
|
|
|
|
@patch("main.load_dotenv")
|
|
@patch("main.os.chdir")
|
|
@patch("main.GiteaClient")
|
|
@patch("main.GiteaTools")
|
|
@patch("main.AgentOrchestrator")
|
|
async def test_main_startup_success(
|
|
mock_orchestrator_class: MagicMock,
|
|
mock_tools_class: MagicMock,
|
|
mock_client_class: MagicMock,
|
|
mock_chdir: MagicMock,
|
|
mock_load_dotenv: MagicMock
|
|
) -> None:
|
|
mock_client = MagicMock()
|
|
mock_client_class.return_value = mock_client
|
|
mock_user = MagicMock()
|
|
mock_user.login = "agent-test"
|
|
mock_client.get_authenticated_user.return_value = mock_user
|
|
|
|
mock_orchestrator = MagicMock()
|
|
mock_orchestrator.poll_and_dispatch = AsyncMock(side_effect=KeyboardInterrupt())
|
|
mock_orchestrator_class.return_value = mock_orchestrator
|
|
|
|
# Run main; it should exit gracefully on KeyboardInterrupt
|
|
await main()
|
|
|
|
mock_client.get_authenticated_user.assert_called_once()
|
|
mock_orchestrator.poll_and_dispatch.assert_called_once()
|
|
|
|
|
|
@patch("main.load_dotenv")
|
|
@patch("main.os.chdir")
|
|
@patch("main.GiteaClient")
|
|
@patch("main.GiteaTools")
|
|
@patch("main.AgentOrchestrator")
|
|
async def test_main_startup_fails_no_authenticated_user(
|
|
mock_orchestrator_class: MagicMock,
|
|
mock_tools_class: MagicMock,
|
|
mock_client_class: MagicMock,
|
|
mock_chdir: MagicMock,
|
|
mock_load_dotenv: MagicMock
|
|
) -> None:
|
|
mock_client = MagicMock()
|
|
mock_client_class.return_value = mock_client
|
|
# Simulate no user returned
|
|
mock_client.get_authenticated_user.return_value = None
|
|
|
|
with pytest.raises(SystemExit) as exc_info:
|
|
await main()
|
|
|
|
assert exc_info.value.code == 1
|
|
mock_orchestrator_class.assert_not_called()
|