import unittest from unittest.mock import patch, MagicMock from src import ai_client import time def test_gemini_cache_tracking() -> None: # Setup ai_client.reset_session() ai_client.set_provider("gemini", "gemini-2.5-flash-lite") file_items = [ {"path": "src/app.py", "content": "print('hello')", "mtime": 123.0}, {"path": "src/utils.py", "content": "def util(): pass", "mtime": 456.0} ] # Mock credentials with patch("src.ai_client._load_credentials") as mock_creds: mock_creds.return_value = {"gemini": {"api_key": "fake-key"}} # Mock genai.Client with patch("google.genai.Client") as MockClient: mock_client = MagicMock() MockClient.return_value = mock_client # Mock count_tokens to return enough tokens for caching (>= 2048) mock_client.models.count_tokens.return_value = MagicMock(total_tokens=3000) # Mock caches.create mock_cache = MagicMock() mock_cache.name = "cached_contents/abc" mock_client.caches.create.return_value = mock_cache # Mock chat creation and send_message mock_chat = MagicMock() mock_client.chats.create.return_value = mock_chat mock_chat.send_message.return_value = MagicMock( text="Response", candidates=[MagicMock(finish_reason=MagicMock(name="STOP"))], usage_metadata=MagicMock(prompt_token_count=100, candidates_token_count=50, total_token_count=150) ) mock_chat._history = [] # Mock caches.list for stats mock_client.caches.list.return_value = [MagicMock(size_bytes=5000)] # Act ai_client.send( md_content="Some long context that triggers caching", user_message="Hello", file_items=file_items ) # Assert stats = ai_client.get_gemini_cache_stats() assert stats["cached_files"] == ["src/app.py", "src/utils.py"] # Test reset_session ai_client.reset_session() stats = ai_client.get_gemini_cache_stats() assert stats["cached_files"] == [] def test_gemini_cache_tracking_cleanup() -> None: ai_client._gemini_cached_file_paths = ["old.py"] ai_client.cleanup() assert ai_client._gemini_cached_file_paths == [] if __name__ == "__main__": test_gemini_cache_tracking() test_gemini_cache_tracking_cleanup() print("All tests passed!")