Skip to content

Commit 4a92f01

Browse files
committed
add test for custom logic
1 parent 34d3da8 commit 4a92f01

File tree

2 files changed

+87
-6
lines changed

2 files changed

+87
-6
lines changed

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@
3636
from servicelib.celery.models import TaskFilter, TaskState, TaskStatus, TaskUUID
3737
from simcore_service_api_server._meta import API_VTAG
3838
from simcore_service_api_server._service_function_jobs_task_client import (
39-
_JOB_CREATION_TASK_NOT_YET_SCHEDULED_STATUS,
40-
_JOB_CREATION_TASK_STATUS_PREFIX,
4139
FunctionJobTaskClientService,
4240
)
4341
from simcore_service_api_server.api.dependencies import services as service_dependencies
42+
from simcore_service_api_server.models.schemas.functions import (
43+
FunctionJobCreationTaskStatus,
44+
)
4445
from simcore_service_api_server.models.schemas.jobs import JobStatus
4546

4647
_faker = Faker()
@@ -368,11 +369,9 @@ async def _update_function_job_status_side_effect(*args, **kwargs):
368369
):
369370
assert data["status"] == job_status
370371
elif project_job_id is None and job_creation_task_id is None:
371-
assert data["status"] == _JOB_CREATION_TASK_NOT_YET_SCHEDULED_STATUS
372+
assert data["status"] == FunctionJobCreationTaskStatus.NOT_YET_SCHEDULED
372373
elif project_job_id is None and job_creation_task_id is not None:
373-
assert (
374-
data["status"] == f"{_JOB_CREATION_TASK_STATUS_PREFIX}{celery_task_state}"
375-
)
374+
assert data["status"] == FunctionJobCreationTaskStatus[celery_task_state.name]
376375
else:
377376
pytest.fail("Unexpected combination of parameters")
378377

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from collections.abc import Callable
2+
3+
import pytest
4+
from celery_library.errors import TaskNotFoundError
5+
from faker import Faker
6+
from models_library.products import ProductName
7+
from models_library.progress_bar import ProgressReport
8+
from models_library.users import UserID
9+
from pytest_mock import MockerFixture, MockType
10+
from servicelib.celery.models import TaskState, TaskStatus, TaskUUID
11+
from servicelib.celery.task_manager import TaskManager
12+
from simcore_service_api_server._service_function_jobs_task_client import (
13+
_celery_task_status,
14+
)
15+
from simcore_service_api_server.models.schemas.functions import (
16+
FunctionJobCreationTaskStatus,
17+
)
18+
from test_tasks import mock_task_manager
19+
20+
_faker = Faker()
21+
22+
23+
@pytest.fixture
24+
async def create_mock_task_manager(
25+
mocker: MockerFixture,
26+
) -> Callable[[TaskStatus | Exception], MockType]:
27+
28+
def _(status_or_exception: TaskStatus | Exception) -> MockType:
29+
mock_task_manager = mocker.Mock(spec=TaskManager)
30+
if isinstance(status_or_exception, Exception):
31+
32+
async def _raise(*args, **kwargs):
33+
raise status_or_exception
34+
35+
mock_task_manager.get_task_status.side_effect = _raise
36+
else:
37+
mock_task_manager.get_task_status.return_value = status_or_exception
38+
return mock_task_manager
39+
40+
return _
41+
42+
43+
@pytest.mark.parametrize(
44+
"status_or_exception",
45+
[
46+
TaskStatus(
47+
task_uuid=TaskUUID(_faker.uuid4()),
48+
task_state=state,
49+
progress_report=ProgressReport(actual_value=3.14),
50+
)
51+
for state in list(TaskState)
52+
]
53+
+ [TaskNotFoundError(task_id=_faker.uuid4())],
54+
)
55+
@pytest.mark.parametrize("job_creation_task_id", [_faker.uuid4(), None])
56+
async def test_celery_status_conversion(
57+
status_or_exception: TaskStatus | Exception,
58+
job_creation_task_id: str | None,
59+
create_mock_task_manager: Callable[[TaskStatus | Exception], MockType],
60+
user_id: UserID,
61+
product_name: ProductName,
62+
):
63+
64+
mock_task_manager = create_mock_task_manager(status_or_exception)
65+
66+
status = await _celery_task_status(
67+
job_creation_task_id=job_creation_task_id,
68+
task_manager=mock_task_manager,
69+
user_id=user_id,
70+
product_name=product_name,
71+
)
72+
73+
if job_creation_task_id is None:
74+
assert status == FunctionJobCreationTaskStatus.NOT_YET_SCHEDULED
75+
elif isinstance(status_or_exception, TaskNotFoundError):
76+
assert status == FunctionJobCreationTaskStatus.ERROR
77+
elif isinstance(status_or_exception, TaskStatus):
78+
assert (
79+
status == FunctionJobCreationTaskStatus[status_or_exception.task_state.name]
80+
)
81+
else:
82+
pytest.fail("Unexpected test input")

0 commit comments

Comments
 (0)