import asyncio
import unittest
from unittest.mock import AsyncMock, patch

from gerrit_mcp_server import main

BASE_URL = "https://gerrit-review.googlesource.com"


class TestDeleteDraftComment(unittest.TestCase):
    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_delete_single_draft_success(self, mock_run_curl):
        async def run_test():
            mock_run_curl.return_value = ""

            result = await main.delete_draft_comment(
                change_id="123",
                draft_id="draft-abc",
                gerrit_base_url=BASE_URL,
            )

            self.assertIn(
                "Deleted draft comment draft-abc on CL 123", result[0]["text"]
            )
            mock_run_curl.assert_called_once()
            args, _ = mock_run_curl.call_args
            curl_args = args[0]
            self.assertIn("-X", curl_args)
            self.assertIn("DELETE", curl_args)
            self.assertIn(
                f"{BASE_URL}/changes/123/revisions/current/drafts/draft-abc",
                curl_args,
            )

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_delete_single_draft_exception(self, mock_run_curl):
        async def run_test():
            mock_run_curl.side_effect = Exception("Not found")

            with self.assertRaises(Exception):
                await main.delete_draft_comment(
                    change_id="123",
                    draft_id="draft-abc",
                    gerrit_base_url=BASE_URL,
                )

        asyncio.run(run_test())


if __name__ == "__main__":
    unittest.main()
