blob: b52ab49e9d5114de58f2cc6c886462a05e58c774 [file]
import asyncio
import json
import unittest
from unittest.mock import AsyncMock, patch
from gerrit_mcp_server import main
GERRIT_BASE_URL = "https://gerrit.example.com"
CHANGE_PARENT = {
"_number": 1001,
"subject": "parent: some work",
"work_in_progress": False,
}
CHANGE_PARENT_WIP = {
"_number": 1002,
"subject": "parent: draft work",
"work_in_progress": True,
}
class TestGetGitParentChanges(unittest.TestCase):
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_returns_structured_result(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps([CHANGE_PARENT])
result = await main.get_git_parent_changes(
"2000", gerrit_base_url=GERRIT_BASE_URL
)
self.assertEqual(result["change_id"], "2000")
self.assertEqual(len(result["parent_changes"]), 1)
self.assertEqual(result["parent_changes"][0]["change_number"], 1001)
self.assertEqual(
result["parent_changes"][0]["subject"], "parent: some work"
)
self.assertFalse(result["parent_changes"][0]["work_in_progress"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_wip_flag_preserved(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps([CHANGE_PARENT_WIP])
result = await main.get_git_parent_changes(
"2000", gerrit_base_url=GERRIT_BASE_URL
)
self.assertTrue(result["parent_changes"][0]["work_in_progress"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_multiple_parents(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps([CHANGE_PARENT, CHANGE_PARENT_WIP])
result = await main.get_git_parent_changes(
"2000", gerrit_base_url=GERRIT_BASE_URL
)
self.assertEqual(len(result["parent_changes"]), 2)
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_empty_returns_structured_response(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps([])
result = await main.get_git_parent_changes(
"2000", gerrit_base_url=GERRIT_BASE_URL
)
self.assertEqual(result["change_id"], "2000")
self.assertEqual(result["parent_changes"], [])
self.assertIn("note", result)
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_json_decode_error_raises(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = "not valid json"
with self.assertRaises(Exception) as ctx:
await main.get_git_parent_changes(
"2000", gerrit_base_url=GERRIT_BASE_URL
)
self.assertIn("Failed to parse", str(ctx.exception))
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_curl_exception_raises(self, mock_run_curl):
async def run_test():
mock_run_curl.side_effect = Exception("connection refused")
with self.assertRaises(Exception) as ctx:
await main.get_git_parent_changes(
"2000", gerrit_base_url=GERRIT_BASE_URL
)
self.assertIn("connection refused", str(ctx.exception))
asyncio.run(run_test())
if __name__ == "__main__":
unittest.main()