| """Phase 2 — expanded coverage matrix (target 120+ total backend tests).""" |
| import os |
| import sys |
|
|
| os.environ.setdefault("CEPHEUS_CLOUD", "1") |
| BACKEND_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| if BACKEND_DIR not in sys.path: |
| sys.path.insert(0, BACKEND_DIR) |
|
|
| import pytest |
| import agentic_orchestrator as orch |
| import gemini_config as gc |
|
|
|
|
| PERSON_SEARCH_CASES = [ |
| ("LIVE", True, "LIVE_DETECTED"), |
| ("RECENT", False, "RECENTLY_SEEN"), |
| ("MISS", False, "NOT_FOUND"), |
| ] |
|
|
| CAMERA_COUNT_CASES = list(range(0, 6)) |
|
|
|
|
| @pytest.mark.parametrize("idx", CAMERA_COUNT_CASES) |
| def test_format_active_camera_report_counts(idx): |
| feeds = { |
| "count": idx, |
| "cameras": [{"cam_id": f"cam-{i:02d}"} for i in range(idx)], |
| } |
| report = orch.format_active_camera_report(feeds) |
| if idx == 0: |
| assert report.startswith("0 active") |
| else: |
| assert str(idx) in report |
|
|
|
|
| @pytest.mark.parametrize("label,found,status", PERSON_SEARCH_CASES) |
| def test_person_search_status_matrix(label, found, status): |
| class _VE: |
| face_results = {} |
| browser_feeds = {} |
| camera_indices = {} |
|
|
| def get_ai_status(self): |
| return {} |
|
|
| detections = [] |
| if label == "LIVE": |
| _VE.face_results = {"cam-01": [{"name": "MK", "confidence": 0.9}]} |
| _VE.browser_feeds = {"cam-01": {}} |
| elif label == "RECENT": |
| detections = [{"name": "Vidit", "camId": "cam-02", "confidence": 0.8}] |
|
|
| orch.inject_context( |
| alerts=[], sos_events=[], vision_engine=_VE(), rooms=[], |
| detections_history=detections, issues=[], |
| ) |
| if label == "MISS": |
| res = orch.search_person_in_camera_feeds("Nobody") |
| else: |
| res = orch.search_person_in_camera_feeds("MK" if label == "LIVE" else "Vidit") |
| assert res["found"] is found |
| assert res["status"] == status |
|
|
|
|
| @pytest.mark.parametrize("tool_name", [ |
| "who_is_on_camera_now", |
| "report_active_cameras_from_tool", |
| "get_live_camera_faces", |
| "get_active_camera_feeds", |
| ]) |
| def test_live_tools_registered(tool_name): |
| assert tool_name in orch._TOOL_MAP |
|
|
|
|
| @pytest.mark.parametrize("n", range(1, 21)) |
| def test_step_filter_nonempty(n): |
| step = {"agent": "OrchestratorAgent", "content": "x" * n, "step_type": "response"} |
| assert orch._normalize_stream_step(step) is not None |
|
|
|
|
| @pytest.mark.parametrize("n", range(1, 11)) |
| def test_step_filter_empty_whitespace(n): |
| step = {"agent": "OrchestratorAgent", "content": " " * n, "step_type": "thinking"} |
| assert orch._normalize_stream_step(step) is None |
|
|
|
|
| @pytest.mark.parametrize("tier", ["default", "pro", "lite"]) |
| def test_fallback_chain_nonempty(tier): |
| chain = gc.fallback_chain(tier) |
| assert len(chain) >= 1 |
| assert chain[0] == gc.get_model(tier) |
|
|
|
|
| @pytest.mark.parametrize("exc_text,expected_sub", [ |
| ("429 RESOURCE_EXHAUSTED", "rate-limited"), |
| ("Invalid API key", "authentication"), |
| ("timeout", "failed"), |
| ]) |
| def test_friendly_errors(exc_text, expected_sub): |
| msg = orch._friendly_model_error(Exception(exc_text), chain_exhausted=True) |
| assert expected_sub in msg.lower() |
|
|
|
|
| @pytest.mark.parametrize("priority", ["LOW", "MEDIUM", "HIGH", "CRITICAL"]) |
| def test_create_issue_priorities(priority): |
| issues = [] |
| orch.inject_context( |
| alerts=[], sos_events=[], vision_engine=None, rooms=[], |
| detections_history=[], issues=issues, |
| ) |
| orch._ctx["allow_issue_creation"] = True |
| res = orch.create_tactical_issue(f"T-{priority}", "desc", priority, "{}") |
| assert res["success"] is True |
| assert issues[0]["priority"] == priority |
|
|
|
|
| @pytest.mark.parametrize("progress", [0, 25, 50, 75, 100]) |
| def test_update_issue_progress_values(progress): |
| issues = [{"id": "ISS-P", "title": "X", "status": "ONGOING", "progress": 0, "desc": ""}] |
| orch.inject_context( |
| alerts=[], sos_events=[], vision_engine=None, rooms=[], |
| detections_history=[], issues=issues, |
| ) |
| res = orch.update_issue("ISS-P", progress=progress) |
| assert res["success"] is True |
| assert issues[0]["progress"] == progress |
|
|
|
|
| @pytest.mark.parametrize("alert_type", ["fire", "medical", "sos", "fight", "anomaly"]) |
| def test_classify_severity(alert_type): |
| out = orch.classify_alert_severity(alert_type, "Hall", 50) |
| assert out["alert_type"] == alert_type |
| assert out["severity"] in ("CRITICAL", "HIGH", "MEDIUM") |
|
|
|
|
| @pytest.mark.parametrize("service", ["police", "fire", "ambulance", "invalid"]) |
| def test_emergency_service_lookup(service): |
| res = orch.locate_nearest_emergency_services(service) |
| if service == "invalid": |
| assert res["success"] is False |
| else: |
| assert "success" in res |
|
|