# 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 TestQueryChanges(unittest.TestCase):
    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_query_changes_success(self, mock_run_curl):
        async def run_test():
            # Arrange
            query = "status:open"
            limit = 5
            mock_response = [
                {
                    "_number": 123,
                    "subject": "Test Change 1",
                    "updated": "2023-01-03T00:00:00.000000000Z",
                },
                {
                    "_number": 456,
                    "subject": "Test Change 2",
                    "updated": "2023-01-01T00:00:00.000000000Z",
                    "work_in_progress": True,
                },
            ]
            mock_run_curl.return_value = json.dumps(mock_response)
            gerrit_base_url = "https://my-gerrit.com"

            # Act
            result = await main.query_changes(
                query, gerrit_base_url=gerrit_base_url, limit=limit
            )

            # Assert
            self.assertIn('Found 2 changes for query "status:open":', result[0]["text"])
            self.assertIn("- 123: Test Change 1", result[0]["text"])
            self.assertIn("- 456: [WIP] Test Change 2", result[0]["text"])

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_query_changes_no_results(self, mock_run_curl):
        async def run_test():
            # Arrange
            query = "status:merged"
            mock_run_curl.return_value = "[]"
            gerrit_base_url = "https://my-gerrit.com"

            # Act
            result = await main.query_changes(query, gerrit_base_url=gerrit_base_url)

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

        asyncio.run(run_test())


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