65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
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
|