Automatically remove trailing slashes and version paths (e.g., /v1beta) from GEMINI_BASE_URL Update GeminiAnalyzer to use the normalized URL and add type hints Add test coverage for Gemini client configuration
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from types import ModuleType, SimpleNamespace
|
|
import sys
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT / "src"))
|
|
|
|
fake_dotenv = ModuleType("dotenv")
|
|
fake_dotenv.load_dotenv = lambda *args, **kwargs: None
|
|
sys.modules.setdefault("dotenv", fake_dotenv)
|
|
|
|
from uipath_explainator.config import Settings
|
|
from uipath_explainator.gemini import GeminiAnalyzer
|
|
|
|
|
|
class FakeHttpOptions:
|
|
def __init__(self, **kwargs) -> None:
|
|
self.kwargs = kwargs
|
|
|
|
|
|
class FakeGenerateContentConfig:
|
|
def __init__(self, **kwargs) -> None:
|
|
self.kwargs = kwargs
|
|
|
|
|
|
class FakeClient:
|
|
def __init__(self, api_key: str, http_options: FakeHttpOptions) -> None:
|
|
self.api_key = api_key
|
|
self.http_options = http_options
|
|
self.models = SimpleNamespace()
|
|
|
|
|
|
class GeminiAnalyzerTests(unittest.TestCase):
|
|
def test_init_with_slots_declares_runtime_fields(self) -> None:
|
|
fake_types = SimpleNamespace(
|
|
HttpOptions=FakeHttpOptions,
|
|
GenerateContentConfig=FakeGenerateContentConfig,
|
|
)
|
|
fake_genai = ModuleType("google.genai")
|
|
fake_genai.Client = FakeClient
|
|
fake_genai.types = fake_types
|
|
|
|
fake_google = ModuleType("google")
|
|
fake_google.genai = fake_genai
|
|
|
|
with patch.dict(sys.modules, {"google": fake_google, "google.genai": fake_genai}):
|
|
analyzer = GeminiAnalyzer(Settings(api_key="test-key", base_url=None, model="gemini-test"))
|
|
|
|
self.assertIs(analyzer._types, fake_types)
|
|
self.assertIsInstance(analyzer._client, FakeClient)
|
|
self.assertEqual(analyzer._client.api_key, "test-key")
|
|
self.assertEqual(analyzer._client.http_options.kwargs, {"timeout": 120_000})
|
|
|
|
def test_init_strips_version_suffix_from_custom_base_url(self) -> None:
|
|
fake_types = SimpleNamespace(
|
|
HttpOptions=FakeHttpOptions,
|
|
GenerateContentConfig=FakeGenerateContentConfig,
|
|
)
|
|
fake_genai = ModuleType("google.genai")
|
|
fake_genai.Client = FakeClient
|
|
fake_genai.types = fake_types
|
|
|
|
fake_google = ModuleType("google")
|
|
fake_google.genai = fake_genai
|
|
|
|
with patch.dict(sys.modules, {"google": fake_google, "google.genai": fake_genai}):
|
|
analyzer = GeminiAnalyzer(
|
|
Settings(
|
|
api_key="test-key",
|
|
base_url="https://newapi.tootaio.com/v1beta/",
|
|
model="gemini-test",
|
|
)
|
|
)
|
|
|
|
self.assertEqual(
|
|
analyzer._client.http_options.kwargs,
|
|
{"base_url": "https://newapi.tootaio.com", "timeout": 120_000},
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|