3535from models_library .api_schemas_webserver .storage import PathToExport
3636from models_library .basic_types import SHA256Str
3737from models_library .products import ProductName
38- from models_library .projects_nodes_io import NodeID , NodeIDStr , SimcoreS3FileID
38+ from models_library .projects_nodes_io import NodeID , SimcoreS3FileID
3939from models_library .users import UserID
4040from pydantic import ByteSize , TypeAdapter
4141from pytest_mock import MockerFixture
@@ -72,22 +72,35 @@ async def _request_copy_folders(
7272 rpc_client : RabbitMQRPCClient ,
7373 user_id : UserID ,
7474 product_name : ProductName ,
75- source_project : dict [str , Any ],
75+ src_project : dict [str , Any ],
76+ src_project_nodes : dict [NodeID , dict [str , Any ]],
7677 dst_project : dict [str , Any ],
78+ dst_project_nodes : dict [NodeID , dict [str , Any ]],
7779 nodes_map : dict [NodeID , NodeID ],
7880 * ,
7981 client_timeout : datetime .timedelta = datetime .timedelta (seconds = 60 ),
8082) -> dict [str , Any ]:
8183 with log_context (
8284 logging .INFO ,
83- f"Copying folders from { source_project ['uuid' ]} to { dst_project ['uuid' ]} " ,
85+ f"Copying folders from { src_project ['uuid' ]} to { dst_project ['uuid' ]} " ,
8486 ) as ctx :
87+ source = src_project | {
88+ "workbench" : {
89+ f"{ node_id } " : node for node_id , node in src_project_nodes .items ()
90+ }
91+ }
92+ destination = dst_project | {
93+ "workbench" : {
94+ f"{ node_id } " : node for node_id , node in dst_project_nodes .items ()
95+ }
96+ }
97+
8598 async_job_get , async_job_name = await copy_folders_from_project (
8699 rpc_client ,
87100 user_id = user_id ,
88101 product_name = product_name ,
89102 body = FoldersBody (
90- source = source_project , destination = dst_project , nodes_map = nodes_map
103+ source = source , destination = destination , nodes_map = nodes_map
91104 ),
92105 )
93106
@@ -132,7 +145,9 @@ async def test_copy_folders_from_non_existing_project(
132145 user_id ,
133146 product_name ,
134147 incorrect_src_project ,
148+ {},
135149 dst_project ,
150+ {},
136151 nodes_map = {},
137152 )
138153
@@ -144,7 +159,9 @@ async def test_copy_folders_from_non_existing_project(
144159 user_id ,
145160 product_name ,
146161 src_project ,
162+ {},
147163 incorrect_dst_project ,
164+ {},
148165 nodes_map = {},
149166 )
150167
@@ -167,7 +184,9 @@ async def test_copy_folders_from_empty_project(
167184 user_id ,
168185 product_name ,
169186 src_project ,
187+ {},
170188 dst_project ,
189+ {},
171190 nodes_map = {},
172191 )
173192 assert data == jsonable_encoder (dst_project )
@@ -234,25 +253,28 @@ async def test_copy_folders_from_valid_project_with_one_large_file(
234253 project_params
235254 )
236255 # 2. create a dst project without files
237- dst_project , _ , nodes_map = clone_project_data (src_project , src_project_nodes )
256+ dst_project , dst_project_nodes , nodes_map = clone_project_data (
257+ src_project , src_project_nodes
258+ )
238259 dst_project = await create_project (** dst_project )
239- # copy the project files
260+
240261 data = await _request_copy_folders (
241262 storage_rabbitmq_rpc_client ,
242263 user_id ,
243264 product_name ,
244265 src_project ,
266+ src_project_nodes ,
245267 dst_project ,
268+ dst_project_nodes ,
246269 nodes_map = nodes_map ,
247270 )
271+
248272 assert data == jsonable_encoder (
249273 await get_updated_project (sqlalchemy_async_engine , dst_project ["uuid" ])
250274 )
251275 # check that file meta data was effectively copied
252276 for src_node_id in src_projects_list :
253- dst_node_id = nodes_map .get (
254- TypeAdapter (NodeIDStr ).validate_python (f"{ src_node_id } " )
255- )
277+ dst_node_id = nodes_map .get (src_node_id )
256278 assert dst_node_id
257279 for src_file_id , src_file in src_projects_list [src_node_id ].items ():
258280 path : Any = src_file ["path" ]
@@ -333,26 +355,29 @@ async def test_copy_folders_from_valid_project(
333355 project_params
334356 )
335357 # 2. create a dst project without files
336- dst_project , _ , nodes_map = clone_project_data (src_project , src_project_nodes )
358+ dst_project , dst_project_nodes , nodes_map = clone_project_data (
359+ src_project , src_project_nodes
360+ )
337361 dst_project = await create_project (** dst_project )
338362 # copy the project files
339363 data = await _request_copy_folders (
340364 storage_rabbitmq_rpc_client ,
341365 user_id ,
342366 product_name ,
343367 src_project ,
368+ src_project_nodes ,
344369 dst_project ,
370+ dst_project_nodes ,
345371 nodes_map = nodes_map ,
346372 )
373+ data .pop ("workbench" , None ) # remove workbench from the data
347374 assert data == jsonable_encoder (
348375 await get_updated_project (sqlalchemy_async_engine , dst_project ["uuid" ])
349376 )
350377
351378 # check that file meta data was effectively copied
352379 for src_node_id in src_projects_list :
353- dst_node_id = nodes_map .get (
354- TypeAdapter (NodeIDStr ).validate_python (f"{ src_node_id } " )
355- )
380+ dst_node_id = nodes_map .get (src_node_id )
356381 assert dst_node_id
357382 for src_file_id , src_file in src_projects_list [src_node_id ].items ():
358383 path : Any = src_file ["path" ]
@@ -389,23 +414,29 @@ async def _create_and_delete_folders_from_project(
389414 * ,
390415 client_timeout : datetime .timedelta = datetime .timedelta (seconds = 60 ),
391416) -> None :
392- destination_project , _ , nodes_map = clone_project_data (project , project_nodes )
393- await project_db_creator (** destination_project )
417+ dst_project , dst_project_nodes , nodes_map = clone_project_data (
418+ project , project_nodes
419+ )
420+ await project_db_creator (** dst_project )
394421
395422 # creating a copy
396423 data = await _request_copy_folders (
397424 rpc_client ,
398425 user_id ,
399426 product_name ,
400427 project ,
401- destination_project ,
428+ project_nodes ,
429+ dst_project ,
430+ dst_project_nodes ,
402431 nodes_map = nodes_map ,
403432 client_timeout = client_timeout ,
404433 )
405434
435+ data .pop ("workbench" , None ) # remove workbench from the data
436+
406437 # data should be equal to the destination project, and all store entries should point to simcore.s3
407438 # NOTE: data is jsonized where destination project is not!
408- assert jsonable_encoder (destination_project ) == data
439+ assert jsonable_encoder (dst_project ) == data
409440
410441 project_id = data ["uuid" ]
411442
0 commit comments