"""Test asset helpers.""" from types import SimpleNamespace from unittest.mock import MagicMock, patch from ddex_ingester_common.graphql.asset_queries import ( CREATE_ASSET_UPLOAD_TOKEN, GET_ASSET_STATUS_V2_QUERY, GET_PRODUCT_TRACK_ASSETS_QUERY, SAVE_ASSET_INFO, VALID_ARTWORK_QUERY ) from ddex_ingester_common.helpers.asset import ( copy_asset, create_asset_token, get_asset_status_v2, get_product_track_assets, save_asset_metadata, valid_artwork ) import pytest def test_create_asset_token(): """Test create_asset_token passes correct queries and inputs.""" execute = MagicMock(return_value={ 'data': {'createAssetUploadToken': None} }) connector = MagicMock() connector.execute = execute asset_type = 'image' create_asset_token(connector, asset_type) execute.assert_called_once_with( CREATE_ASSET_UPLOAD_TOKEN, {'assetType': asset_type} ) def test_save_asset_metadata(): """Test save_asset_metadata passes correct queries and inputs.""" execute = MagicMock(return_value={ 'data': {'saveAssetInfo': None} }) connector = MagicMock() connector.execute = execute metadata = {'metadata': 'stuff'} save_asset_metadata(connector, metadata) execute.assert_called_once_with( SAVE_ASSET_INFO, metadata ) def test_get_asset_status_v2(): """Test get_asset_status_v2 passes correct queries and inputs.""" execute = MagicMock(return_value={ 'data': {'assetStatus': {'status': 'new'}} }) connector = MagicMock() connector.execute = execute filename = 'image.tif' get_asset_status_v2(connector, filename) execute.assert_called_once_with( GET_ASSET_STATUS_V2_QUERY, {'filename': filename} ) def test_get_asset_status_v2_missing_status(): """Test get_asset_status_v2 response when status is missing.""" execute = MagicMock(return_value={ 'data': {'assetStatus': None} }) connector = MagicMock() connector.execute = execute filename = 'image.tif' output = get_asset_status_v2(connector, filename) execute.assert_called_once_with( GET_ASSET_STATUS_V2_QUERY, {'filename': filename} ) assert not output @pytest.mark.parametrize('useV2', [ True, False ]) def test_get_product_track_assets(useV2): """Test get_product_track_assets passes correct queries and inputs.""" execute = MagicMock(return_value={ 'data': { 'productTrackAssets': { 'assets': [ { 'status': 'finished' } ] } } }) connector = MagicMock() connector.execute = execute product_id = 12345 get_product_track_assets(connector, product_id, useV2) execute.assert_called_once_with( GET_PRODUCT_TRACK_ASSETS_QUERY, { 'productId': product_id, 'useV2': useV2 } ) @patch('ddex_ingester_common.helpers.asset.client') def test_copy_asset(mock_client): """Test copy_asset handles function inputs correctly.""" mock_s3_copy = MagicMock() mock_s3_client = MagicMock() mock_s3_client.copy = mock_s3_copy mock_client.return_value = mock_s3_client metadata = MagicMock() asset = SimpleNamespace() asset.bucket = 'source_bucket' asset.key = 'source_folder/source_file.tif' bucket = 'destination_bucket' filename = 'uuid.tif' copy_asset(metadata, asset, bucket, filename) mock_s3_copy.assert_called_once_with( Bucket=bucket, Key=filename, CopySource={ 'Bucket': asset.bucket, 'Key': asset.key }, ExtraArgs={ 'Metadata': metadata, 'MetadataDirective': 'REPLACE', 'ContentType': 'image/tiff', }, ) def test_valid_artwork(): """Test valid_artwork passes correct queries and inputs.""" execute = MagicMock(return_value={ 'data': { 'validArtwork': True } }) connector = MagicMock() connector.execute = execute product_id = 12345 valid_artwork(connector, product_id, True) execute.assert_called_once_with( VALID_ARTWORK_QUERY, {'productId': product_id, 'requireV1': True} )