Skip to content

Commit b306b19

Browse files
committed
add test for checking function job patch method
1 parent 4eb2262 commit b306b19

File tree

4 files changed

+144
-4
lines changed

4 files changed

+144
-4
lines changed

services/web/server/src/simcore_service_webserver/functions/_controller/_functions_rpc.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,27 @@ async def register_function_job(
8888
)
8989

9090

91+
@router.expose(
92+
reraise_if_error_type=(
93+
UnsupportedFunctionJobClassError,
94+
FunctionJobsWriteApiAccessDeniedError,
95+
)
96+
)
97+
async def patch_registered_function_job(
98+
app: web.Application,
99+
*,
100+
user_id: UserID,
101+
product_name: ProductName,
102+
registered_function_job: RegisteredFunctionJob,
103+
) -> RegisteredFunctionJob:
104+
return await _functions_service.patch_registered_function_job(
105+
app=app,
106+
user_id=user_id,
107+
product_name=product_name,
108+
registered_function_job=registered_function_job,
109+
)
110+
111+
91112
@router.expose(reraise_if_error_type=(FunctionJobCollectionsWriteApiAccessDeniedError,))
92113
async def register_function_job_collection(
93114
app: web.Application,

services/web/server/src/simcore_service_webserver/functions/_functions_service.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,17 @@ async def register_function_job(
9595
return _decode_functionjob(created_function_job_db)
9696

9797

98+
async def patch_registered_function_job(
99+
app: web.Application,
100+
*,
101+
user_id: UserID,
102+
product_name: ProductName,
103+
registered_function_job: RegisteredFunctionJob,
104+
) -> RegisteredFunctionJob:
105+
encoded_function_job = _encode_functionjob(registered_function_job)
106+
return registered_function_job
107+
108+
98109
async def register_function_job_collection(
99110
app: web.Application,
100111
*,
@@ -675,13 +686,31 @@ def _encode_functionjob(
675686
if functionjob.function_class == FunctionClass.PROJECT:
676687
class_specific_data = FunctionJobClassSpecificData(
677688
{
678-
"project_job_id": str(functionjob.project_job_id),
689+
"project_job_id": (
690+
str(functionjob.project_job_id)
691+
if functionjob.project_job_id
692+
else None
693+
),
694+
"job_creation_task_id": (
695+
str(functionjob.job_creation_task_id)
696+
if functionjob.job_creation_task_id
697+
else None
698+
),
679699
}
680700
)
681701
elif functionjob.function_class == FunctionClass.SOLVER:
682702
class_specific_data = FunctionJobClassSpecificData(
683703
{
684-
"solver_job_id": str(functionjob.solver_job_id),
704+
"solver_job_id": (
705+
str(functionjob.solver_job_id)
706+
if functionjob.solver_job_id
707+
else None
708+
),
709+
"job_creation_task_id": (
710+
str(functionjob.job_creation_task_id)
711+
if functionjob.job_creation_task_id
712+
else None
713+
),
685714
}
686715
)
687716
else:
@@ -711,6 +740,9 @@ def _decode_functionjob(
711740
inputs=functionjob_db.inputs,
712741
outputs=functionjob_db.outputs,
713742
project_job_id=functionjob_db.class_specific_data["project_job_id"],
743+
job_creation_task_id=functionjob_db.class_specific_data[
744+
"job_creation_task_id"
745+
],
714746
created_at=functionjob_db.created,
715747
)
716748

@@ -723,6 +755,9 @@ def _decode_functionjob(
723755
inputs=functionjob_db.inputs,
724756
outputs=functionjob_db.outputs,
725757
solver_job_id=functionjob_db.class_specific_data["solver_job_id"],
758+
job_creation_task_id=functionjob_db.class_specific_data[
759+
"job_creation_task_id"
760+
],
726761
created_at=functionjob_db.created,
727762
)
728763

services/web/server/tests/unit/with_dbs/04/functions/test_function_job_collections_controller_rpc.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ async def test_function_job_collection(
6060
project_job_id=uuid4(),
6161
inputs={"input1": "value1"},
6262
outputs={"output1": "result1"},
63+
job_creation_task_id=None,
6364
)
6465
# Register the function job
6566
function_job_ids = []
@@ -71,6 +72,7 @@ async def test_function_job_collection(
7172
project_job_id=uuid4(),
7273
inputs={"input1": "value1"},
7374
outputs={"output1": "result1"},
75+
job_creation_task_id=None,
7476
)
7577
# Register the function job
7678
registered_job = await functions_rpc.register_function_job(
@@ -210,6 +212,7 @@ async def test_list_function_job_collections(
210212
project_job_id=uuid4(),
211213
inputs={"input1": "value1"},
212214
outputs={"output1": "result1"},
215+
job_creation_task_id=None,
213216
)
214217
# Register the function job
215218
registered_job = await functions_rpc.register_function_job(
@@ -308,6 +311,7 @@ async def test_list_function_job_collections_filtered_function_id(
308311
project_job_id=uuid4(),
309312
inputs={"input1": "value1"},
310313
outputs={"output1": "result1"},
314+
job_creation_task_id=None,
311315
)
312316
# Register the function job
313317
registered_job = await functions_rpc.register_function_job(

services/web/server/tests/unit/with_dbs/04/functions/test_function_jobs_controller_rpc.py

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@
22
# pylint: disable=unused-argument
33

44
import datetime
5-
from uuid import uuid4
5+
from uuid import UUID, uuid4
66

77
import pytest
88
from aiohttp.test_utils import TestClient
99
from common_library.users_enums import UserRole
10+
from faker import Faker
1011
from models_library.api_schemas_webserver.functions import (
1112
ProjectFunction,
1213
ProjectFunctionJob,
1314
)
14-
from models_library.functions import FunctionJobCollection, FunctionJobStatus
15+
from models_library.functions import (
16+
FunctionClass,
17+
FunctionJobCollection,
18+
FunctionJobStatus,
19+
RegisteredProjectFunctionJob,
20+
)
1521
from models_library.functions_errors import (
1622
FunctionJobIDNotFoundError,
1723
FunctionJobReadAccessDeniedError,
@@ -28,6 +34,9 @@
2834
pytest_simcore_core_services_selection = ["rabbit"]
2935

3036

37+
_faker = Faker()
38+
39+
3140
@pytest.mark.parametrize(
3241
"user_role",
3342
[UserRole.USER],
@@ -57,6 +66,7 @@ async def test_register_get_delete_function_job(
5766
project_job_id=uuid4(),
5867
inputs={"input1": "value1"},
5968
outputs={"output1": "result1"},
69+
job_creation_task_id=None,
6070
)
6171

6272
# Register the function job
@@ -183,6 +193,7 @@ async def test_list_function_jobs(
183193
project_job_id=uuid4(),
184194
inputs={"input1": "value1"},
185195
outputs={"output1": "result1"},
196+
job_creation_task_id=None,
186197
)
187198

188199
# Register the function job
@@ -244,6 +255,7 @@ async def test_list_function_jobs_filtering(
244255
project_job_id=uuid4(),
245256
inputs={"input1": "value1"},
246257
outputs={"output1": "result1"},
258+
job_creation_task_id=None,
247259
)
248260
# Register the function job
249261
first_registered_function_jobs.append(
@@ -262,6 +274,7 @@ async def test_list_function_jobs_filtering(
262274
project_job_id=uuid4(),
263275
inputs={"input1": "value1"},
264276
outputs={"output1": "result1"},
277+
job_creation_task_id=None,
265278
)
266279
# Register the function job
267280
second_registered_function_jobs.append(
@@ -381,6 +394,7 @@ async def test_find_cached_function_jobs(
381394
project_job_id=uuid4(),
382395
inputs={"input1": value if value < 4 else 1},
383396
outputs={"output1": "result1"},
397+
job_creation_task_id=None,
384398
)
385399

386400
# Register the function job
@@ -421,6 +435,70 @@ async def test_find_cached_function_jobs(
421435
assert cached_jobs is None
422436

423437

438+
@pytest.mark.parametrize(
439+
"user_role",
440+
[UserRole.USER],
441+
)
442+
async def test_patch_registered_function_jobs(
443+
client: TestClient,
444+
rpc_client: RabbitMQRPCClient,
445+
add_user_function_api_access_rights: None,
446+
logged_user: UserInfoDict,
447+
other_logged_user: UserInfoDict,
448+
osparc_product_name: ProductName,
449+
mock_function: ProjectFunction,
450+
clean_functions: None,
451+
):
452+
453+
registered_function = await functions_rpc.register_function(
454+
rabbitmq_rpc_client=rpc_client,
455+
function=mock_function,
456+
user_id=logged_user["id"],
457+
product_name=osparc_product_name,
458+
)
459+
460+
function_job = ProjectFunctionJob(
461+
function_uid=registered_function.uid,
462+
title="Test Function Job",
463+
description="A test function job",
464+
project_job_id=None,
465+
inputs={"input1": _faker.pyint(min_value=0, max_value=1000)},
466+
outputs={"output1": "result1"},
467+
job_creation_task_id=None,
468+
)
469+
470+
# Register the function job
471+
registered_job = await functions_rpc.register_function_job(
472+
rabbitmq_rpc_client=rpc_client,
473+
function_job=function_job,
474+
user_id=logged_user["id"],
475+
product_name=osparc_product_name,
476+
)
477+
478+
added_data = {"job_creation_task_id": f"{uuid4()}"}
479+
registered_job_dict = registered_job.model_dump()
480+
registered_job_dict.update(**added_data)
481+
registered_job = RegisteredProjectFunctionJob.model_validate(registered_job_dict)
482+
483+
registered_job = await functions_rpc.patch_registered_function_job(
484+
rabbitmq_rpc_client=rpc_client,
485+
user_id=logged_user["id"],
486+
product_name=osparc_product_name,
487+
registered_function_job=registered_job,
488+
)
489+
assert registered_job.function_class == FunctionClass.PROJECT
490+
assert registered_job.job_creation_task_id == added_data["job_creation_task_id"]
491+
492+
added_data.update(project_job_id=f"{uuid4()}")
493+
494+
registered_job_dict = registered_job.model_dump()
495+
registered_job_dict.update(**added_data)
496+
registered_job = RegisteredProjectFunctionJob.model_validate(registered_job_dict)
497+
assert registered_job.function_class == FunctionClass.PROJECT
498+
assert registered_job.job_creation_task_id == added_data["job_creation_task_id"]
499+
assert registered_job.project_job_id == UUID(added_data["project_job_id"])
500+
501+
424502
@pytest.mark.parametrize(
425503
"user_role",
426504
[UserRole.USER],
@@ -448,6 +526,7 @@ async def test_update_function_job_status(
448526
project_job_id=uuid4(),
449527
inputs={"input1": "value1"},
450528
outputs={"output1": "result1"},
529+
job_creation_task_id=None,
451530
)
452531

453532
# Register the function job
@@ -507,6 +586,7 @@ async def test_update_function_job_outputs(
507586
project_job_id=uuid4(),
508587
inputs={"input1": "value1"},
509588
outputs=None,
589+
job_creation_task_id=None,
510590
)
511591

512592
# Register the function job

0 commit comments

Comments
 (0)