"""Functional tests for importing existing tracks with lyrics. Test endpoint: POST /product//tracks/import """ 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 from tests.testutils import mocks @pytest.mark.parametrize('response_code', [200, 418]) @db.test_schema_no_seed def test_import_lyrics( client, mocker, track_factory, response_code, client_headers): """Test import lyrics is successful.""" src_product_id = 1 dest_product_id = 2 tracks = [ track_factory(product_id=src_product_id), track_factory(product_id=src_product_id)] 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, } ] mocks.head_response(mocker) 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/import'.format(dest_product_id), headers=client_headers, data=json.dumps({'tuids': [track.tuid for track in tracks]})) 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