blob: ab0a9111c186c64984dec678da6b35352d848215 [file]
import asyncio
import json
import unittest
from unittest.mock import patch, AsyncMock
from gerrit_mcp_server import main
class TestPostDraftComment(unittest.TestCase):
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_post_draft_comment_success(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps({"id": "draft-abc123"})
result = await main.post_draft_comment(
change_id="456",
file_path="src/main.py",
line_number=10,
message="This needs a fix.",
gerrit_base_url="https://gerrit-review.googlesource.com",
)
self.assertIn("Draft comment created on CL 456", result[0]["text"])
self.assertIn("src/main.py", result[0]["text"])
mock_run_curl.assert_called_once()
args, kwargs = mock_run_curl.call_args
curl_args = args[0]
payload = json.loads(curl_args[curl_args.index("--data") + 1])
self.assertEqual(payload["path"], "src/main.py")
self.assertEqual(payload["line"], 10)
self.assertEqual(payload["message"], "This needs a fix.")
self.assertTrue(payload["unresolved"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_post_draft_comment_with_suggestion(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps({"id": "draft-abc123"})
result = await main.post_draft_comment(
change_id="456",
file_path="src/main.py",
line_number=10,
message="Consider this instead:",
suggestion="new_code_here()",
gerrit_base_url="https://gerrit-review.googlesource.com",
)
self.assertIn("Draft comment created", result[0]["text"])
args, _ = mock_run_curl.call_args
curl_args = args[0]
payload = json.loads(curl_args[curl_args.index("--data") + 1])
self.assertIn("```suggestion", payload["message"])
self.assertIn("new_code_here()", payload["message"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_post_draft_comment_with_range(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps({"id": "draft-abc123"})
result = await main.post_draft_comment(
change_id="456",
file_path="src/main.py",
line_number=10,
message="Multi-line comment",
start_line=8,
start_character=0,
end_line=12,
end_character=5,
gerrit_base_url="https://gerrit-review.googlesource.com",
)
self.assertIn("Draft comment created", result[0]["text"])
args, _ = mock_run_curl.call_args
curl_args = args[0]
payload = json.loads(curl_args[curl_args.index("--data") + 1])
self.assertEqual(payload["range"]["start_line"], 8)
self.assertEqual(payload["range"]["end_line"], 12)
# line should equal end_line when range is provided
self.assertEqual(payload["line"], 12)
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_post_draft_comment_with_in_reply_to(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps({"id": "draft-reply-1"})
result = await main.post_draft_comment(
change_id="456",
file_path="src/main.py",
line_number=10,
message="Good point, fixed.",
in_reply_to="comment-abc123",
gerrit_base_url="https://gerrit-review.googlesource.com",
)
self.assertIn("Draft comment created", result[0]["text"])
args, _ = mock_run_curl.call_args
curl_args = args[0]
payload = json.loads(curl_args[curl_args.index("--data") + 1])
self.assertEqual(payload["in_reply_to"], "comment-abc123")
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_post_draft_comment_no_id_in_response(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps({"error": "something"})
result = await main.post_draft_comment(
change_id="456",
file_path="src/main.py",
line_number=10,
message="test",
gerrit_base_url="https://gerrit-review.googlesource.com",
)
self.assertIn("Failed to create draft comment", result[0]["text"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_post_draft_comment_exception(self, mock_run_curl):
async def run_test():
mock_run_curl.side_effect = Exception("Network error")
with self.assertRaises(Exception):
await main.post_draft_comment(
change_id="456",
file_path="src/main.py",
line_number=10,
message="test",
gerrit_base_url="https://gerrit-review.googlesource.com",
)
asyncio.run(run_test())
if __name__ == "__main__":
unittest.main()