"""Tests for VideoSingleHandler.""" from mock import Mock, patch import pytest from switchboard_consumer.constants.exceptions import \ ParticipantHandlerError, ParticipantHandlerGraphQLError from switchboard_consumer.logic.product_metadata_update import AudioHandler @pytest.fixture() def mock_data(): return { 'labelAccount': { 'companyCode': '12345' }, 'subAccount': None, 'productTracks': [] } @patch( 'switchboard_consumer.logic.validation.product.validate.' 'validate_product') def test_validate_audio_product( mock_validate_product, mock_logger, orchard_client, swb_client, mock_data): """Test for successful validation.""" mock_message = Mock() mock_message.sending_system_local_id = {} mock_validate_product.return_value = [] handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) handler.validate() assert handler.validation_errors == [] @patch('switchboard_consumer.logic.product_metadata_update.' 'release_correct_product') @patch('switchboard_consumer.logic.email.ses.send_email') def test_update_via_release_correction( mock_send_email, mock_release_correct_product, mock_logger, orchard_client, swb_client, mock_data): mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } mock_processing_result = [Mock('processing_result')] mock_release_correct_product.return_value = mock_processing_result handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.update_via_release_correction('12345') assert result is True assert handler.processing_results[0] == mock_processing_result[0] mock_release_correct_product.assert_called_once() @patch('switchboard_consumer.logic.product_metadata_update.' 'format_update_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'update_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'process_product_tracks_update') def test_update_in_progress_product_success( mock_process_product_tracks_update, mock_update_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, mock_data): """Test for correct product update.""" mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_update_message = { 'ids': [{ 'localId': 12345, 'system': 'ORCHARD' }], 'errors': [] } mock_update_product.return_value = product_update_message track_processing_results = [ Mock('track_processing_result_1'), Mock('track_processing_result_2')] mock_format_update_product_input.return_value = Mock('formatted_input') mock_process_product_tracks_update.return_value = ( True, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.update_in_progress_product(12345) assert result is True assert handler.processing_results == ( [product_update_message] + track_processing_results) @patch('switchboard_consumer.logic.product_metadata_update.' 'format_update_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'update_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'process_product_tracks_update') def test_update_in_progress_product_tracks_failure( mock_process_product_tracks_update, mock_update_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, mock_data): """Test for fail on tracks update.""" mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_update_message = { 'ids': [{ 'localId': 12345, 'system': 'ORCHARD' }], 'errors': [] } mock_update_product.return_value = product_update_message track_processing_results = [ Mock('track_processing_result_1'), Mock('track_processing_result_2')] mock_format_update_product_input.return_value = Mock('formatted_input') mock_process_product_tracks_update.return_value = ( False, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.update_in_progress_product(12345) assert result is False assert handler.processing_results == ( [product_update_message] + track_processing_results) @patch('switchboard_consumer.logic.product_metadata_update.' 'format_update_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'update_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'process_product_tracks_update') def test_update_in_progress_product_product_failure( mock_process_product_tracks_update, mock_update_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, mock_data): """Test for fail on product update.""" mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_update_message = { 'ids': [{ 'localId': 12345, 'system': 'ORCHARD' }], 'errors': [{ 'code': 'some_error_code', 'message': 'some_error_message' }] } mock_update_product.return_value = product_update_message track_processing_results = [ Mock('track_processing_result_1'), Mock('track_processing_result_2')] mock_format_update_product_input.return_value = Mock('formatted_input') mock_process_product_tracks_update.return_value = ( True, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.update_in_progress_product(12345) assert result is False assert handler.processing_results == [product_update_message] @patch('switchboard_consumer.logic.product_metadata_update.' 'format_update_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'update_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'process_product_tracks_update') def test_update_in_progress_product_dummy_success( mock_process_product_tracks_update, mock_update_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, mock_data): """Test for correct product update for dummy product.""" mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_update_message = { 'ids': [{ 'localId': 12345, 'system': 'ORCHARD' }, { 'localId': 12345, 'system': 'SONY' }, ], 'errors': [] } mock_update_product.return_value = product_update_message track_processing_results = [ Mock('track_processing_result_1'), Mock('track_processing_result_2')] mock_format_update_product_input.return_value = Mock('formatted_input') mock_process_product_tracks_update.return_value = ( True, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) handler.dummy_product_id = 12345 result = handler.update_in_progress_product(12345) assert result is True assert handler.processing_results == ( [product_update_message] + track_processing_results) assert handler.swb_product_data['ids'] == product_update_message['ids'] @patch('switchboard_consumer.logic.product_metadata_update.' 'format_create_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_tracks') @patch('switchboard_consumer.logic.product_metadata_update.' 'format_switchboard_product_tracks_to_orchard_tracks_batch') @patch('switchboard_consumer.logic.product_metadata_update.' 'LabelParticipantHandler') @patch('switchboard_consumer.logic.product_metadata_update.' 'get_product_track_by_isrc') def test_create_product_success( mock_get_product_track_by_isrc, mock_label_participant, mock_create_tracks_payload, mock_create_tracks, mock_create_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, create_track_processing_result_fixture, mock_data): """Test for correct product create.""" participant_results = [Mock('participant1'), Mock('participant2')] mock_create_tracks_payload.return_value = ( participant_results, Mock('create_tracks_payload')) mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_create_result = Mock('create_product_result') mock_create_product.return_value = 12345, [product_create_result] mock_get_product_track_by_isrc.return_value = { 'track': { 'isrc': '12345', 'contributors': [] } } track_processing_results = [ create_track_processing_result_fixture, create_track_processing_result_fixture ] mock_format_update_product_input.return_value = Mock('formatted_input') mock_create_tracks.return_value = ( True, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.create_product() assert result is True assert handler.processing_results == ( participant_results + [product_create_result] + # noqa track_processing_results) @patch('switchboard_consumer.logic.product_metadata_update.' 'format_create_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_tracks') @patch('switchboard_consumer.logic.product_metadata_update.' 'format_switchboard_product_tracks_to_orchard_tracks_batch') @patch('switchboard_consumer.logic.product_metadata_update.' 'LabelParticipantHandler') def test_create_product_failure_on_product_create( mock_label_participant, mock_create_tracks_payload, mock_create_tracks, mock_create_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, mock_data): """Test for failure on product create.""" participant_results = [Mock('participant1'), Mock('participant2')] mock_create_tracks_payload.return_value = ( participant_results, Mock('create_tracks_payload')) mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_create_result = Mock('failure_product_result') mock_create_product.return_value = None, [product_create_result] track_processing_results = [ Mock('track_processing_result_1'), Mock('track_processing_result_2')] mock_format_update_product_input.return_value = Mock('formatted_input') mock_create_tracks.return_value = ( True, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.create_product() assert result is False assert handler.processing_results == ( participant_results + [product_create_result]) @patch('switchboard_consumer.logic.product_metadata_update.' 'format_create_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_tracks') @patch('switchboard_consumer.logic.product_metadata_update.' 'format_switchboard_product_tracks_to_orchard_tracks_batch') @patch('switchboard_consumer.logic.product_metadata_update.' 'LabelParticipantHandler') @patch('switchboard_consumer.logic.product_metadata_update.' 'get_product_track_by_isrc') def test_create_product_failure_on_tracks_create( mock_get_product_track_by_isrc, mock_label_participant, mock_create_tracks_payload, mock_create_tracks, mock_create_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, create_track_processing_result_fixture, mock_data): """Test for failure on tracks create.""" participant_results = [Mock('participant1'), Mock('participant2')] mock_create_tracks_payload.return_value = ( participant_results, Mock('create_tracks_payload')) mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_create_result = Mock('create_product_result') mock_create_product.return_value = 12345, [product_create_result] mock_get_product_track_by_isrc.return_value = { 'track': { 'isrc': '12345', 'contributors': [] } } track_processing_results = [ create_track_processing_result_fixture, create_track_processing_result_fixture] mock_format_update_product_input.return_value = Mock('formatted_input') mock_create_tracks.return_value = ( False, track_processing_results) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.create_product() assert result is False assert handler.processing_results == ( participant_results + [product_create_result] + # noqa track_processing_results) @patch('switchboard_consumer.logic.product_metadata_update.' 'format_create_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_tracks') @patch('switchboard_consumer.logic.product_metadata_update.' 'format_switchboard_product_tracks_to_orchard_tracks_batch') @patch('switchboard_consumer.logic.product_metadata_update.' 'LabelParticipantHandler.get_supported_roles') @patch('switchboard_consumer.logic.product_metadata_update.' 'get_product_track_by_isrc') @patch('switchboard_consumer.logic.product_metadata_update.' 'LabelParticipantHandler.create_label_participants') def test_create_product_failure_on_track_label_participant( mock_create_label_participants, mock_get_product_track_by_isrc, mock_label_participant, mock_create_tracks_payload, mock_create_tracks, mock_create_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, create_track_processing_result_fixture, mock_data): """ Test failures handled when product track fails to create label participants """ participant_results = [Mock('participant1'), Mock('participant2')] mock_create_tracks_payload.return_value = ( participant_results, Mock('create_tracks_payload')) mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_create_result = Mock('create_product_result') mock_create_product.return_value = 12345, [product_create_result] mock_get_product_track_by_isrc.return_value = { 'track': { 'isrc': '12345', 'contributors': [] } } track_processing_results = [ create_track_processing_result_fixture ] mock_format_update_product_input.return_value = Mock('formatted_input') mock_create_tracks.return_value = ( True, track_processing_results) # An error occures when trying to create a label participant graphql_error = [{ 'extensions': { 'code': 'create_participant_error_code', }, 'message': 'An error message', }] mock_create_label_participants.side_effect = \ ParticipantHandlerGraphQLError('An error', graphql_error) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.create_product() assert result is False assert handler.processing_results[3]['errors'] @patch('switchboard_consumer.logic.product_metadata_update.' 'format_create_product_input') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_product') @patch('switchboard_consumer.logic.product_metadata_update.' 'create_tracks') @patch('switchboard_consumer.logic.product_metadata_update.' 'format_switchboard_product_tracks_to_orchard_tracks_batch') @patch('switchboard_consumer.logic.product_metadata_update.' 'LabelParticipantHandler') def test_create_product_success_no_tracks_payload( mock_label_participant, mock_create_tracks_payload, mock_create_tracks, mock_create_product, mock_format_update_product_input, mock_logger, orchard_client, swb_client, mock_data): """Test for correct product create.""" participant_results = [] mock_create_tracks_payload.return_value = ( participant_results, False) mock_message = Mock() mock_message.sending_system_local_id = { 'businessKey': 'SOME_UPC' } product_create_result = Mock('create_product_result') mock_create_product.return_value = 12345, [product_create_result] mock_format_update_product_input.return_value = Mock('formatted_input') handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.create_product() assert result is True assert handler.processing_results == [product_create_result] mock_create_tracks.assert_not_called() @patch('switchboard_consumer.logic.product_metadata_update.' 'ProductParticipantHandler.__init__', return_value=None) @patch('switchboard_consumer.logic.product_metadata_update.' 'ProductParticipantHandler.process',) def test_process_participants_success( mock_process_participants, mock_init_participant_handler, mock_logger, orchard_client, swb_client, mock_data): """Test for success of processing participants.""" mock_message = Mock() mock_message.sending_system_local_id = {} participant_results = [ Mock('participant_result_1'), Mock('participant_result_2')] artists = [Mock('artist_1'), Mock('artist_2')] mock_process_participants.return_value = (participant_results, artists) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.process_participants() assert result is True assert handler.processing_results == participant_results assert handler.artists == artists @patch('switchboard_consumer.logic.product_metadata_update.' 'ProductParticipantHandler.__init__', return_value=None) @patch('switchboard_consumer.logic.product_metadata_update.' 'ProductParticipantHandler.process',) def test_process_participants_participant_handler_graphql_error( mock_process_participants, mock_init_participant_handler, mock_logger, orchard_client, swb_client, mock_data): """Test for success of processing participants.""" mock_message = Mock() mock_message.sending_system_local_id = {} mock_process_participants.side_effect = Mock( side_effect=ParticipantHandlerGraphQLError( 'Test error', [{ 'extensions': { 'code': 'create_participant_error_code', }, 'message': 'An error message'}])) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.process_participants() assert result is False assert handler.processing_results[0]['errors'] == [ { 'code': 'create_participant_error_code', 'message': 'An error message' } ] assert handler.artists == [] @patch('switchboard_consumer.logic.product_metadata_update.' 'ProductParticipantHandler.__init__', return_value=None) @patch('switchboard_consumer.logic.product_metadata_update.' 'ProductParticipantHandler.process',) def test_process_participants_participant_handler_error( mock_process_participants, mock_init_participant_handler, mock_logger, orchard_client, swb_client, mock_data): """Test for success of processing participants.""" mock_message = Mock() mock_message.sending_system_local_id = {} mock_process_participants.side_effect = Mock( side_effect=ParticipantHandlerError('Test error')) handler = AudioHandler( mock_data, mock_message, mock_logger, orchard_client, swb_client) result = handler.process_participants() assert result is False assert handler.processing_results[0]['errors'] == [ { 'code': 'daemon_exception', 'message': 'ParticipantHandlerError: Test error' } ] assert handler.artists == []