From a6e6963c3302fec8d95cb4763085b0f7c83998c1 Mon Sep 17 00:00:00 2001 From: meeks Date: Thu, 16 Jul 2026 12:40:54 +0200 Subject: [PATCH] Enforce authenticated user verification on startup in main.py --- main.py | 9 +++++++ tests/test_main.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 tests/test_main.py diff --git a/main.py b/main.py index 5d3466d..85d9428 100644 --- a/main.py +++ b/main.py @@ -58,6 +58,15 @@ async def main() -> None: # Initialize Gitea components client: GiteaClient = GiteaClient() + try: + user = client.get_authenticated_user() + if not user or not user.login: + raise RuntimeError("No authenticated user found.") + logger.info(f"Authenticated as user: {user.login}") + except Exception as e: + logger.critical(f"Critical initialization error: No authenticated user found. {e}") + raise SystemExit(1) + tools: GiteaTools = GiteaTools(client) model_name: str = AGENT_MODEL_ID diff --git a/tests/test_main.py b/tests/test_main.py new file mode 100644 index 0000000..b9e144c --- /dev/null +++ b/tests/test_main.py @@ -0,0 +1,58 @@ +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()