blob: 2eb263f6a1107ca1634855c77261cf996e033f6a [file]
import asyncio
import json
import unittest
from unittest.mock import patch, AsyncMock, call
from gerrit_mcp_server import main
BASE_URL = "https://gerrit-review.googlesource.com"
class TestDeleteDraftComments(unittest.TestCase):
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_delete_all_drafts_success(self, mock_run_curl):
async def run_test():
drafts_response = {
"src/main.py": [
{"id": "draft-001"},
{"id": "draft-002"},
],
"README.md": [
{"id": "draft-003"},
],
}
# First call returns the list, subsequent calls are deletes
mock_run_curl.side_effect = [
json.dumps(drafts_response),
"", # delete draft-001
"", # delete draft-002
"", # delete draft-003
]
result = await main.delete_draft_comments(
change_id="123", gerrit_base_url=BASE_URL
)
self.assertIn("Deleted 3 draft comment(s)", result[0]["text"])
self.assertEqual(mock_run_curl.call_count, 4) # 1 list + 3 deletes
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_delete_all_drafts_empty(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = json.dumps({})
result = await main.delete_draft_comments(
change_id="123", gerrit_base_url=BASE_URL
)
self.assertIn("No draft comments to delete", result[0]["text"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_delete_all_drafts_parse_error(self, mock_run_curl):
async def run_test():
mock_run_curl.return_value = "not json"
result = await main.delete_draft_comments(
change_id="123", gerrit_base_url=BASE_URL
)
self.assertIn("Failed to parse drafts response", result[0]["text"])
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_delete_all_drafts_partial_failure(self, mock_run_curl):
async def run_test():
drafts_response = {
"file.py": [
{"id": "draft-001"},
{"id": "draft-002"},
],
}
mock_run_curl.side_effect = [
json.dumps(drafts_response),
"", # draft-001 succeeds
Exception("Server error"), # draft-002 fails
]
result = await main.delete_draft_comments(
change_id="123", gerrit_base_url=BASE_URL
)
text = result[0]["text"]
self.assertIn("Deleted 1 draft comment(s)", text)
self.assertIn("1 error(s)", text)
self.assertIn("draft-002", text)
asyncio.run(run_test())
@patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
def test_delete_all_drafts_skips_missing_ids(self, mock_run_curl):
async def run_test():
drafts_response = {
"file.py": [
{"id": "draft-001"},
{"message": "no id field"}, # missing id
],
}
mock_run_curl.side_effect = [
json.dumps(drafts_response),
"", # delete draft-001
]
result = await main.delete_draft_comments(
change_id="123", gerrit_base_url=BASE_URL
)
self.assertIn("Deleted 1 draft comment(s)", result[0]["text"])
# 1 list + 1 delete (skipped the one without id)
self.assertEqual(mock_run_curl.call_count, 2)
asyncio.run(run_test())
if __name__ == "__main__":
unittest.main()