dlouapre's picture
dlouapre HF Staff
Rename conversation app to reachy_mini_conversation_rmscript standalone app
b461b14
Raw
History Blame Contribute Delete
2.03 kB
"""Tests for the camera tool."""
import base64
from io import BytesIO
from unittest.mock import MagicMock
import numpy as np
import pytest
from PIL import Image
from reachy_mini_conversation_rmscript.tools.camera import Camera
from reachy_mini_conversation_rmscript.tools.core_tools import ToolDependencies
@pytest.mark.asyncio
async def test_camera_tool_preserves_frame_color_for_uploaded_jpeg() -> None:
"""The JPEG uploaded to the model should preserve the intended frame color."""
camera_worker = MagicMock()
camera_worker.get_latest_frame.return_value = np.full((32, 32, 3), [0, 0, 255], dtype=np.uint8)
deps = ToolDependencies(
reachy_mini=MagicMock(),
movement_manager=MagicMock(),
camera_worker=camera_worker,
)
result = await Camera()(deps, question="What color is this?")
assert "b64_im" in result
jpeg_bytes = base64.b64decode(result["b64_im"])
decoded = Image.open(BytesIO(jpeg_bytes)).convert("RGB")
pixel = decoded.getpixel((0, 0))
assert isinstance(pixel, tuple)
red, green, blue = pixel
assert red > 200
assert green < 40
assert blue < 40
@pytest.mark.asyncio
async def test_camera_tool_uses_local_vision_processor_when_available() -> None:
"""The camera tool should use on-demand local vision when configured."""
camera_worker = MagicMock()
camera_worker.get_latest_frame.return_value = np.zeros((32, 32, 3), dtype=np.uint8)
vision_processor = MagicMock()
vision_processor.process_image.return_value = "A red cup on a table."
deps = ToolDependencies(
reachy_mini=MagicMock(),
movement_manager=MagicMock(),
camera_worker=camera_worker,
vision_processor=vision_processor,
)
result = await Camera()(deps, question="What do you see?")
assert result == {"image_description": "A red cup on a table."}
vision_processor.process_image.assert_called_once_with(
camera_worker.get_latest_frame.return_value,
"What do you see?",
)