"""Test Update Tracks with Artists.""" import json import pytest from ows_product_physical.constant import header from ows_product_physical.constant import service_name @pytest.fixture def tracks_test_setup( ows_request_mocker, db_release_id_with_tracks, db_project_id, valid_post_header): """Mock calls to other microservices for product lookup.""" ows_request_mocker.add( { 'method': 'get', 'service': service_name.OWS_MARKETING, 'path': '/highlights/release/{}?mkt_program_id=20'.format( db_release_id_with_tracks), 'status': 200, 'json': { 'items': [{'description': 'product_description'}] } }) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PROJECT, 'path': '/ownership/{}/{}/project/{}'.format( valid_post_header[header.GRASS_ACCOUNT_TYPE], valid_post_header[header.GRASS_ACCOUNT_ID], db_project_id ), 'status': 200 }) ows_request_mocker.add( { 'method': 'get', 'service': service_name.OWS_PRODUCT, 'path': '/product/{}'.format( db_release_id_with_tracks), 'status': 200, 'json': {'upc': 876543} }) ows_request_mocker.add( { 'method': 'get', 'service': service_name.OWS_ACCOUNT, 'path': '/vendor/{}'.format( valid_post_header[header.GRASS_ACCOUNT_ID]), 'status': 200, 'json': { 'vendor_id': valid_post_header[header.GRASS_ACCOUNT_ID], 'migrated_to_abacus': 0, } }) ows_request_mocker.add( { 'method': 'get', 'service': service_name.OWS_CONTRACTS, 'path': '/{}/{}/mechadmin_for_account'.format( valid_post_header[header.GRASS_ACCOUNT_TYPE], valid_post_header[header.GRASS_ACCOUNT_ID]), 'status': 200, 'json': { 'mechadmin_digital': False, 'mechadmin_physical': True} }) ows_request_mocker.apply() def test_update_tracks_successful( client, db_with_data, valid_put_header, tracks_test_setup, db_tracks, db_release_id_with_tracks, feature_engine): """Test successful update of tracks for a product.""" track_to_update = db_tracks[0] update_data = [{ 'performer': ['Billy Bob'], 'track_name': 'My First Track', 'track_id': track_to_update['id'], 'us_publishing_obligation': 'PublicDomain', 'third_party_publisher': 'Y', 'length': '00:01:00' }] response = client.put( '/product/{}/tracks'.format(db_release_id_with_tracks), headers=valid_put_header, data=json.dumps({'items': update_data})) assert response.status_code == 201 actual_items = json.loads(response.data.decode('utf-8')).get('items') expected_items = [ {'track_id': 1, 'track_number': 1, 'side': None, 'song_writers': ['George', 'Sally'], 'track_name': update_data[0]['track_name'], 'isrc': 'SOMEISRC123', 'disc': 1, 'length': {'minutes': 1, 'formatted': '00:01:00', 'hours': 0, 'seconds': 0}, 'performer': update_data[0]['performer'], 'us_publishing_obligation': 'PublicDomain', 'third_party_publisher': 'Y', 'publisher_names': ['Publisher 1']}, {'track_id': 2, 'track_number': 2, 'track_name': 'Second track', 'side': None, 'song_writers': [], 'isrc': None, 'disc': 1, 'length': None, 'performer': ['Artist 2'], 'us_publishing_obligation': None, 'third_party_publisher': 'N', 'publisher_names': ['Publisher 2'] }] assert actual_items == expected_items def test_update_publishing_obligations_successful( client, db_with_data, valid_put_header, tracks_test_setup, db_tracks, db_release_id_with_tracks): """Test successful update of publishing obligations for a product.""" track_to_update = db_tracks[0] update_data = [{ 'publisher_names': ['Billy Bob', 'Sweet Candy'], 'track_id': track_to_update['id'], 'us_publishing_obligation': 'Composition', 'third_party_publisher': 'Y' }] response = client.put( '/product/{}/tracks/publishing-obligation'.format( db_release_id_with_tracks), headers=valid_put_header, data=json.dumps(update_data)) assert response.status_code == 200 actual_items = json.loads(response.data.decode('utf-8')).get('items') expected_items = [ { 'publisher_names': [ 'Billy Bob', 'Sweet Candy' ], 'track_number': 1, 'third_party_publisher': 'Y', 'us_publishing_obligation': 'Composition', 'track_id': 1, 'track_name': 'First track' }, { 'publisher_names': [ 'Publisher 2' ], 'track_number': 2, 'third_party_publisher': 'N', 'us_publishing_obligation': None, 'track_id': 2, 'track_name': 'Second track' }] assert actual_items == expected_items