Skip to content

Commit eab5e08

Browse files
committed
finish test for getting function job status
1 parent 8ed5bbd commit eab5e08

File tree

2 files changed

+47
-11
lines changed

2 files changed

+47
-11
lines changed

services/api-server/src/simcore_service_api_server/api/routes/function_jobs_routes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
JOB_LIST_FILTER_PAGE_RELEASE_VERSION = "0.11.0"
7171
JOB_LOG_RELEASE_VERSION = "0.11.0"
7272

73+
_JOB_CREATION_TASK_STATUS_PREFIX: Final[str] = "JOB_CREATION_TASK_STATUS_"
74+
7375
function_job_router = APIRouter()
7476

7577
_COMMON_FUNCTION_JOB_ERROR_RESPONSES: Final[dict] = {
@@ -236,7 +238,7 @@ async def function_job_status(
236238
task_uuid=TaskUUID(task_id), task_filter=task_filter
237239
)
238240
return FunctionJobStatus(
239-
status=f"JOB_CREATION_TASK_STATUS_{task_status.task_state}"
241+
status=f"{_JOB_CREATION_TASK_STATUS_PREFIX}{task_status.task_state}"
240242
)
241243
user_error_msg = f"The creation of job {function_job.uid} failed"
242244
support_id = create_error_code(Exception())

services/api-server/tests/unit/api_functions/test_api_routers_function_jobs.py

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# pylint: disable=unused-argument
22

3+
import random
34
import uuid
45
from collections.abc import Callable
56
from datetime import datetime
@@ -11,7 +12,7 @@
1112
import simcore_service_api_server.api.routes.function_jobs_routes as function_jobs_routes
1213
from celery_library.task_manager import CeleryTaskManager
1314
from faker import Faker
14-
from fastapi import FastAPI
15+
from fastapi import FastAPI, status
1516
from httpx import AsyncClient
1617
from models_library.api_schemas_webserver.functions import (
1718
ProjectFunctionJob,
@@ -20,6 +21,7 @@
2021
from models_library.functions import (
2122
FunctionJobStatus,
2223
RegisteredProjectFunction,
24+
TaskID,
2325
)
2426
from models_library.products import ProductName
2527
from models_library.progress_bar import ProgressReport, ProgressStructuredMessage
@@ -28,9 +30,11 @@
2830
from models_library.rest_pagination import PageMetaInfoLimitOffset
2931
from models_library.users import UserID
3032
from pytest_mock import MockerFixture, MockType
31-
from servicelib.aiohttp import status
3233
from servicelib.celery.models import TaskFilter, TaskState, TaskStatus, TaskUUID
3334
from 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+
)
3438
from 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+
)
196210
async 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

Comments
 (0)