"""Tests for update_product_physical_supply_chain_metadata.""" from ows_product_physical.models import persister def test_update_product_physical_supply_chain_metadata_success( mocker, valid_placeholder_upc, db_release_id, valid_sale_start_date ): """It should delete existing metadata and recreate rows for carve-in stores.""" sale_start_date = valid_sale_start_date fields = { persister.field.UPC: valid_placeholder_upc, persister.field.SALE_START_DATE: sale_start_date, } mocker.patch.object( persister, 'get_carveins_for_upc', return_value=[738, 739, 740] ) delete_metadata = mocker.patch.object( persister.ProductPhysicalSupplyChainMetadata, 'delete_supply_chain_metadata_by_product' ) set_metadata = mocker.patch.object( persister.ProductPhysicalSupplyChainMetadata, 'set_physical_supply_chain_metadata' ) resp = persister.update_product_physical_supply_chain_metadata( fields, db_release_id ) assert resp.status == 200 delete_metadata.assert_called_once_with(db_release_id) set_metadata.assert_called_once_with( db_release_id, { 'metadata': [ { 'store_id': 738, 'sale_start_date': sale_start_date, 'product_id': db_release_id, }, { 'store_id': 739, 'sale_start_date': sale_start_date, 'product_id': db_release_id, }, { 'store_id': 740, 'sale_start_date': sale_start_date, 'product_id': db_release_id, }, ] } ) def test_update_product_physical_supply_chain_metadata_failure_on_delete( mocker, valid_placeholder_upc, db_release_id, valid_sale_start_date ): """It should return error response when delete fails.""" fields = { persister.field.UPC: valid_placeholder_upc, persister.field.SALE_START_DATE: valid_sale_start_date, } exception = persister.exc.SQLAlchemyError() mocker.patch.object( persister, 'get_carveins_for_upc', return_value=[738, 739, 740] ) mocker.patch.object( persister.ProductPhysicalSupplyChainMetadata, 'delete_supply_chain_metadata_by_product', side_effect=exception ) set_metadata = mocker.patch.object( persister.ProductPhysicalSupplyChainMetadata, 'set_physical_supply_chain_metadata' ) capture_exception = mocker.patch.object( persister.sentry_sdk, 'capture_exception' ) create_error_response = mocker.patch.object( persister, 'create_error_response' ) resp = persister.update_product_physical_supply_chain_metadata( fields, db_release_id ) capture_exception.assert_called_once_with(exception) create_error_response.assert_called_once_with( code=persister.error.INTERNAL_ERROR, message='mysql error', status=500, ) set_metadata.assert_not_called() assert resp == create_error_response.return_value def test_update_product_physical_supply_chain_metadata_failure_on_insert( mocker, valid_placeholder_upc, db_release_id, valid_sale_start_date ): """It should return error response when insert fails.""" sale_start_date = valid_sale_start_date fields = { persister.field.UPC: valid_placeholder_upc, persister.field.SALE_START_DATE: sale_start_date, } exception = persister.exc.DBAPIError(None, None, None) mocker.patch.object( persister, 'get_carveins_for_upc', return_value=[738, 739, 740] ) delete_metadata = mocker.patch.object( persister.ProductPhysicalSupplyChainMetadata, 'delete_supply_chain_metadata_by_product' ) mocker.patch.object( persister.ProductPhysicalSupplyChainMetadata, 'set_physical_supply_chain_metadata', side_effect=exception ) capture_exception = mocker.patch.object( persister.sentry_sdk, 'capture_exception' ) create_error_response = mocker.patch.object( persister, 'create_error_response' ) resp = persister.update_product_physical_supply_chain_metadata( fields, db_release_id ) delete_metadata.assert_called_once_with(db_release_id) capture_exception.assert_called_once_with(exception) create_error_response.assert_called_once_with( code=persister.error.INTERNAL_ERROR, message='mysql error', status=500, ) assert resp == create_error_response.return_value