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()