"""Functional tests for importing existing tracks. Test endpoint: POST /product//tracks/copy/ """ import json from unittest.mock import Mock from owsrequest import request from owsrequest import test_utils import pytest from backend.constants import services from backend.constants import track_field from tests.testutils import db @pytest.mark.parametrize('response_code', [200, 418]) @db.test_schema_no_seed def test_copy_lyrics( client, mocker, track_factory, response_code): """Test copy lyrics is successful.""" src_product_id = 1 dest_product_id = 2 orchard_user_id = 1 track1 = track_factory(product_id=src_product_id) track2 = track_factory(product_id=src_product_id) tracks = [track1, track2] db.merge_model_objects(tracks) get_specs = [ { 'service': services.OWS_PRODUCT, 'path': '/product/{}'.format(dest_product_id), 'status': 200, 'json': {track_field.UPC: 'upc'} } ] post_specs = [ { 'service': services.OWS_LYRICS, 'path': '/tracks/copy', 'status': response_code, }, { 'service': services.OWS_PRODUCT, 'path': '/localization/track', 'status': 200, 'json': {'items': []} }, { 'service': services.OWS_ASSETS, 'path_regex': r'/track/[0-9]+/copy/[0-9]+', 'status': 200, } ] put_specs = [ { 'service': services.OWS_PRODUCT, 'path': '/localization/tracks', 'status': 200, } ] mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs)) mock = Mock(wraps=test_utils.mock_ows_requests(post_specs)) mocker.patch.object(request, 'post', mock) mocker.patch.object( request, 'put', test_utils.mock_ows_requests(put_specs)) res = client.post( '/product/{}/tracks/copy/{}?orchard_user_id={}'.format( src_product_id, dest_product_id, orchard_user_id)) assert res.status_code == 200 assert mock.called service_call = None for spec in mock.call_args_list: if spec[0][0] == services.OWS_LYRICS: service_call = spec[1] assert service_call call_body = json.loads(service_call['data']) assert len(call_body['items']) == len(tracks) for item, track in zip(call_body['items'], tracks): assert item['source_tuid'] == track.tuid assert 'destination_tuid' in item