11# pylint: disable=unused-argument
22
3+ import random
34import uuid
45from collections .abc import Callable
56from datetime import datetime
1112import simcore_service_api_server .api .routes .function_jobs_routes as function_jobs_routes
1213from celery_library .task_manager import CeleryTaskManager
1314from faker import Faker
14- from fastapi import FastAPI
15+ from fastapi import FastAPI , status
1516from httpx import AsyncClient
1617from models_library .api_schemas_webserver .functions import (
1718 ProjectFunctionJob ,
2021from models_library .functions import (
2122 FunctionJobStatus ,
2223 RegisteredProjectFunction ,
24+ TaskID ,
2325)
2426from models_library .products import ProductName
2527from models_library .progress_bar import ProgressReport , ProgressStructuredMessage
2830from models_library .rest_pagination import PageMetaInfoLimitOffset
2931from models_library .users import UserID
3032from pytest_mock import MockerFixture , MockType
31- from servicelib .aiohttp import status
3233from servicelib .celery .models import TaskFilter , TaskState , TaskStatus , TaskUUID
3334from simcore_service_api_server ._meta import API_VTAG
35+ from simcore_service_api_server .api .routes .function_jobs_routes import (
36+ _JOB_CREATION_TASK_STATUS_PREFIX ,
37+ )
3438from simcore_service_api_server .models .schemas .jobs import JobStatus
3539
3640_faker = Faker ()
@@ -191,8 +195,18 @@ def mocked_list_function_jobs(offset: int, limit: int):
191195
192196
193197@pytest .mark .parametrize ("job_status" , ["SUCCESS" , "FAILED" , "STARTED" ])
194- @pytest .mark .parametrize ("project_job_id" , [None , ProjectID (_faker .uuid4 ())])
195- @pytest .mark .parametrize ("job_creation_task_id" , [None , TaskUUID (_faker .uuid4 ())])
198+ @pytest .mark .parametrize (
199+ "project_job_id, job_creation_task_id, celery_task_state" ,
200+ [
201+ (
202+ ProjectID (_faker .uuid4 ()),
203+ TaskID (_faker .uuid4 ()),
204+ random .choice ([state for state in TaskState ]),
205+ ),
206+ (None , None , random .choice ([state for state in TaskState ])),
207+ (None , TaskID (_faker .uuid4 ()), random .choice ([state for state in TaskState ])),
208+ ],
209+ )
196210async def test_get_function_job_status (
197211 app : FastAPI ,
198212 mocked_app_dependencies : None ,
@@ -205,17 +219,26 @@ async def test_get_function_job_status(
205219 auth : httpx .BasicAuth ,
206220 job_status : str ,
207221 project_job_id : ProjectID ,
208- job_creation_task_id : TaskUUID | None ,
222+ job_creation_task_id : TaskID | None ,
223+ celery_task_state : TaskState ,
209224) -> None :
210225
226+ _expected_return_status = (
227+ status .HTTP_500_INTERNAL_SERVER_ERROR
228+ if job_status != "SUCCESS"
229+ and job_status != "FAILED"
230+ and (project_job_id is None and job_creation_task_id is None )
231+ else status .HTTP_200_OK
232+ )
233+
211234 def _mock_task_manager (* args , ** kwargs ) -> CeleryTaskManager :
212235 async def _get_task_status (
213236 task_uuid : TaskUUID , task_filter : TaskFilter
214237 ) -> TaskStatus :
215- assert task_uuid == job_creation_task_id
238+ assert f" { task_uuid } " == job_creation_task_id
216239 return TaskStatus (
217240 task_uuid = task_uuid ,
218- task_state = TaskState . STARTED ,
241+ task_state = celery_task_state ,
219242 progress_report = ProgressReport (
220243 actual_value = 0.5 ,
221244 total = 1.0 ,
@@ -271,9 +294,20 @@ async def _get_task_status(
271294 f"{ API_VTAG } /function_jobs/{ mock_registered_project_function_job .uid } /status" ,
272295 auth = auth ,
273296 )
274- assert response .status_code == status .HTTP_200_OK
275- data = response .json ()
276- assert data ["status" ] == job_status
297+ assert response .status_code == _expected_return_status
298+ if response .status_code == status .HTTP_200_OK :
299+ data = response .json ()
300+ if (
301+ project_job_id is not None
302+ or job_status == "SUCCESS"
303+ or job_status == "FAILED"
304+ ):
305+ assert data ["status" ] == job_status
306+ else :
307+ assert (
308+ data ["status" ]
309+ == f"{ _JOB_CREATION_TASK_STATUS_PREFIX } { celery_task_state } "
310+ )
277311
278312
279313@pytest .mark .parametrize ("job_outputs" , [{"X+Y" : 42 , "X-Y" : 10 }])
0 commit comments