feat(right_arm): /detect/front con proxy fallback per YOLO
This commit is contained in:
1 parent
22e13435b1
commit
3e4e8055db
2 files changed
+137
-1
No files matched your search
@@ -93,3 +93,75 @@ def test_snapshot_front_502_on_failure():
|
||||
factory.return_value = cam
|
||||
r = client.get("/api/right_arm/snapshot/front")
|
||||
assert r.status_code == 502
|
||||
|
||||
|
||||
def _fake_yolo_top(class_name="pestello", conf=0.87):
|
||||
return {"detections": [
|
||||
{"class": class_name, "confidence": conf,
|
||||
"bbox": {"x1": 100.0, "y1": 80.0, "x2": 220.0, "y2": 180.0}},
|
||||
{"class": "altra", "confidence": 0.5,
|
||||
"bbox": {"x1": 10.0, "y1": 10.0, "x2": 50.0, "y2": 50.0}},
|
||||
]}
|
||||
|
||||
|
||||
def test_detect_front_filters_class_and_returns_top():
|
||||
with patch("presa_mano.api.right_arm_routes._deps.yolo") as ying, \
|
||||
patch("presa_mano.api.right_arm_routes._deps.front_camera") as cam_f:
|
||||
yolo = MagicMock()
|
||||
yolo.detect_url.return_value = _fake_yolo_top()
|
||||
ying.return_value = yolo
|
||||
cam = MagicMock()
|
||||
cam.rgb_url.return_value = "http://192.168.123.99:8878/api/rgb"
|
||||
cam.intrinsics.return_value = {"width": 640, "height": 480}
|
||||
cam_f.return_value = cam
|
||||
|
||||
r = client.post("/api/right_arm/detect/front",
|
||||
json={"class_name": "pestello", "conf": 0.4})
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert body["detections"][0]["class"] == "pestello"
|
||||
assert body["image_size"] == [640, 480]
|
||||
|
||||
|
||||
def test_detect_front_404_when_no_match():
|
||||
with patch("presa_mano.api.right_arm_routes._deps.yolo") as ying, \
|
||||
patch("presa_mano.api.right_arm_routes._deps.front_camera") as cam_f:
|
||||
yolo = MagicMock()
|
||||
yolo.detect_url.return_value = {"detections": []}
|
||||
ying.return_value = yolo
|
||||
cam = MagicMock()
|
||||
cam.rgb_url.return_value = "http://x/api/rgb"
|
||||
cam.intrinsics.return_value = {"width": 640, "height": 480}
|
||||
cam_f.return_value = cam
|
||||
r = client.post("/api/right_arm/detect/front",
|
||||
json={"class_name": "pestello"})
|
||||
assert r.status_code == 404
|
||||
|
||||
|
||||
def test_detect_front_falls_back_to_proxy_url_on_yolo_failure():
|
||||
"""Se YOLO non riesce sull'URL diretto, ripeti con `proxy_base_url`."""
|
||||
attempts = []
|
||||
|
||||
def _detect_url(image_url, conf=None):
|
||||
attempts.append(image_url)
|
||||
if "192.168" in image_url:
|
||||
raise RuntimeError("dns timeout")
|
||||
return _fake_yolo_top()
|
||||
|
||||
with patch("presa_mano.api.right_arm_routes._deps.yolo") as ying, \
|
||||
patch("presa_mano.api.right_arm_routes._deps.front_camera") as cam_f:
|
||||
yolo = MagicMock()
|
||||
yolo.detect_url.side_effect = _detect_url
|
||||
ying.return_value = yolo
|
||||
cam = MagicMock()
|
||||
cam.rgb_url.return_value = "http://192.168.123.99:8878/api/rgb"
|
||||
cam.intrinsics.return_value = {"width": 640, "height": 480}
|
||||
cam_f.return_value = cam
|
||||
|
||||
r = client.post("/api/right_arm/detect/front",
|
||||
json={"class_name": "pestello",
|
||||
"proxy_base_url": "http://localhost:8890"})
|
||||
assert r.status_code == 200
|
||||
assert len(attempts) == 2
|
||||
assert "192.168" in attempts[0]
|
||||
assert attempts[1].endswith("/api/right_arm/snapshot/front")
|
||||
Reference in new issue
Block a user