"""Tests for ProductParticpantHandlers.""" from mock import Mock, patch import pytest from switchboard_consumer.formatters.artist \ import format_artist_local_id, format_get_artist_id from switchboard_consumer.logic.participant.product_participant_handler \ import ProductParticipantHandler @pytest.mark.parametrize('data,expected', [ ([], False), ([ {'role': 'Primary'}, {'role': 'Featured'}, {'role': 'Featured'}, {'role': 'Featured'}, {'role': 'With'} ], True), ([ {'role': 'Primary'}, {'role': 'Featured'}, {'role': 'Unknown'}, {'role': 'Featured'}, {'role': 'With'} ], True), ([ {'role': 'Unknown'}, {'role': 'Invalid'}, {'role': 'Stuff'} ], False), ]) def test_validate_display_artist_members(data, expected, mock_logger, orchard_client, create_product_message): """Test validate display artist members.""" participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) actual = participant_handler._validate_display_artist_members(data) assert actual == expected @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=False) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_participant_with_no_orchard_mapping( mock_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message ): """Test handle participant with no orchard mapping.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = { 'owningSystem': 'SONY', 'displayArtist': { 'ids': [ { 'localId': '1156249', 'system': 'SONY', } ], 'name': 'DJ Christos', 'members': [] }, 'project': { 'labelAccount': { 'companyCode': '222222', }, 'subAccount': { 'companyCode': '333333', }, } } create_artist_results = { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] } expected_mapping = [ get_product_by_upc_data['displayArtist']['ids'][0], { 'localId': 'AIID:123', 'system': 'ORCHARD' } ] expected_formatted_artist = { 'artistInfoId': int(create_artist_results['artistId']), 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'primary_artist' } orchard_client.create_artist = Mock(return_value=create_artist_results) participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) # Setup a wrap participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) # We have no existing mapping so get artist should not be called mock_get_artist.assert_not_called() # Create artist should have been called once since one displayArtist participant_handler._create_artist.assert_called_once() # We have two lists one of artists and one of processing results assert len(processing_results) == 1 assert len(artists) == 1 assert processing_results[0].get('ids') == expected_mapping assert artists[0] == expected_formatted_artist @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_create_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=False) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_participant_with_orchard_mapping( mock_find_artists, mock_validate_display_artist_members, mock_create_artist, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message ): """Test handle participant with orchard mapping.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = { 'owningSystem': 'SONY', 'displayArtist': { 'ids': [ { 'localId': '1156249', 'system': 'SONY', }, { 'localId': 'AIID:123', 'system': 'ORCHARD', } ], 'name': 'DJ Christos', 'members': [] }, 'project': { 'labelAccount': { 'companyCode': '222222', }, 'subAccount': { 'companyCode': '333333', }, } } get_artist_results = { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] } expected_formatted_artist = { 'artistInfoId': int(get_artist_results['artistId']), 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'primary_artist' } mock_get_artist.return_value = get_artist_results vendor_id = \ get_product_by_upc_data['project']['labelAccount']['companyCode'] participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, vendor_id, None) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_called_once() mock_create_artist.assert_not_called() assert len(processing_results) == 0 assert len(artists) == 1 assert artists[0] == expected_formatted_artist @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=False) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_participant_with_invalid_orchard_mapping( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message ): """Test handle participant with invalid orchard mapping.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = { 'owningSystem': 'SONY', 'displayArtist': { 'ids': [ { 'localId': '1156249', 'system': 'SONY', }, { 'localId': 'AIID:123', 'system': 'ORCHARD', } ], 'name': 'DJ Christos', 'members': [] }, 'project': { 'labelAccount': { 'companyCode': '222222', }, 'subAccount': { 'companyCode': '333333', }, } } # Vendor ID different to target labelAccount get_artist_results = { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'artist', 'vendorId': '1234' } create_artist_results = { 'artistId': '1234', 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] } orchard_client.create_artist = Mock(return_value=create_artist_results) expected_formatted_artist = { 'artistInfoId': int(create_artist_results['artistId']), 'artistName': get_product_by_upc_data ['displayArtist']['name'], 'artistType': 'primary_artist' } expected_mapping = [ get_product_by_upc_data['displayArtist']['ids'][0], { 'localId': format_artist_local_id( create_artist_results['artistId']), 'system': 'ORCHARD' } ] mock_get_artist.return_value = get_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) # Setup a wrap for create artist function participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_called_once() participant_handler._create_artist.assert_called_once() assert len(processing_results) == 1 assert len(artists) == 1 assert processing_results[0].get('ids') == expected_mapping assert artists[0] == expected_formatted_artist @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_participant_members( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_data ): """Test member processing with no mappings and valid roles.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = product_with_valid_participant_member_data expected_mappings = [ [ get_product_by_upc_data['displayArtist']['members'][0] ['participant']['ids'][0], { 'localId': 'AIID:123', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['displayArtist']['members'][1] ['participant']['ids'][0], { 'localId': 'AIID:124', 'system': 'ORCHARD' } ] ] create_artist_results = [ { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[1]['artistId']), 'artistName': create_artist_results[1]['artistName'], 'artistType': 'featuring' } ] orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_not_called() participant_handler._create_artist.assert_called() assert len(processing_results) == 2 assert len(artists) == 2 for i in range(len(processing_results)): assert processing_results[i].get('ids') == expected_mappings[i] assert artists == expected_formatted_artists @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_participant_members_mixed_valid_roles( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_data ): """Test member processing with participant members with mixed roles.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = product_with_valid_participant_member_data # Add an extra member with invalid roles get_product_by_upc_data['displayArtist']['members'].append({ 'sequenceNumber': 3, 'role': 'Unknown', 'participant': { 'ids': [ { 'localId': '545454', 'system': 'SONY', } ], 'name': 'Invalid Participant' } }) expected_mappings = [ [ get_product_by_upc_data['displayArtist']['members'][0] ['participant']['ids'][0], { 'localId': 'AIID:123', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['displayArtist']['members'][1] ['participant']['ids'][0], { 'localId': 'AIID:124', 'system': 'ORCHARD' } ] ] create_artist_results = [ { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[1]['artistId']), 'artistName': create_artist_results[1]['artistName'], 'artistType': 'featuring' } ] orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_not_called() participant_handler._create_artist.assert_called() assert len(processing_results) == 2 assert len(artists) == 2 for i in range(len(processing_results)): assert processing_results[i].get('ids') == expected_mappings[i] assert artists == expected_formatted_artists @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_participant_mixed_existing_mapping( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_data ): """Test member processing with participant that is already mapped.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = product_with_valid_participant_member_data vendor_id = \ get_product_by_upc_data['project']['labelAccount']['companyCode'] # Add an orchard mapping to one of our participant members (get_product_by_upc_data['displayArtist']['members'][0] ['participant']['ids'].append( {'localId': 'AIID:430404', 'system': 'ORCHARD'} )) expected_mappings = [ [ get_product_by_upc_data['displayArtist']['members'][1] ['participant']['ids'][0], { 'localId': 'AIID:124', 'system': 'ORCHARD' } ] ] create_artist_results = [ { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': format_get_artist_id( get_product_by_upc_data['displayArtist'] ['members'][0]['participant']['ids'] [1]['localId']), 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'featuring' } ] get_artist_results = { 'artistId': get_product_by_upc_data['displayArtist']['members'][0] ['participant']['ids'][1], 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] } mock_get_artist.return_value = get_artist_results orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, vendor_id, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_called() participant_handler._create_artist.assert_called() assert len(processing_results) == 1 assert len(artists) == 2 for i in range(len(processing_results)): assert processing_results[i].get('ids') == expected_mappings[i] assert artists == expected_formatted_artists @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_product_with_contributors( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_and_contributor_data ): """Test processing participant members and contributors.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = \ product_with_valid_participant_member_and_contributor_data expected_mappings = [ [ get_product_by_upc_data['displayArtist']['members'][0] ['participant']['ids'][0], { 'localId': 'AIID:123', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['displayArtist']['members'][1] ['participant']['ids'][0], { 'localId': 'AIID:124', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['contributors'][0] ['participant']['ids'][0], { 'localId': 'AIID:125', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['contributors'][1] ['participant']['ids'][0], { 'localId': 'AIID:126', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['contributors'][2] ['participant']['ids'][0], { 'localId': 'AIID:127', 'system': 'ORCHARD' } ] ] create_artist_results = [ { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '125', 'artistName': get_product_by_upc_data ['contributors'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '126', 'artistName': get_product_by_upc_data ['contributors'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '127', 'artistName': get_product_by_upc_data ['contributors'][2]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[1]['artistId']), 'artistName': create_artist_results[1]['artistName'], 'artistType': 'featuring' }, { 'artistInfoId': int(create_artist_results[2]['artistId']), 'artistName': create_artist_results[2]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[3]['artistId']), 'artistName': create_artist_results[3]['artistName'], 'artistType': 'composer' }, { 'artistInfoId': int(create_artist_results[4]['artistId']), 'artistName': create_artist_results[4]['artistName'], 'artistType': 'remixer' } ] orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_not_called() participant_handler._create_artist.assert_called() assert len(processing_results) == 5 assert len(artists) == 5 for i in range(len(processing_results)): assert processing_results[i].get('ids') == expected_mappings[i] assert artists == expected_formatted_artists @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_product_with_mixed_contributor_mappings( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_and_contributor_data ): """Test processing participant members with mixed mappings.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = \ product_with_valid_participant_member_and_contributor_data vendor_id = \ get_product_by_upc_data['project']['labelAccount']['companyCode'] # Add an orchard mapping to one of our contributor members (get_product_by_upc_data['contributors'][0] ['participant']['ids'].append( {'localId': 'AIID:430404', 'system': 'ORCHARD'} )) get_artist_results = { 'artistId': get_product_by_upc_data['contributors'][0] ['participant']['ids'][1]['localId'], 'artistName': get_product_by_upc_data['contributors'][0] ['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] } mock_get_artist.return_value = get_artist_results create_artist_results = [ { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '126', 'artistName': get_product_by_upc_data ['contributors'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '127', 'artistName': get_product_by_upc_data ['contributors'][2]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[1]['artistId']), 'artistName': create_artist_results[1]['artistName'], 'artistType': 'featuring' }, { 'artistInfoId': format_get_artist_id( get_product_by_upc_data['contributors'][0] ['participant']['ids'][1]['localId']), 'artistName': get_product_by_upc_data['contributors'][0] ['participant']['name'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[2]['artistId']), 'artistName': create_artist_results[2]['artistName'], 'artistType': 'composer' }, { 'artistInfoId': int(create_artist_results[3]['artistId']), 'artistName': create_artist_results[3]['artistName'], 'artistType': 'remixer' } ] orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, vendor_id, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_called_once() participant_handler._create_artist.assert_called() assert len(processing_results) == 4 assert len(artists) == 5 assert artists == expected_formatted_artists @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_process_product_with_invalid_contributor_mapping( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_and_contributor_data ): """Test processing participant members with invalid target mapping.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = \ product_with_valid_participant_member_and_contributor_data # Add an orchard mapping to one of our contributor members (get_product_by_upc_data['contributors'][0] ['participant']['ids'].append( {'localId': 'AIID:430404', 'system': 'ORCHARD'} )) # Returns invalid vendor id get_artist_results = { 'artistId': get_product_by_upc_data['contributors'][0] ['participant']['ids'][1]['localId'], 'artistName': get_product_by_upc_data['contributors'][0] ['participant']['name'], 'artistType': 'artist', 'vendorId': '2345' } mock_get_artist.return_value = get_artist_results create_artist_results = [ { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '125', 'artistName': get_product_by_upc_data ['contributors'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '126', 'artistName': get_product_by_upc_data ['contributors'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '127', 'artistName': get_product_by_upc_data ['contributors'][2]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[1]['artistId']), 'artistName': create_artist_results[1]['artistName'], 'artistType': 'featuring' }, { 'artistInfoId': int(create_artist_results[2]['artistId']), 'artistName': create_artist_results[2]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[3]['artistId']), 'artistName': create_artist_results[3]['artistName'], 'artistType': 'composer' }, { 'artistInfoId': int(create_artist_results[4]['artistId']), 'artistName': create_artist_results[4]['artistName'], 'artistType': 'remixer' } ] orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_called_once() participant_handler._create_artist.assert_called() assert len(processing_results) == 5 assert len(artists) == 5 assert artists == expected_formatted_artists @patch('switchboard_consumer.utils.message.datetime') @patch('switchboard_consumer.utils.message.uuid.uuid4') @patch.object(ProductParticipantHandler, '_get_artist') @patch.object(ProductParticipantHandler, '_validate_display_artist_members', return_value=True) @patch.object(ProductParticipantHandler, '_find_artists', return_value=[]) def test_ignore_invalid_contributor_role( mock_find_artists, mock_validate_display_artist_members, mock_get_artist, mock_uuid, mock_datetime, mock_logger, orchard_client, create_product_message, product_with_valid_participant_member_and_contributor_data ): """Test processing participant members and contributors.""" uuid_value = '123456' mock_uuid.return_value = uuid_value datetime_value = '2019' mock_datetime.now.return_value = Mock(isoformat=lambda: datetime_value) mock_logger = Mock() get_product_by_upc_data = \ product_with_valid_participant_member_and_contributor_data # Add invalid contributor get_product_by_upc_data.get('contributors').append( {'role': 'INVALID'} ) expected_mappings = [ [ get_product_by_upc_data['displayArtist']['members'][0] ['participant']['ids'][0], { 'localId': 'AIID:123', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['displayArtist']['members'][1] ['participant']['ids'][0], { 'localId': 'AIID:124', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['contributors'][0] ['participant']['ids'][0], { 'localId': 'AIID:125', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['contributors'][1] ['participant']['ids'][0], { 'localId': 'AIID:126', 'system': 'ORCHARD' } ], [ get_product_by_upc_data['contributors'][2] ['participant']['ids'][0], { 'localId': 'AIID:127', 'system': 'ORCHARD' } ] ] create_artist_results = [ { 'artistId': '123', 'artistName': get_product_by_upc_data ['displayArtist']['members'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '124', 'artistName': get_product_by_upc_data ['displayArtist']['members'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '125', 'artistName': get_product_by_upc_data ['contributors'][0]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '126', 'artistName': get_product_by_upc_data ['contributors'][1]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, { 'artistId': '127', 'artistName': get_product_by_upc_data ['contributors'][2]['participant']['name'], 'artistType': 'artist', 'vendorId': get_product_by_upc_data ['project']['labelAccount']['companyCode'] }, ] expected_formatted_artists = [ { 'artistInfoId': int(create_artist_results[0]['artistId']), 'artistName': create_artist_results[0]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[1]['artistId']), 'artistName': create_artist_results[1]['artistName'], 'artistType': 'featuring' }, { 'artistInfoId': int(create_artist_results[2]['artistId']), 'artistName': create_artist_results[2]['artistName'], 'artistType': 'performer' }, { 'artistInfoId': int(create_artist_results[3]['artistId']), 'artistName': create_artist_results[3]['artistName'], 'artistType': 'composer' }, { 'artistInfoId': int(create_artist_results[4]['artistId']), 'artistName': create_artist_results[4]['artistName'], 'artistType': 'remixer' } ] orchard_client.create_artist.side_effect = create_artist_results participant_handler = ProductParticipantHandler(mock_logger, orchard_client, create_product_message, 12345, None) participant_handler._create_artist = \ Mock(wraps=participant_handler._create_artist) (processing_results, artists) = participant_handler \ .process( get_product_by_upc_data ) mock_get_artist.assert_not_called() participant_handler._create_artist.assert_called() assert len(processing_results) == 5 assert len(artists) == 5 for i in range(len(processing_results)): assert processing_results[i].get('ids') == expected_mappings[i] assert artists == expected_formatted_artists