UPDATE
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.test import TestCase, override_settings
|
||||
from rest_framework.test import APIRequestFactory, force_authenticate
|
||||
|
||||
from .models import Conversation, Message
|
||||
from .views import ChatTaskStatusView
|
||||
|
||||
|
||||
@override_settings(USE_EXTERNAL_API_MOCK=True)
|
||||
class ChatTaskStatusViewTests(TestCase):
|
||||
def setUp(self):
|
||||
self.factory = APIRequestFactory()
|
||||
self.user = get_user_model().objects.create_user(
|
||||
username="farmer",
|
||||
password="secret123",
|
||||
email="farmer@example.com",
|
||||
phone_number="09120000000",
|
||||
)
|
||||
self.conversation = Conversation.objects.create(
|
||||
owner=self.user,
|
||||
title="Irrigation chat",
|
||||
farm_context={},
|
||||
)
|
||||
self.user_message = Message.objects.create(
|
||||
conversation=self.conversation,
|
||||
role=Message.ROLE_USER,
|
||||
content="What is the best irrigation plan?",
|
||||
raw_response={
|
||||
"task_id": "farm-ai-chat-task-123",
|
||||
"status": "PENDING",
|
||||
"status_url": "/api/tasks/farm-ai-chat-task-123/status/",
|
||||
},
|
||||
)
|
||||
|
||||
def test_status_success_uses_chat_mock_result_and_persists_assistant_message(self):
|
||||
request = self.factory.get("/api/farm-ai-assistant/chat/task/farm-ai-chat-task-123/status/")
|
||||
force_authenticate(request, user=self.user)
|
||||
|
||||
response = ChatTaskStatusView.as_view()(request, task_id="farm-ai-chat-task-123")
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data["status"], "success")
|
||||
self.assertEqual(response.data["data"]["task_id"], "farm-ai-chat-task-123")
|
||||
self.assertEqual(response.data["data"]["status"], "SUCCESS")
|
||||
self.assertEqual(response.data["data"]["conversation_id"], str(self.conversation.uuid))
|
||||
self.assertEqual(response.data["data"]["result"]["content"], "Here is the recommended plan.")
|
||||
self.assertEqual(len(response.data["data"]["result"]["sections"]), 3)
|
||||
self.assertEqual(response.data["data"]["result"]["task_id"], "farm-ai-chat-task-123")
|
||||
|
||||
assistant_message = (
|
||||
self.conversation.messages.filter(role=Message.ROLE_ASSISTANT)
|
||||
.order_by("-created_at")
|
||||
.first()
|
||||
)
|
||||
self.assertIsNotNone(assistant_message)
|
||||
self.assertEqual(assistant_message.content, "Here is the recommended plan.")
|
||||
self.assertEqual(assistant_message.raw_response["task_id"], "farm-ai-chat-task-123")
|
||||
self.assertEqual(len(assistant_message.raw_response["sections"]), 3)
|
||||
@@ -12,7 +12,7 @@ from .views import (
|
||||
|
||||
urlpatterns = [
|
||||
path("context/", ContextView.as_view(), name="farm-ai-assistant-context"),
|
||||
path("chat/", ChatView.as_view(), name="farm-ai-assistant-chat"),
|
||||
# path("chat/", ChatView.as_view(), name="farm-ai-assistant-chat"),
|
||||
path("chat/task/", ChatTaskCreateView.as_view(), name="farm-ai-assistant-chat-task-create"),
|
||||
path("chat/task/<str:task_id>/status/", ChatTaskStatusView.as_view(), name="farm-ai-assistant-chat-task-status"),
|
||||
path("chats/", ChatListCreateView.as_view(), name="farm-ai-assistant-chat-list-create"),
|
||||
|
||||
@@ -201,6 +201,29 @@ class ConversationAccessMixin:
|
||||
|
||||
return task_status_payload
|
||||
|
||||
def _extract_structured_task_result(self, adapter_data):
|
||||
payload_source = adapter_data
|
||||
if isinstance(adapter_data, dict) and isinstance(adapter_data.get("data"), dict):
|
||||
payload_source = adapter_data["data"]
|
||||
|
||||
if not isinstance(payload_source, dict):
|
||||
return None
|
||||
|
||||
result = payload_source.get("result")
|
||||
if isinstance(result, dict):
|
||||
return result
|
||||
|
||||
if payload_source.get("status") == "SUCCESS":
|
||||
content = payload_source.get("content")
|
||||
sections = payload_source.get("sections")
|
||||
if content or sections:
|
||||
return {
|
||||
"content": content or "",
|
||||
"sections": sections or [],
|
||||
}
|
||||
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def _serialize_chat_message(message):
|
||||
raw_response = message.raw_response if isinstance(message.raw_response, dict) else {}
|
||||
@@ -541,7 +564,10 @@ class ChatTaskStatusView(ConversationAccessMixin, APIView):
|
||||
conversation_id=conversation_id,
|
||||
)
|
||||
|
||||
result = task_status_payload.get("result")
|
||||
result = self._extract_structured_task_result(adapter_response.data)
|
||||
if result is not None:
|
||||
task_status_payload["result"] = result
|
||||
|
||||
if user_message and task_status_payload.get("status") == "SUCCESS" and isinstance(result, dict):
|
||||
assistant_payload = self._persist_task_result(user_message, task_id, result)
|
||||
task_status_payload["result"] = assistant_payload
|
||||
|
||||
Reference in New Issue
Block a user