from __future__ import annotations from fastapi import FastAPI from fastapi.testclient import TestClient from backend.api.routes_oracle import router def _build_client() -> TestClient: app = FastAPI() app.state.db_pool = object() async def _broadcast_crm_event(*_args, **_kwargs): return None app.state.broadcast_crm_event = _broadcast_crm_event app.include_router(router, prefix="/api/oracle") return TestClient(app) def test_oracle_mcp_execute_and_writeback(monkeypatch) -> None: client = _build_client() async def fake_execute(tool_name, query, *, crm_pool=None): return {"tool": tool_name, "query": query, "status": "ok", "results": [{"title": "Match"}]} async def fake_apply_writeback(payload): return { "actionId": payload["action_id"], "status": "applied", "targetEntityType": payload["target_entity_type"], "targetEntityId": payload["target_entity_id"], "resultPayload": {"lead_id": payload["target_entity_id"], "score": 88}, } async def fake_list_actions(*, status=None, limit=50): return [{"actionId": "act-1", "status": status or "planned", "targetEntityType": "lead"}] monkeypatch.setattr("backend.api.routes_oracle.mcp_registry.execute", fake_execute) monkeypatch.setattr("backend.api.routes_oracle.oracle_action_service.apply_writeback", fake_apply_writeback) monkeypatch.setattr("backend.api.routes_oracle.oracle_action_service.list_actions", fake_list_actions) mcp_response = client.post( "/api/oracle/mcp/execute", json={"tool_name": "external_search", "query": "luxury marina inventory dubai"}, ) assert mcp_response.status_code == 200 assert mcp_response.json()["data"]["tool"] == "external_search" writeback_response = client.post( "/api/oracle/actions/writeback", json={ "action_id": "act-1", "target_entity_type": "lead", "target_entity_id": "lead-1", "writeback_payload": {"score_delta": 12}, }, ) assert writeback_response.status_code == 200 assert writeback_response.json()["data"]["status"] == "applied" list_response = client.get("/api/oracle/actions") assert list_response.status_code == 200 assert list_response.json()["meta"]["count"] == 1