# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

from gerrit_mcp_server import main


class TestGetMostRecentCl(unittest.TestCase):
    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_get_most_recent_cl_success(self, mock_run_curl):
        async def run_test():
            # Arrange
            user = "user@example.com"
            mock_response = [
                {
                    "_number": 999,
                    "subject": "Latest CL",
                    "updated": "2023-01-03T00:00:00.000000000Z",
                },
                {
                    "_number": 888,
                    "subject": "Older CL",
                    "updated": "2023-01-01T00:00:00.000000000Z",
                },
            ]
            mock_run_curl.return_value = json.dumps(mock_response)
            gerrit_base_url = "https://my-gerrit.com"

            # Act
            result = await main.get_most_recent_cl(
                user, gerrit_base_url=gerrit_base_url
            )

            # Assert
            self.assertIn(f"Most recent CL for {user}:", result[0]["text"])
            self.assertIn("- 999: Latest CL", result[0]["text"])
            self.assertNotIn("Older CL", result[0]["text"])

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_get_most_recent_cl_no_results(self, mock_run_curl):
        async def run_test():
            # Arrange
            user = "nouser@example.com"
            mock_run_curl.return_value = "[]"
            gerrit_base_url = "https://my-gerrit.com"

            # Act
            result = await main.get_most_recent_cl(
                user, gerrit_base_url=gerrit_base_url
            )

            # Assert
            self.assertEqual(
                result, [{"type": "text", "text": f"No changes found for user: {user}"}]
            )

        asyncio.run(run_test())


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