zcbot/tests/test_look_at_image.py

62 lines
2.3 KiB
Python

"""look_at_image 的问题收敛与兼容兜底测试(不碰网络和数据库)。"""
from __future__ import annotations
import unittest
import uuid
from pathlib import Path
from unittest import mock
from core.ark_client import ArkConfig
from tools.look_at_image import LookAtImageTool, _DEFAULT_QUESTION
class LookAtImageQuestionTests(unittest.TestCase):
def _tool(self) -> LookAtImageTool:
return LookAtImageTool(
ark_cfg=ArkConfig(api_key="test", base_url="https://example.invalid", raw={}),
vision_variant_cfg={
"model_id": "vision-test",
"request_timeout_s": 1,
"timeout_retries": 0,
},
variant_key="test",
working_dir=Path("."),
task_id=uuid.uuid4(),
user_id=uuid.uuid4(),
base_dir=Path("."),
user_root=Path("."),
)
def _execute_and_question(self, question=None) -> str:
captured = {}
def fake_chat(_cfg, _endpoint, body, **_kwargs):
captured["question"] = body["messages"][0]["content"][0]["text"]
return {
"choices": [{"finish_reason": "stop", "message": {"content": "ok"}}],
"usage": {},
}, ""
with mock.patch(
"tools.look_at_image.load_image_as_data_url",
return_value=("data:image/png;base64,AA==", "image.png", ""),
), mock.patch("tools.look_at_image.ark_chat_with_retry", side_effect=fake_chat), \
mock.patch("tools.look_at_image.record_usage_safe", return_value=0):
self._tool().execute("image.png", question=question)
return captured["question"]
def test_specific_question_is_forwarded_unchanged(self):
question = "只读出仪表盘当前数值,不要描述其他内容。"
self.assertEqual(self._execute_and_question(question), question)
def test_missing_question_uses_concise_compatibility_fallback(self):
self.assertEqual(self._execute_and_question(), _DEFAULT_QUESTION)
self.assertIn("简洁", _DEFAULT_QUESTION)
self.assertIn("不要主动全文 OCR", _DEFAULT_QUESTION)
self.assertNotIn("完整描述画面内容", _DEFAULT_QUESTION)
self.assertNotIn("把其中的数据、坐标轴、图例", _DEFAULT_QUESTION)
if __name__ == "__main__":
unittest.main()