"""Functional tests for updating a track lyrics. Test endpoint: PUT /track/ """ import json from unittest.mock import Mock from owsrequest import request from owsrequest import test_utils import pytest from backend.models import ows_lyrics from tests.testutils import db import tests.testutils.functions as test_funcs get_specs = [ { 'service': 'ows-product', 'path': '/localization/languages', 'status': 200, 'json': { 'items': [{'language_id': 1, 'meta_language_code': 'ENG'}]}, } ] post_specs = [ { 'service': 'ows-product', 'path': '/localization/track', 'status': 200, 'json': {'items': []}, } ] get_specs_digital_product = [ { 'service': 'ows-product-digital', 'path': '/product/audio/1', 'status': 200, 'json': {'items': []}, } ] @db.test_schema_no_seed def test_put_track_with_lyrics( client_put_track, track_factory, mocker): """Test PUT track passes with lyrics.""" mocker.patch.object( ows_lyrics, 'has_explicit_lyrics', return_value=False) track = track_factory() update_data = {'lyrics': 'track lyrics'} update_request = test_funcs.create_track_update_request( track.to_dict(), update_data) db.merge_model_objects([track]) put_spec = { 'service': 'ows-lyrics', 'path': '/tracks/{}/lyrics'.format(track.tuid), 'status': 200, } mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs)) mocker.patch.object( request, 'post', test_utils.mock_ows_requests(post_specs)) mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs_digital_product)) mock = Mock(wraps=test_utils.mock_ows_requests([put_spec])) mocker.patch.object(request, 'put', mock) res = client_put_track(track.tuid, update_request) assert res.status_code == 200 assert mock.call_args[1]['data'] == json.dumps( {'lyrics': 'track lyrics'}, ensure_ascii=False ).encode('utf-8') @db.test_schema_no_seed def test_put_track_with_lyrics_failed( client_put_track, track_factory, mocker): """Test PUT track passes with lyrics failed.""" mocker.patch.object( ows_lyrics, 'has_explicit_lyrics', return_value=False) track = track_factory() update_data = {'lyrics': 'track lyrics'} update_request = test_funcs.create_track_update_request( track.to_dict(), update_data) db.merge_model_objects([track]) put_spec = { 'service': 'ows-lyrics', 'path': '/tracks/{}/lyrics'.format(track.tuid), 'status': 418, } mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs)) mocker.patch.object( request, 'post', test_utils.mock_ows_requests(post_specs)) mocker.patch.object( request, 'put', test_utils.mock_ows_requests([put_spec])) mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs_digital_product)) res = client_put_track(track.tuid, update_request) assert res.status_code == 418 @db.test_schema_no_seed @pytest.mark.parametrize('delete_status', [200, 404]) def test_put_track_with_empty_lyrics( client_put_track, track_factory, mocker, delete_status): """Test PUT track passes with empty lyrics.""" track = track_factory() update_data = {'lyrics': ''} update_request = test_funcs.create_track_update_request( track.to_dict(), update_data) db.merge_model_objects([track]) delete_spec = { 'service': 'ows-lyrics', 'path': '/tracks/{}/lyrics'.format(track.tuid), 'status': delete_status, } mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs)) mocker.patch.object( request, 'post', test_utils.mock_ows_requests(post_specs)) mocker.patch.object( request, 'get', test_utils.mock_ows_requests(get_specs_digital_product)) mock = Mock(wraps=test_utils.mock_ows_requests([delete_spec])) mocker.patch.object(request, 'delete', mock) res = client_put_track(track.tuid, update_request) assert res.status_code == 200 assert mock.called