#!/usr/bin/env python3
"""
Test to verify the new Google GenAI router methods
"""
import asyncio
import os
import sys
from unittest.mock import AsyncMock, patch

import pytest

sys.path.insert(
    0, os.path.abspath("../../..")
)  # Adds the parent directory to the system path

import litellm
from litellm.types.utils import ModelResponse


@pytest.mark.asyncio
async def test_router_agenerate_content_method():
    """Test that the new agenerate_content method in Router works correctly"""
    # Create a router instance
    router = litellm.Router(
        model_list=[
            {
                "model_name": "test-model",
                "litellm_params": {
                    "model": "gpt-3.5-turbo",
                },
            }
        ]
    )

    # Create a mock response in Google GenAI format
    mock_response = {
        "candidates": [{"content": {"parts": [{"text": "Hello, world!"}]}}]
    }

    # Mock the router's underlying agenerate_content method to return a mock response
    with patch.object(
        router, "agenerate_content", new=AsyncMock(return_value=mock_response)
    ) as mock_agenerate_content:
        # Call the agenerate_content method
        response = await router.agenerate_content(
            model="test-model",
            contents=[{"role": "user", "parts": [{"text": "Hello"}]}],
        )

        # Verify that router.agenerate_content was called with correct parameters
        mock_agenerate_content.assert_called_once()
        call_args = mock_agenerate_content.call_args
        assert call_args[1]["model"] == "test-model"
        assert call_args[1]["contents"] == [
            {"role": "user", "parts": [{"text": "Hello"}]}
        ]

        # Verify that the response is the mock response we created
        assert response == mock_response


@pytest.mark.asyncio
async def test_router_aadapter_generate_content_method():
    """Test that the new aadapter_generate_content method in Router works correctly"""
    # Create a router instance
    router = litellm.Router(
        model_list=[
            {
                "model_name": "test-model",
                "litellm_params": {
                    "model": "gpt-3.5-turbo",
                },
            }
        ]
    )

    # Create a mock response in Google GenAI format
    mock_response = {
        "candidates": [{"content": {"parts": [{"text": "Hello, world!"}]}}]
    }

    # Mock the router's underlying aadapter_generate_content method to return a mock response
    with patch.object(
        router, "aadapter_generate_content", new=AsyncMock(return_value=mock_response)
    ) as mock_aadapter_generate_content:
        # Call the aadapter_generate_content method
        response = await router.aadapter_generate_content(
            model="test-model",
            contents=[{"role": "user", "parts": [{"text": "Hello"}]}],
        )

        # Verify that router.aadapter_generate_content was called with correct parameters
        mock_aadapter_generate_content.assert_called_once()
        call_args = mock_aadapter_generate_content.call_args
        assert call_args[1]["model"] == "test-model"
        assert call_args[1]["contents"] == [
            {"role": "user", "parts": [{"text": "Hello"}]}
        ]

        # Verify that the response is the mock response we created
        assert response == mock_response
