test: Add extensive coverage for discussion metrics and compression
- Add tests/test_discussion_compression.py to verify AI sub-agent compression logic across Gemini, Anthropic, DeepSeek, and Gemini CLI providers. - Add tests/test_discussion_metrics.py to verify AppController correctly extracts and accumulates token usage (input/output/cache) and logs token history.
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import pytest
|
||||
from unittest.mock import MagicMock, patch
|
||||
from src import ai_client
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def reset_ai_client():
|
||||
ai_client.reset_session()
|
||||
yield
|
||||
ai_client.reset_session()
|
||||
|
||||
def test_discussion_compression_gemini():
|
||||
ai_client.set_provider("gemini", "gemini-2.5-flash-lite")
|
||||
|
||||
mock_gemini = MagicMock()
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = "This is a compressed summary."
|
||||
mock_gemini.models.generate_content.return_value = mock_response
|
||||
|
||||
with patch("src.ai_client._gemini_client", mock_gemini), \
|
||||
patch("src.ai_client._ensure_gemini_client"):
|
||||
result = ai_client.run_discussion_compression("User: Hello\nAI: Hi there!")
|
||||
|
||||
assert result == "This is a compressed summary."
|
||||
mock_gemini.models.generate_content.assert_called_once()
|
||||
args, kwargs = mock_gemini.models.generate_content.call_args
|
||||
assert "[HISTORY]" in kwargs["contents"]
|
||||
assert "User: Hello" in kwargs["contents"]
|
||||
|
||||
def test_discussion_compression_anthropic():
|
||||
ai_client.set_provider("anthropic", "claude-3-haiku")
|
||||
|
||||
mock_anthropic = MagicMock()
|
||||
mock_response = MagicMock()
|
||||
mock_block = MagicMock()
|
||||
mock_block.text = "Anthropic summary."
|
||||
mock_response.content = [mock_block]
|
||||
mock_anthropic.messages.create.return_value = mock_response
|
||||
|
||||
with patch("src.ai_client._anthropic_client", mock_anthropic), \
|
||||
patch("src.ai_client._ensure_anthropic_client"):
|
||||
result = ai_client.run_discussion_compression("Some history")
|
||||
|
||||
assert result == "Anthropic summary."
|
||||
mock_anthropic.messages.create.assert_called_once()
|
||||
kwargs = mock_anthropic.messages.create.call_args[1]
|
||||
assert "Some history" in kwargs["messages"][0]["content"]
|
||||
|
||||
def test_discussion_compression_deepseek():
|
||||
ai_client.set_provider("deepseek", "deepseek-chat")
|
||||
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {"choices": [{"message": {"content": "DeepSeek summary."}}]}
|
||||
|
||||
with patch("src.ai_client.requests.post", return_value=mock_response), \
|
||||
patch("src.ai_client._load_credentials", return_value={"deepseek": {"api_key": "test"}}):
|
||||
result = ai_client.run_discussion_compression("DeepSeek history")
|
||||
|
||||
assert result == "DeepSeek summary."
|
||||
|
||||
def test_discussion_compression_gemini_cli():
|
||||
ai_client.set_provider("gemini_cli", "gemini-1.5-flash")
|
||||
|
||||
mock_adapter = MagicMock()
|
||||
mock_adapter.send.return_value = {"text": "CLI summary."}
|
||||
|
||||
with patch("src.ai_client.GeminiCliAdapter", return_value=mock_adapter):
|
||||
result = ai_client.run_discussion_compression("CLI history")
|
||||
|
||||
assert result == "CLI summary."
|
||||
Reference in New Issue
Block a user