diff --git a/src/backend/core/api/viewsets/task.py b/src/backend/core/api/viewsets/task.py index 79bb7af5..42e9cc13 100644 --- a/src/backend/core/api/viewsets/task.py +++ b/src/backend/core/api/viewsets/task.py @@ -2,14 +2,13 @@ import logging -from celery.result import AsyncResult from celery import states as celery_states +from celery.result import AsyncResult from drf_spectacular.utils import ( OpenApiExample, extend_schema, inline_serializer, ) -from rest_framework import exceptions as drf_exceptions from rest_framework import permissions from rest_framework import serializers as drf_serializers from rest_framework.response import Response @@ -66,10 +65,11 @@ class TaskDetailView(APIView): def get(self, request, task_id): """Get the status of a Celery task.""" - # Check if the task exists task_result = AsyncResult(task_id, app=celery_app) - if not task_result.id: - raise drf_exceptions.NotFound("Task not found") + + # By default unknown tasks will be in PENDING. There is no reliable + # way to check if a task exists or not with Celery. + # https://github.com/celery/celery/issues/3596#issuecomment-262102185 # Prepare the response data result_data = { diff --git a/src/backend/core/tests/api/test_messages_create.py b/src/backend/core/tests/api/test_messages_create.py index 381bd719..6d5aa865 100644 --- a/src/backend/core/tests/api/test_messages_create.py +++ b/src/backend/core/tests/api/test_messages_create.py @@ -144,9 +144,26 @@ class TestApiDraftAndSendMessage: assert send_response.status_code == status.HTTP_200_OK - mock_send_outbound_message.assert_called() + # Checks on the returned task_id + task_id = send_response.data["task_id"] + assert task_id is not None - # TODO: checks on returned task_id + # Check with an unknown task_id + task_response = client.get( + reverse("task-detail", kwargs={"task_id": "unknown-task-id"}) + ) + assert task_response.status_code == status.HTTP_200_OK + assert task_response.data["status"] == "PENDING" + + # Call the task API + task_response = client.get(reverse("task-detail", kwargs={"task_id": task_id})) + assert task_response.status_code == status.HTTP_200_OK + assert task_response.data["status"] == "SUCCESS" + assert task_response.data["result"] is not None + assert task_response.data["result"]["message_id"] == draft_message_id + assert task_response.data["error"] is None + + mock_send_outbound_message.assert_called() sent_message = models.Message.objects.get(id=draft_message_id) assert sent_message.raw_mime