Skip to content

Commit

Permalink
merge: main->tsmith/5.1
Browse files Browse the repository at this point in the history
  • Loading branch information
Bento007 committed May 28, 2024
2 parents f4eef42 + 3b0a8a7 commit 2618fa7
Showing 1 changed file with 31 additions and 20 deletions.
51 changes: 31 additions & 20 deletions tests/unit/processing/test_spatial_assets_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,13 @@ def spatial_processor(s3_provider_mock):


@pytest.fixture
def output_folder():
return "test_output"
def asset_folder():
return "test_asset_folder"


@pytest.fixture
def dataset_version_id():
return "test_dataset_version_id"


@pytest.fixture
Expand Down Expand Up @@ -191,7 +196,7 @@ def test__crop_to_aspect_ratio(spatial_processor, width, height):
), "Crop is not centered correctly"


def test__generate_deep_zoom_assets(spatial_processor, output_folder, mocker):
def test__generate_deep_zoom_assets(spatial_processor, asset_folder, mocker):
"""
Test the method to generate deep zoom assets
"""
Expand All @@ -202,7 +207,7 @@ def test__generate_deep_zoom_assets(spatial_processor, output_folder, mocker):
mock_new_from_memory.return_value = mock_image

with tempfile.TemporaryDirectory() as temp_dir:
assets_folder = os.path.join(temp_dir, output_folder)
assets_folder = os.path.join(temp_dir, asset_folder)
os.makedirs(assets_folder)
spatial_processor._generate_deep_zoom_assets(test_image_array, assets_folder)

Expand All @@ -216,34 +221,36 @@ def test__generate_deep_zoom_assets(spatial_processor, output_folder, mocker):
mock_image.dzsave.assert_called_once_with(expected_output_path, suffix=".jpeg")


def test__upload_assets(spatial_processor, output_folder, mocker):
def test__upload_assets(spatial_processor, asset_folder, dataset_version_id, mocker):
"""
Test upload assets to S3
"""
mock_upload = mocker.patch.object(spatial_processor.s3_provider, "upload_directory")

spatial_processor._upload_assets(output_folder)
expected_s3_uri = f"s3://{spatial_processor.bucket_name}/{spatial_processor.asset_directory}/{output_folder}"
spatial_processor._upload_assets(asset_folder, dataset_version_id)
expected_s3_uri = f"s3://{spatial_processor.bucket_name}/{spatial_processor.asset_directory}/{dataset_version_id}"

# verify that upload_directory was called correctly
mock_upload.assert_called_once_with(output_folder, expected_s3_uri)
mock_upload.assert_called_once_with(asset_folder, expected_s3_uri)


def test__upload_assets_failure(spatial_processor, output_folder, mocker):
def test__upload_assets_failure(spatial_processor, asset_folder, dataset_version_id, mocker):
"""
Test upload assets to S3 when the upload fails
"""
mock_upload = mocker.patch.object(spatial_processor.s3_provider, "upload_directory")
mock_upload.side_effect = Exception("Failed to upload")

with pytest.raises(Exception, match="Failed to upload"):
spatial_processor._upload_assets(output_folder)
spatial_processor._upload_assets(asset_folder, dataset_version_id)

expected_s3_uri = f"s3://{spatial_processor.bucket_name}/{spatial_processor.asset_directory}/{output_folder}"
mock_upload.assert_called_once_with(output_folder, expected_s3_uri)
expected_s3_uri = f"s3://{spatial_processor.bucket_name}/{spatial_processor.asset_directory}/{dataset_version_id}"
mock_upload.assert_called_once_with(asset_folder, expected_s3_uri)


