Skip to content

Commit bf6bb7e

Browse files
committed
fix fake run fcn test
1 parent 07f7ec8 commit bf6bb7e

File tree

3 files changed

+71
-24
lines changed

3 files changed

+71
-24
lines changed

services/api-server/src/simcore_service_api_server/celery/worker_tasks/tasks.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from ...api.dependencies.authentication import Identity
1818
from ...models.api_resources import JobLinks
19+
from ...models.domain.functions import PreRegisteredFunctionJobData
1920
from ...models.schemas.jobs import JobInputs, JobPricingSpecification
2021
from .functions_tasks import run_function
2122

@@ -26,6 +27,7 @@
2627
JobInputs,
2728
JobLinks,
2829
JobPricingSpecification,
30+
PreRegisteredFunctionJobData,
2931
RegisteredProjectFunction,
3032
RegisteredProjectFunctionJob,
3133
RegisteredPythonCodeFunction,

services/api-server/tests/unit/api_functions/celery/test_functions.py

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
RegisteredFunctionJob,
3939
RegisteredProjectFunction,
4040
RegisteredProjectFunctionJob,
41+
RegisteredProjectFunctionJobPatch,
4142
)
4243
from models_library.projects import ProjectID
4344
from models_library.users import UserID
@@ -49,23 +50,20 @@
4950
X_SIMCORE_PARENT_PROJECT_UUID,
5051
)
5152
from simcore_service_api_server._meta import API_VTAG
52-
from simcore_service_api_server._service_function_jobs import FunctionJobService
5353
from simcore_service_api_server.api.dependencies.authentication import Identity
5454
from simcore_service_api_server.api.dependencies.celery import (
5555
ASYNC_JOB_CLIENT_NAME,
5656
get_task_manager,
5757
)
58-
from simcore_service_api_server.api.dependencies.services import (
59-
get_function_job_service,
60-
)
61-
from simcore_service_api_server.api.routes.functions_routes import get_function
6258
from simcore_service_api_server.celery.worker_tasks.functions_tasks import (
6359
run_function as run_function_task,
6460
)
6561
from simcore_service_api_server.exceptions.backend_errors import BaseBackEndError
6662
from simcore_service_api_server.models.api_resources import JobLinks
63+
from simcore_service_api_server.models.domain.functions import (
64+
PreRegisteredFunctionJobData,
65+
)
6766
from simcore_service_api_server.models.schemas.jobs import (
68-
JobInputs,
6967
JobPricingSpecification,
7068
NodeID,
7169
)
@@ -116,7 +114,7 @@ async def run_function(
116114
*,
117115
user_identity: Identity,
118116
function: RegisteredFunction,
119-
job_inputs: JobInputs,
117+
pre_registered_function_job_data: PreRegisteredFunctionJobData,
120118
pricing_spec: JobPricingSpecification | None,
121119
job_links: JobLinks,
122120
x_simcore_parent_project_uuid: NodeID | None,
@@ -126,12 +124,13 @@ async def run_function(
126124
title=_faker.sentence(),
127125
description=_faker.paragraph(),
128126
function_uid=FunctionID(_faker.uuid4()),
129-
inputs=job_inputs.values,
127+
inputs=pre_registered_function_job_data.job_inputs.values,
130128
outputs=None,
131129
function_class=FunctionClass.PROJECT,
132130
uid=FunctionJobID(_faker.uuid4()),
133131
created_at=_faker.date_time(),
134132
project_job_id=ProjectID(_faker.uuid4()),
133+
job_creation_task_id=None,
135134
)
136135

137136
# check our mock task is correct
@@ -155,6 +154,12 @@ async def test_with_fake_run_function(
155154
auth: BasicAuth,
156155
mocker: MockerFixture,
157156
with_api_server_celery_worker: TestWorkController,
157+
mock_handler_in_functions_rpc_interface: Callable[
158+
[str, Any, Exception | None, Callable | None], None
159+
],
160+
mock_registered_project_function: RegisteredProjectFunction,
161+
mock_registered_project_function_job: RegisteredFunctionJob,
162+
user_id: UserID,
158163
):
159164

160165
body = {
@@ -169,19 +174,55 @@ async def test_with_fake_run_function(
169174
],
170175
}
171176

172-
async def mock_get_function_job_service() -> FunctionJobService:
173-
mock = mocker.AsyncMock(spec=FunctionJobService)
174-
mock.run_function_pre_check.return_value = JobInputs(values=body)
175-
return mock
176-
177-
app.dependency_overrides[get_function_job_service] = mock_get_function_job_service
177+
mock_handler_in_functions_rpc_interface(
178+
"get_function_user_permissions",
179+
FunctionUserAccessRights(
180+
user_id=user_id,
181+
execute=True,
182+
read=True,
183+
write=True,
184+
),
185+
None,
186+
None,
187+
)
188+
mock_handler_in_functions_rpc_interface(
189+
"get_functions_user_api_access_rights",
190+
FunctionUserApiAccessRights(
191+
user_id=user_id,
192+
read_functions=True,
193+
write_functions=True,
194+
execute_functions=True,
195+
read_function_jobs=True,
196+
write_function_jobs=True,
197+
execute_function_jobs=True,
198+
read_function_job_collections=True,
199+
write_function_job_collections=True,
200+
execute_function_job_collections=True,
201+
),
202+
None,
203+
None,
204+
)
205+
mock_handler_in_functions_rpc_interface(
206+
"get_function", mock_registered_project_function, None, None
207+
)
208+
mock_handler_in_functions_rpc_interface("find_cached_function_jobs", [], None, None)
209+
mock_handler_in_functions_rpc_interface(
210+
"register_function_job", mock_registered_project_function_job, None, None
211+
)
178212

179-
app.dependency_overrides[get_function] = (
180-
lambda: RegisteredProjectFunction.model_validate(
181-
RegisteredProjectFunction.model_config.get("json_schema_extra", {}).get(
182-
"examples", []
183-
)[0]
213+
async def _patch_side_effect(*args, **kwargs):
214+
registered_function_job_patch = kwargs["registered_function_job_patch"]
215+
assert isinstance(
216+
registered_function_job_patch, RegisteredProjectFunctionJobPatch
184217
)
218+
job_creation_task_id = registered_function_job_patch.job_creation_task_id
219+
assert job_creation_task_id is not None
220+
return mock_registered_project_function_job.model_copy(
221+
update={"job_creation_task_id": job_creation_task_id}
222+
)
223+
224+
mock_handler_in_functions_rpc_interface(
225+
"patch_registered_function_job", None, None, _patch_side_effect
185226
)
186227

187228
headers = {}
@@ -196,10 +237,11 @@ async def mock_get_function_job_service() -> FunctionJobService:
196237
)
197238

198239
assert response.status_code == status.HTTP_200_OK
199-
task = TaskGet.model_validate(response.json())
200-
240+
function_job = RegisteredProjectFunctionJob.model_validate(response.json())
241+
celery_task_id = function_job.job_creation_task_id
242+
assert celery_task_id is not None
201243
# Poll until task completion and get result
202-
result = await poll_task_until_done(client, auth, task.task_id)
244+
result = await poll_task_until_done(client, auth, celery_task_id)
203245
RegisteredProjectFunctionJob.model_validate(result.result)
204246

205247

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,21 +260,24 @@ def mock_registered_function_job_collection(
260260
@pytest.fixture()
261261
def mock_handler_in_functions_rpc_interface(
262262
mock_wb_api_server_rpc: MockerFixture,
263-
) -> Callable[[str, Any, Exception | None], None]:
263+
) -> Callable[[str, Any, Exception | None, Callable | None], None]:
264264
def _mock(
265265
handler_name: str = "",
266266
return_value: Any = None,
267267
exception: Exception | None = None,
268+
side_effect: Callable | None = None,
268269
) -> MockType:
269270
from servicelib.rabbitmq.rpc_interfaces.webserver.functions import (
270271
functions_rpc_interface,
271272
)
272273

274+
assert exception is None or side_effect is None
275+
273276
return mock_wb_api_server_rpc.patch.object(
274277
functions_rpc_interface,
275278
handler_name,
276279
return_value=return_value,
277-
side_effect=exception,
280+
side_effect=exception or side_effect,
278281
)
279282

280283
return _mock

0 commit comments

Comments
 (0)