"""Functional tests for updating a track lyrics. Test endpoint: DELETE /track/ """ import logging from unittest.mock import Mock from owsrequest import request from owsrequest import test_utils import pytest from backend.constants import services from tests.testutils import db from tests.testutils import mocks @db.test_schema_no_seed @pytest.mark.parametrize('delete_response_code', [200, 404, 418]) def test_delete_track_with_lyrics( client, track_factory, mocker, delete_response_code): """Test DELETE track passes with lyrics.""" track = track_factory() db.merge_model_objects([track]) delete_specs = [ { 'service': services.OWS_LYRICS, 'path': '/tracks/{}/lyrics'.format(track.tuid), 'status': delete_response_code, }, { 'service': services.OWS_ASSETS, 'path': '/track/{}'.format(track.tuid), 'status': 200, }, { 'service': services.OWS_PRODUCT, 'path': '/localization/track/{}'.format(track.tuid), 'status': 200, } ] post_specs = [ { 'service': services.OWS_VIDEO, 'path': '/product/disassociate-tracks', 'status': 200, } ] mocks.ows_product_verify_product_ownership(mocker) mock = Mock(wraps=test_utils.mock_ows_requests(delete_specs)) mocker.patch.object(request, 'delete', mock) mocker.patch.object( request, 'post', test_utils.mock_ows_requests(post_specs)) delete_response = client.delete('/track/{}'.format(track.tuid)) assert delete_response.status_code == 200 mock.assert_called_with( services.OWS_LYRICS, '/tracks/{}/lyrics'.format(track.tuid)) @db.test_schema_no_seed @pytest.mark.parametrize('delete_response_code', [200, 418]) def test_delete_tracks_with_lyrics( client, track_factory, mocker, delete_response_code): """Test DELETE track passes with lyrics.""" product_id = 42 tracks = [ track_factory(product_id=product_id), track_factory(product_id=product_id)] db.merge_model_objects(tracks) tuids = [str(track.tuid) for track in tracks] delete_specs = [ { 'service': services.OWS_LYRICS, 'path': '/tracks/lyrics', 'status': delete_response_code, }, { 'service': services.OWS_ASSETS, 'path_regex': r'/product/[0-9]+/tracks', 'status': 200, }, { 'service': services.OWS_PRODUCT, 'path': '/localization/track/{}'.format(','.join(tuids)), 'status': 200, } ] post_specs = [ { 'service': services.OWS_VIDEO, 'path': '/product/disassociate-tracks', 'status': 200, } ] mocks.ows_product_verify_product_ownership(mocker) mock = Mock(wraps=test_utils.mock_ows_requests(delete_specs)) mocker.patch.object(request, 'delete', mock) mocker.patch.object( request, 'post', test_utils.mock_ows_requests(post_specs)) log_mock = mocker.patch.object(logging.LoggerAdapter, 'error') delete_response = client.delete( '/product/{}/tracks?tuids={}'.format(product_id, ','.join(tuids))) if delete_response_code == 200: assert not log_mock.called else: log_mock.assert_called_with('Failed to delete track lyrics: None') assert delete_response.status_code == 200 mock.assert_called_with( services.OWS_LYRICS, '/tracks/lyrics', headers={'Content-Type': 'application/json'}, data='{{"tuids": [{}]}}'.format(', '.join(tuids)) )