def test__create_deep_zoom_assets(spatial_processor, cxg_container, valid_spatial_data, mocker, tmpdir):
def test__create_deep_zoom_assets(
spatial_processor, cxg_container, valid_spatial_data, dataset_version_id, mocker, tmpdir
):
mock_fetch_image = mocker.patch.object(spatial_processor, "_fetch_image")
mock_process_and_flip_image = mocker.patch.object(spatial_processor, "_process_and_flip_image")
mock_generate_deep_zoom_assets = mocker.patch.object(spatial_processor, "_generate_deep_zoom_assets")
Expand All @@ -258,18 +265,20 @@ def test__create_deep_zoom_assets(spatial_processor, cxg_container, valid_spatia
mock_process_and_flip_image.return_value = np.random.randint(0, 255, (100, 100, 3), dtype=np.uint8)

# call the method under test
spatial_processor.create_deep_zoom_assets(cxg_container, valid_spatial_data)
spatial_processor.create_deep_zoom_assets(cxg_container, valid_spatial_data, dataset_version_id)

assets_folder = os.path.join(tmpdir, cxg_container.replace(".cxg", ""))

# assertions to ensure each step is called
mock_fetch_image.assert_called_once_with(valid_spatial_data)
mock_process_and_flip_image.assert_called_once_with(mock_fetch_image.return_value[0])
mock_generate_deep_zoom_assets.assert_called_once_with(mock_process_and_flip_image.return_value, assets_folder)
mock_upload_assets.assert_called_once_with(assets_folder)
mock_upload_assets.assert_called_once_with(assets_folder, dataset_version_id)


def test__create_deep_zoom_assets_exception(spatial_processor, cxg_container, valid_spatial_data, mocker):
def test__create_deep_zoom_assets_exception(
spatial_processor, cxg_container, valid_spatial_data, dataset_version_id, mocker
):
mock_fetch_image = mocker.patch.object(spatial_processor, "_fetch_image")
mock_process_and_flip_image = mocker.patch.object(spatial_processor, "_process_and_flip_image")
mock_generate_deep_zoom_assets = mocker.patch.object(spatial_processor, "_generate_deep_zoom_assets")
Expand All @@ -280,15 +289,17 @@ def test__create_deep_zoom_assets_exception(spatial_processor, cxg_container, va

# assert that the method raises an exception
with pytest.raises(Exception, match="Test exception"):
spatial_processor.create_deep_zoom_assets(cxg_container, valid_spatial_data)
spatial_processor.create_deep_zoom_assets(cxg_container, valid_spatial_data, dataset_version_id)

mock_fetch_image.assert_called_once_with(valid_spatial_data)
mock_process_and_flip_image.assert_not_called()
mock_generate_deep_zoom_assets.assert_not_called()
mock_upload_assets.assert_not_called()


def test__convert_uns_to_cxg_group(cxg_container, valid_uns, group_metadata_name, ctx, mock_spatial_processor, mocker):
def test__convert_uns_to_cxg_group(
cxg_container, valid_uns, group_metadata_name, ctx, mock_spatial_processor, dataset_version_id, mocker
):
mock_from_numpy = mocker.patch("backend.layers.processing.utils.cxg_generation_utils.tiledb.from_numpy")
mock_tiledb_open = mocker.patch(
"backend.layers.processing.utils.cxg_generation_utils.tiledb.open", mocker.mock_open()
Expand All @@ -301,7 +312,7 @@ def test__convert_uns_to_cxg_group(cxg_container, valid_uns, group_metadata_name
mock_metadata_array = mock_tiledb_open.return_value.__enter__.return_value
mock_metadata_array.meta = {}

convert_uns_to_cxg_group(cxg_container, valid_uns, group_metadata_name, ctx)
convert_uns_to_cxg_group(cxg_container, valid_uns, dataset_version_id, group_metadata_name, ctx)

# check if from_numpy is called correctly
mock_from_numpy.assert_called_once_with(f"{cxg_container}/{group_metadata_name}", np.zeros((1,)))
Expand All @@ -325,5 +336,5 @@ def test__convert_uns_to_cxg_group(cxg_container, valid_uns, group_metadata_name

# check if create_deep_zoom_assets is called correctly
mock_spatial_processor.create_deep_zoom_assets.assert_called_once_with(
cxg_container, valid_uns["spatial"]["library_id_1"]
cxg_container, valid_uns["spatial"]["library_id_1"], dataset_version_id
)

0 comments on commit 2618fa7

Please sign in to comment.