4
4
5
5
from pathlib import Path
6
6
from typing import TypedDict
7
+ from uuid import UUID
7
8
8
9
import httpx
9
10
import jinja2
13
14
from pydantic import parse_file_as
14
15
from pytest_simcore .helpers .httpx_calls_capture_models import HttpApiCallCaptureModel
15
16
from respx import MockRouter
17
+ from servicelib .common_headers import (
18
+ X_SIMCORE_PARENT_NODE_ID ,
19
+ X_SIMCORE_PARENT_PROJECT_UUID ,
20
+ )
16
21
from simcore_service_api_server .models .schemas .jobs import Job , JobInputs
17
22
from starlette import status
18
23
24
+ _faker = Faker ()
25
+
19
26
20
27
class MockedBackendApiDict (TypedDict ):
21
28
catalog : MockRouter | None
@@ -158,6 +165,10 @@ async def test_create_and_delete_solver_job(
158
165
# Run a job and delete when finished
159
166
160
167
168
+ @pytest .mark .parametrize (
169
+ "parent_node_id, parent_project_id" ,
170
+ [(_faker .uuid4 (), _faker .uuid4 ()), (None , None )],
171
+ )
161
172
@pytest .mark .parametrize ("hidden" , [True , False ])
162
173
async def test_create_job (
163
174
auth : httpx .BasicAuth ,
@@ -166,29 +177,47 @@ async def test_create_job(
166
177
solver_version : str ,
167
178
mocked_backend_services_apis_for_create_and_delete_solver_job : MockedBackendApiDict ,
168
179
hidden : bool ,
180
+ parent_project_id : UUID | None ,
181
+ parent_node_id : UUID | None ,
169
182
):
170
183
171
184
mock_webserver_router = (
172
185
mocked_backend_services_apis_for_create_and_delete_solver_job ["webserver" ]
173
186
)
187
+ assert mock_webserver_router is not None
174
188
callback = mock_webserver_router ["create_projects" ].side_effect
189
+ assert callback is not None
175
190
176
191
def create_project_side_effect (request : httpx .Request ):
192
+ # check `hidden` bool
177
193
query = dict (elm .split ("=" ) for elm in request .url .query .decode ().split ("&" ))
178
194
_hidden = query .get ("hidden" )
179
195
assert _hidden == ("true" if hidden else "false" )
196
+
197
+ # check parent project and node id
198
+ if parent_project_id is not None :
199
+ assert f"{ parent_project_id } " == dict (request .headers ).get (
200
+ X_SIMCORE_PARENT_PROJECT_UUID .lower ()
201
+ )
202
+ if parent_node_id is not None :
203
+ assert f"{ parent_node_id } " == dict (request .headers ).get (
204
+ X_SIMCORE_PARENT_NODE_ID .lower ()
205
+ )
180
206
return callback (request )
181
207
182
- mock_webserver_router = (
183
- mocked_backend_services_apis_for_create_and_delete_solver_job ["webserver" ]
184
- )
185
208
mock_webserver_router ["create_projects" ].side_effect = create_project_side_effect
186
209
187
210
# create Job
211
+ header_dict = {}
212
+ if parent_project_id is not None :
213
+ header_dict [X_SIMCORE_PARENT_PROJECT_UUID ] = f"{ parent_project_id } "
214
+ if parent_node_id is not None :
215
+ header_dict [X_SIMCORE_PARENT_NODE_ID ] = f"{ parent_node_id } "
188
216
resp = await client .post (
189
217
f"/v0/solvers/{ solver_key } /releases/{ solver_version } /jobs" ,
190
218
auth = auth ,
191
219
params = {"hidden" : f"{ hidden } " },
220
+ headers = header_dict ,
192
221
json = JobInputs (
193
222
values = {
194
223
"x" : 3.14 ,
0 commit comments