@@ -1144,6 +1144,144 @@ def test_process_records(self, mock_dask_bag_map_parts: MagicMock):
11441144 self .basic_job ._process_records (example_records )
11451145 mock_dask_bag_map_parts .assert_called ()
11461146
1147+ @patch (
1148+ "aind_data_asset_indexer.aind_bucket_indexer."
1149+ "download_json_file_from_s3"
1150+ )
1151+ @patch ("aind_data_asset_indexer.aind_bucket_indexer.does_s3_object_exist" )
1152+ def test_get_data_level_for_prefix (
1153+ self ,
1154+ mock_does_s3_object_exist : MagicMock ,
1155+ mock_download_json_file_from_s3 : MagicMock ,
1156+ ):
1157+ """Tests _get_data_level_for_prefix method."""
1158+ mock_s3_client = MagicMock ()
1159+ mock_does_s3_object_exist .return_value = True
1160+ mock_download_json_file_from_s3 .return_value = self .example_md_record1 [
1161+ "data_description"
1162+ ]
1163+
1164+ prefix = "ecephys_642478_2023-01-17_13-56-29"
1165+ data_level = self .basic_job ._get_data_level_for_prefix (
1166+ s3_client = mock_s3_client ,
1167+ bucket = self .basic_job .job_settings .s3_bucket ,
1168+ prefix = prefix ,
1169+ )
1170+ self .assertEqual ("raw" , data_level )
1171+ mock_does_s3_object_exist .assert_called_once_with (
1172+ s3_client = mock_s3_client ,
1173+ bucket = self .basic_job .job_settings .s3_bucket ,
1174+ key = f"{ prefix } /data_description.json" ,
1175+ )
1176+ mock_download_json_file_from_s3 .assert_called_once_with (
1177+ s3_client = mock_s3_client ,
1178+ bucket = self .basic_job .job_settings .s3_bucket ,
1179+ object_key = f"{ prefix } /data_description.json" ,
1180+ )
1181+
1182+ @patch (
1183+ "aind_data_asset_indexer.aind_bucket_indexer."
1184+ "download_json_file_from_s3"
1185+ )
1186+ @patch ("aind_data_asset_indexer.aind_bucket_indexer.does_s3_object_exist" )
1187+ def test_get_data_level_for_prefix_no_file (
1188+ self ,
1189+ mock_does_s3_object_exist : MagicMock ,
1190+ mock_download_json_file_from_s3 : MagicMock ,
1191+ ):
1192+ """Tests _get_data_level_for_prefix method when there is no
1193+ data_description file."""
1194+ mock_s3_client = MagicMock ()
1195+ mock_does_s3_object_exist .return_value = False
1196+
1197+ prefix = "ecephys_642478_2023-01-17_13-56-29"
1198+ data_level = self .basic_job ._get_data_level_for_prefix (
1199+ s3_client = mock_s3_client ,
1200+ bucket = self .basic_job .job_settings .s3_bucket ,
1201+ prefix = prefix ,
1202+ )
1203+ self .assertEqual (None , data_level )
1204+ mock_download_json_file_from_s3 .assert_not_called ()
1205+
1206+ @patch (
1207+ "aind_data_asset_indexer.aind_bucket_indexer."
1208+ "download_json_file_from_s3"
1209+ )
1210+ @patch ("aind_data_asset_indexer.aind_bucket_indexer.does_s3_object_exist" )
1211+ def test_get_data_level_for_prefix_invalid_file (
1212+ self ,
1213+ mock_does_s3_object_exist : MagicMock ,
1214+ mock_download_json_file_from_s3 : MagicMock ,
1215+ ):
1216+ """Tests _get_data_level_for_prefix method when the data_description
1217+ file is not valid json."""
1218+ mock_s3_client = MagicMock ()
1219+ mock_does_s3_object_exist .return_value = True
1220+ mock_download_json_file_from_s3 .return_value = None
1221+
1222+ prefix = "ecephys_642478_2023-01-17_13-56-29"
1223+ data_level = self .basic_job ._get_data_level_for_prefix (
1224+ s3_client = mock_s3_client ,
1225+ bucket = self .basic_job .job_settings .s3_bucket ,
1226+ prefix = prefix ,
1227+ )
1228+ self .assertEqual (None , data_level )
1229+
1230+ @patch (
1231+ "aind_data_asset_indexer.aind_bucket_indexer."
1232+ "upload_metadata_json_str_to_s3"
1233+ )
1234+ @patch (
1235+ "aind_data_asset_indexer.aind_bucket_indexer."
1236+ "cond_copy_then_sync_core_json_files"
1237+ )
1238+ @patch (
1239+ "aind_data_asset_indexer.aind_bucket_indexer."
1240+ "build_metadata_record_from_prefix"
1241+ )
1242+ @patch (
1243+ "aind_data_asset_indexer.aind_bucket_indexer.AindIndexBucketJob"
1244+ "._get_data_level_for_prefix"
1245+ )
1246+ @patch ("aind_data_asset_indexer.aind_bucket_indexer.does_s3_object_exist" )
1247+ @patch ("aind_data_asset_indexer.aind_bucket_indexer.MetadataDbClient" )
1248+ @patch ("boto3.client" )
1249+ def test_process_prefix_no_record_no_file_derived_no (
1250+ self ,
1251+ mock_s3_client : MagicMock ,
1252+ mock_docdb_client : MagicMock ,
1253+ mock_does_s3_object_exist : MagicMock ,
1254+ mock_get_data_level_for_prefix : MagicMock ,
1255+ mock_build_metadata_record_from_prefix : MagicMock ,
1256+ mock_cond_copy_then_sync_core_json_files : MagicMock ,
1257+ mock_upload_metadata_json_str_to_s3 : MagicMock ,
1258+ ):
1259+ """Tests _process_prefix method when there is no record in DocDb,
1260+ there is no metadata.nd.json file in S3, and the
1261+ asset data level is not derived."""
1262+
1263+ mock_does_s3_object_exist .return_value = False
1264+ mock_get_data_level_for_prefix .return_value = "raw"
1265+ mock_build_metadata_record_from_prefix .return_value = None
1266+
1267+ location_to_id_map = dict ()
1268+ with self .assertLogs (level = "DEBUG" ) as captured :
1269+ self .basic_job ._process_prefix (
1270+ s3_prefix = "ecephys_642478_2023-01-17_13-56-29" ,
1271+ docdb_client = mock_docdb_client ,
1272+ s3_client = mock_s3_client ,
1273+ location_to_id_map = location_to_id_map ,
1274+ )
1275+ expected_log_messages = [
1276+ "INFO:root:Metadata record for "
1277+ "s3://aind-ephys-data-dev-u5u0i5/"
1278+ "ecephys_642478_2023-01-17_13-56-29 not found in S3 and data "
1279+ "level is not derived. Skipping."
1280+ ]
1281+ self .assertEqual (expected_log_messages , captured .output )
1282+ mock_cond_copy_then_sync_core_json_files .assert_not_called ()
1283+ mock_upload_metadata_json_str_to_s3 .assert_not_called ()
1284+
11471285 @patch (
11481286 "aind_data_asset_indexer.aind_bucket_indexer."
11491287 "upload_metadata_json_str_to_s3"
@@ -1156,6 +1294,10 @@ def test_process_records(self, mock_dask_bag_map_parts: MagicMock):
11561294 "aind_data_asset_indexer.aind_bucket_indexer."
11571295 "build_metadata_record_from_prefix"
11581296 )
1297+ @patch (
1298+ "aind_data_asset_indexer.aind_bucket_indexer.AindIndexBucketJob."
1299+ "_get_data_level_for_prefix"
1300+ )
11591301 @patch ("aind_data_asset_indexer.aind_bucket_indexer.does_s3_object_exist" )
11601302 @patch ("aind_data_asset_indexer.aind_bucket_indexer.MetadataDbClient" )
11611303 @patch ("boto3.client" )
@@ -1164,6 +1306,7 @@ def test_process_prefix_no_record_no_file_build_no(
11641306 mock_s3_client : MagicMock ,
11651307 mock_docdb_client : MagicMock ,
11661308 mock_does_s3_object_exist : MagicMock ,
1309+ mock_get_data_level_for_prefix : MagicMock ,
11671310 mock_build_metadata_record_from_prefix : MagicMock ,
11681311 mock_cond_copy_then_sync_core_json_files : MagicMock ,
11691312 mock_upload_metadata_json_str_to_s3 : MagicMock ,
@@ -1173,6 +1316,7 @@ def test_process_prefix_no_record_no_file_build_no(
11731316 build_metadata_record_from_prefix returns a None."""
11741317
11751318 mock_does_s3_object_exist .return_value = False
1319+ mock_get_data_level_for_prefix .return_value = "derived"
11761320 mock_build_metadata_record_from_prefix .return_value = None
11771321
11781322 location_to_id_map = dict ()
@@ -1204,6 +1348,10 @@ def test_process_prefix_no_record_no_file_build_no(
12041348 "aind_data_asset_indexer.aind_bucket_indexer."
12051349 "build_metadata_record_from_prefix"
12061350 )
1351+ @patch (
1352+ "aind_data_asset_indexer.aind_bucket_indexer.AindIndexBucketJob."
1353+ "_get_data_level_for_prefix"
1354+ )
12071355 @patch ("aind_data_asset_indexer.aind_bucket_indexer.does_s3_object_exist" )
12081356 @patch ("aind_data_asset_indexer.aind_bucket_indexer.MetadataDbClient" )
12091357 @patch ("boto3.client" )
@@ -1212,6 +1360,7 @@ def test_process_prefix_no_record_no_file_build_yes(
12121360 mock_s3_client : MagicMock ,
12131361 mock_docdb_client : MagicMock ,
12141362 mock_does_s3_object_exist : MagicMock ,
1363+ mock_get_data_level_for_prefix : MagicMock ,
12151364 mock_build_metadata_record_from_prefix : MagicMock ,
12161365 mock_cond_copy_then_sync_core_json_files : MagicMock ,
12171366 mock_upload_metadata_json_str_to_s3 : MagicMock ,
@@ -1222,6 +1371,7 @@ def test_process_prefix_no_record_no_file_build_yes(
12221371
12231372 expected_prefix = "ecephys_642478_2023-01-17_13-56-29"
12241373 mock_does_s3_object_exist .return_value = False
1374+ mock_get_data_level_for_prefix .return_value = "derived"
12251375 mock_build_metadata_record_from_prefix .return_value = json .dumps (
12261376 self .example_md_record
12271377 )
0 commit comments