3838 RegisteredFunctionJob ,
3939 RegisteredProjectFunction ,
4040 RegisteredProjectFunctionJob ,
41+ RegisteredProjectFunctionJobPatch ,
4142)
4243from models_library .projects import ProjectID
4344from models_library .users import UserID
4950 X_SIMCORE_PARENT_PROJECT_UUID ,
5051)
5152from simcore_service_api_server ._meta import API_VTAG
52- from simcore_service_api_server ._service_function_jobs import FunctionJobService
5353from simcore_service_api_server .api .dependencies .authentication import Identity
5454from 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
6258from simcore_service_api_server .celery .worker_tasks .functions_tasks import (
6359 run_function as run_function_task ,
6460)
6561from simcore_service_api_server .exceptions .backend_errors import BaseBackEndError
6662from simcore_service_api_server .models .api_resources import JobLinks
63+ from simcore_service_api_server .models .domain .functions import (
64+ PreRegisteredFunctionJobData ,
65+ )
6766from 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
0 commit comments