AIstudioProxyAPI / tests /api_utils /test_response_payloads.py
peijun1's picture
Deploy AI Studio Proxy API to Hugging Face Spaces
a5784e9
Raw
History Blame Contribute Delete
11.5 kB
"""
High-quality tests for api_utils/response_payloads.py - Response construction.
Focus: Test build_chat_completion_response_json with all parameter combinations.
Strategy: Test required fields, optional parameters (seed, response_format), structure validation.
"""
from unittest.mock import patch
from api_utils.response_payloads import build_chat_completion_response_json
from config import CHAT_COMPLETION_ID_PREFIX
def test_build_chat_completion_response_json_basic():
"""
Test scenario: Construct basic response (no optional parameters)
Expected: Return complete chat.completion response, without seed and response_format (lines 18-34)
"""
message_payload = {"role": "assistant", "content": "Hello, how can I help?"}
usage_stats = {"prompt_tokens": 10, "completion_tokens": 7, "total_tokens": 17}
with patch("time.time", return_value=1234567890.5):
response = build_chat_completion_response_json(
req_id="test-req-123",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
)
# Verify: Basic structure (lines 19-34)
assert response["object"] == "chat.completion"
assert response["created"] == 1234567890
assert response["model"] == "gemini-1.5-pro"
assert response["system_fingerprint"] == "camoufox-proxy"
# Verify: ID format (line 20)
assert response["id"] == f"{CHAT_COMPLETION_ID_PREFIX}test-req-123-1234567890"
assert response["id"].startswith(CHAT_COMPLETION_ID_PREFIX)
# Verify: choices array (lines 24-31)
assert len(response["choices"]) == 1
choice = response["choices"][0]
assert choice["index"] == 0
assert choice["message"] == message_payload
assert choice["finish_reason"] == "stop"
assert choice["native_finish_reason"] == "stop"
# Verify: usage (line 32)
assert response["usage"] == usage_stats
# Verify: Does not include optional fields
assert "seed" not in response
assert "response_format" not in response
def test_build_chat_completion_response_json_with_seed():
"""
Test scenario: Include seed parameter
Expected: Response contains seed field (lines 35-36)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
response = build_chat_completion_response_json(
req_id="req-456",
model_name="gemini-2.0-flash",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
seed=42,
)
# Verify: seed field exists (line 36)
assert "seed" in response
assert response["seed"] == 42
def test_build_chat_completion_response_json_with_response_format():
"""
Test scenario: Include response_format parameter
Expected: Response contains response_format field (lines 37-38)
"""
message_payload = {"role": "assistant", "content": '{"result": "json"}'}
usage_stats = {"prompt_tokens": 8, "completion_tokens": 5, "total_tokens": 13}
response_format = {"type": "json_object"}
response = build_chat_completion_response_json(
req_id="req-789",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
response_format=response_format,
)
# Verify: response_format field exists (line 38)
assert "response_format" in response
assert response["response_format"] == {"type": "json_object"}
def test_build_chat_completion_response_json_with_both_optional_params():
"""
Test scenario: Include both seed and response_format
Expected: Both optional fields exist (lines 35-38)
"""
message_payload = {"role": "assistant", "content": "Full response"}
usage_stats = {"prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20}
response_format = {"type": "text"}
response = build_chat_completion_response_json(
req_id="req-full",
model_name="gemini-2.0-flash-thinking-exp",
message_payload=message_payload,
finish_reason="length",
usage_stats=usage_stats,
seed=999,
response_format=response_format,
)
# Verify: Both optional fields exist
assert "seed" in response
assert response["seed"] == 999
assert "response_format" in response
assert response["response_format"] == {"type": "text"}
def test_build_chat_completion_response_json_seed_none_not_included():
"""
Test scenario: seed=None (explicitly passed)
Expected: seed field not included in response (condition at line 35 is False)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
response = build_chat_completion_response_json(
req_id="req-none",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
seed=None,
)
# Verify: seed not included
assert "seed" not in response
def test_build_chat_completion_response_json_response_format_none_not_included():
"""
Test scenario: response_format=None (explicitly passed)
Expected: response_format field not included in response (condition at line 37 is False)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
response = build_chat_completion_response_json(
req_id="req-none2",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
response_format=None,
)
# Verify: response_format not included
assert "response_format" not in response
def test_build_chat_completion_response_json_custom_system_fingerprint():
"""
Test scenario: Custom system_fingerprint
Expected: Use provided value instead of default (line 33)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
response = build_chat_completion_response_json(
req_id="req-custom",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
system_fingerprint="custom-fingerprint-123",
)
# Verify: Custom system_fingerprint
assert response["system_fingerprint"] == "custom-fingerprint-123"
def test_build_chat_completion_response_json_different_finish_reasons():
"""
Test scenario: Different finish_reason values
Expected: Both finish_reason and native_finish_reason set correctly (lines 28-29)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
# Test "length" finish reason
response1 = build_chat_completion_response_json(
req_id="req-length",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="length",
usage_stats=usage_stats,
)
assert response1["choices"][0]["finish_reason"] == "length"
assert response1["choices"][0]["native_finish_reason"] == "length"
# Test "tool_calls" finish reason
response2 = build_chat_completion_response_json(
req_id="req-tools",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="tool_calls",
usage_stats=usage_stats,
)
assert response2["choices"][0]["finish_reason"] == "tool_calls"
assert response2["choices"][0]["native_finish_reason"] == "tool_calls"
def test_build_chat_completion_response_json_timestamp_format():
"""
Test scenario: Verify timestamp format
Expected: created field is an integer timestamp (line 18, 22)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
# Mock time.time() to return a fractional timestamp
with patch("time.time", return_value=1234567890.789):
response = build_chat_completion_response_json(
req_id="req-ts",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
)
# Verify: created is an integer (line 18 using int())
assert isinstance(response["created"], int)
assert response["created"] == 1234567890
def test_build_chat_completion_response_json_id_includes_timestamp():
"""
Test scenario: Verify ID contains timestamp
Expected: ID format is prefix-req_id-timestamp (line 20)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8}
with patch("time.time", return_value=9999999999.0):
response = build_chat_completion_response_json(
req_id="unique-req",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
)
# Verify: ID contains timestamp
assert response["id"] == f"{CHAT_COMPLETION_ID_PREFIX}unique-req-9999999999"
assert "9999999999" in response["id"]
def test_build_chat_completion_response_json_message_payload_structure():
"""
Test scenario: Verify message_payload passed as is
Expected: message field is exactly equal to message_payload (line 27)
"""
# Complex message with tool_calls
message_payload = {
"role": "assistant",
"content": "I'll help with that.",
"tool_calls": [
{
"id": "call_123",
"type": "function",
"function": {"name": "search", "arguments": '{"query": "test"}'},
}
],
}
usage_stats = {"prompt_tokens": 15, "completion_tokens": 10, "total_tokens": 25}
response = build_chat_completion_response_json(
req_id="req-complex",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="tool_calls",
usage_stats=usage_stats,
)
# Verify: message_payload passed as is
assert response["choices"][0]["message"] == message_payload
assert response["choices"][0]["message"]["tool_calls"][0]["id"] == "call_123"
def test_build_chat_completion_response_json_usage_stats_structure():
"""
Test scenario: Verify usage_stats passed as is
Expected: usage field is exactly equal to usage_stats (line 32)
"""
message_payload = {"role": "assistant", "content": "Test"}
usage_stats = {
"prompt_tokens": 100,
"completion_tokens": 50,
"total_tokens": 150,
"prompt_tokens_details": {"cached_tokens": 20},
}
response = build_chat_completion_response_json(
req_id="req-usage",
model_name="gemini-1.5-pro",
message_payload=message_payload,
finish_reason="stop",
usage_stats=usage_stats,
)
# Verify: usage_stats passed as is, including extra fields
assert response["usage"] == usage_stats
assert response["usage"]["prompt_tokens_details"]["cached_tokens"] == 20