@@ -520,6 +520,25 @@ async def test_http_check_bucket_connected(
520520 )
521521
522522
523+ def _get_paths_with_prefix (
524+ uploaded_files : list [UploadedFile ], prefix_level : int , path_prefix : Path
525+ ) -> tuple [set [Path ], set [Path ]]:
526+ def _filter_by_prefix (uploaded_file : UploadedFile ) -> bool :
527+ return Path (uploaded_file .s3_key ).is_relative_to (path_prefix )
528+
529+ directories = {
530+ Path (file .s3_key ).parents [prefix_level ]
531+ for file in filter (_filter_by_prefix , uploaded_files )
532+ if Path (file .s3_key ).parent != path_prefix
533+ }
534+ files = {
535+ Path (file .s3_key )
536+ for file in filter (_filter_by_prefix , uploaded_files )
537+ if Path (file .s3_key ).parent == path_prefix
538+ }
539+ return directories , files
540+
541+
523542@pytest .mark .parametrize (
524543 "directory_size, min_file_size, max_file_size" ,
525544 [
@@ -537,72 +556,53 @@ async def test_list_objects(
537556 with_uploaded_folder_on_s3 : list [UploadedFile ],
538557 simcore_s3_api : SimcoreS3API ,
539558):
540- # Start testing from the root, will return only 1 object (the top level folder)
559+ # assert pre-conditions
541560 assert len (with_uploaded_folder_on_s3 ) >= 1 , "wrong initialization of test!"
542561 top_level_paths = {
543562 Path (file .s3_key ).parents [- 2 ] for file in with_uploaded_folder_on_s3
544563 }
545- assert len (top_level_paths ) == 1
564+ assert (
565+ len (top_level_paths ) == 1
566+ ), "wrong initialization of test! we expect only one folder here"
546567
547- received_objects = await simcore_s3_api .list_objects (
568+ # Start testing from the root, will return only 1 object (the top level folder)
569+ objects = await simcore_s3_api .list_objects (
548570 bucket = with_s3_bucket , prefix = None , start_after = None
549571 )
550- assert len (received_objects ) == len (top_level_paths )
551-
552- listed_object_paths = {obj .as_path () for obj in received_objects }
553- assert listed_object_paths == top_level_paths
572+ assert len (objects ) == len (top_level_paths )
573+ assert {_ .as_path () for _ in objects } == top_level_paths
554574
555575 # go one level deeper, will return all the folders + files in the first level
556576 first_level_prefix = next (iter (top_level_paths ))
557- first_level_directories = {
558- Path (file .s3_key ).parents [- 3 ]
559- for file in with_uploaded_folder_on_s3
560- if Path (file .s3_key ).parent != first_level_prefix
561- }
562- first_level_files = {
563- Path (file .s3_key )
564- for file in with_uploaded_folder_on_s3
565- if Path (file .s3_key ).parent == first_level_prefix
566- }
577+ first_level_directories , first_level_files = _get_paths_with_prefix (
578+ with_uploaded_folder_on_s3 , - 3 , path_prefix = first_level_prefix
579+ )
567580 first_level_paths = first_level_directories | first_level_files
568581
569- received_objects = await simcore_s3_api .list_objects (
582+ objects = await simcore_s3_api .list_objects (
570583 bucket = with_s3_bucket , prefix = first_level_prefix , start_after = None
571584 )
572- assert len (received_objects ) == len (first_level_paths )
573- listed_object_paths = {obj .as_path () for obj in received_objects }
574- assert first_level_paths == listed_object_paths
575- # split the received objects into files and directories
576- received_files = {obj for obj in received_objects if isinstance (obj , S3MetaData )}
577- received_directories = {
578- obj for obj in received_objects if isinstance (obj , S3DirectoryMetaData )
579- }
585+ assert len (objects ) == len (first_level_paths )
586+ assert {_ .as_path () for _ in objects } == first_level_paths
587+ # check files and directories are correctly separated
588+ received_files = {_ for _ in objects if isinstance (_ , S3MetaData )}
589+ received_directories = {_ for _ in objects if isinstance (_ , S3DirectoryMetaData )}
580590 assert len (received_files ) == len (first_level_files )
581591 assert len (received_directories ) == len (first_level_directories )
582592
583- # we go one more level down
593+ # we go one more level down under a random first-level directory
584594 second_level_prefix = random .choice (list (first_level_directories )) # noqa: S311
585-
586- def _filter_by_prefix (uploaded_file : UploadedFile ) -> bool :
587- return bool (f"{ second_level_prefix } " in uploaded_file .s3_key )
588-
589- second_level_directories = {
590- Path (file .s3_key ).parents [- 4 ]
591- for file in filter (_filter_by_prefix , with_uploaded_folder_on_s3 )
592- if Path (file .s3_key ).parent != second_level_prefix
593- }
594- second_level_files = {
595- Path (file .s3_key )
596- for file in filter (_filter_by_prefix , with_uploaded_folder_on_s3 )
597- if Path (file .s3_key ).parent == second_level_prefix
598- }
595+ second_level_directories , second_level_files = _get_paths_with_prefix (
596+ with_uploaded_folder_on_s3 , - 4 , path_prefix = second_level_prefix
597+ )
599598 second_level_paths = second_level_directories | second_level_files
600- received_objects = await simcore_s3_api .list_objects (
599+
600+ objects = await simcore_s3_api .list_objects (
601601 bucket = with_s3_bucket , prefix = second_level_prefix , start_after = None
602602 )
603- assert len (received_objects ) == len (second_level_paths )
604- listed_object_paths = {obj .as_path () for obj in received_objects }
605- assert second_level_paths == listed_object_paths
603+ assert len (objects ) == len (second_level_paths )
604+ received_paths = {obj .as_path () for obj in objects }
605+ assert second_level_paths == received_paths
606606
607607
608608async def test_get_file_metadata (
0 commit comments