"""Test VAPI logic.""" from unittest.mock import call, patch import pytest from product_review.logic import vapi as vapi_logic from product_review.models import ows_assets as ows_assets_model from product_review.models import ows_product as ows_product_model from product_review.models import ows_product_workflow as ows_product_workflow_model from product_review.models import ows_track as ows_track_model from product_review.models import review_queue as review_queue_model from product_review.models import vapi as vapi_model @pytest.mark.parametrize( ( "test_description", "mock_revisions", "expected_get_product_localization_calls", "expected__format_get_product_localization_response_calls", "expected_get_tracks_on_product_calls", "expected__format_get_tracks_on_product_response_calls", "expected_validate_audio_calls", "expected_approve_revised_product_calls", "expected_apply_corrections_calls", "expected__format_release_and_track_localized_data_calls", "_format_release_and_track_localized_data_return_value", "expected_save_revised_localized_product_fields_calls", "expected_save_revised_localized_track_fields_calls", ), [ ( "Not a revision.", {}, [], [], [], [], [], [], [], [], None, [], [], ), ( "Revision with release_localized_revisions.", { "items": [ { "table_name": "releases", "field_name": "performer", "key_value": [{"role": "performer", "artist_name": "asdf"}], } ], "status": "submitted", "release_id": 12321, }, [call(12321)], [call("abcd")], [], [], [call(12321)], [call(12321)], [call(12321)], [call("asdf", None)], { "release_revisions": "asdf", "tracks_revisions": None, }, [call("asdf")], [], ), ( "Revision with tracks_localized_revisions.", { "items": [ { "table_name": "track", "field_name": "track_artist", "key_value": [ { "name": "asdf", "type": "performer", } ], } ], "status": "submitted", "release_id": 12321, }, [], [], [call(12321)], [call("efgh")], [call(12321)], [call(12321)], [call(12321)], [call(None, ["qwer", "wert"])], {"release_revisions": None, "tracks_revisions": ["qwer", "wert"]}, [], [call("qwer"), call("wert")], ), ( "Revision with coverart and track audio revisions.", { "items": [ { "table_name": "releases", "field_name": "coverart", "key_value": "true", }, { "table_name": "track", "field_name": "track", "key_value": "true", }, ], "status": "submitted", "release_id": 12321, }, [], [], [], [], [call(12321)], [call(12321)], [call(12321)], [call(None, None)], { "release_revisions": None, "tracks_revisions": None, }, [], [], ), ], ) def test__apply_revisions_if_applicable( test_description, mock_revisions, expected_get_product_localization_calls, expected__format_get_product_localization_response_calls, expected_get_tracks_on_product_calls, expected__format_get_tracks_on_product_response_calls, expected_validate_audio_calls, expected_approve_revised_product_calls, expected_apply_corrections_calls, expected__format_release_and_track_localized_data_calls, _format_release_and_track_localized_data_return_value, expected_save_revised_localized_product_fields_calls, expected_save_revised_localized_track_fields_calls, mocker, ): """Test _apply_revisions_if_applicable.""" mocker.patch.object( ows_product_model, "get_product_localization", return_value="abcd", ) mocker.patch.object( vapi_logic, "_format_get_product_localization_response", return_value="asdf", ) mocker.patch.object( ows_track_model, "get_tracks_on_product", return_value="efgh", ) mocker.patch.object( ows_product_model, "get_product", return_value={"status": "in_content"} ) mocker.patch.object( vapi_logic, "_format_get_tracks_on_product_response", return_value=["qwer", "wert"], ) mocker.patch.object(ows_assets_model, "validate_audio") mocker.patch.object(vapi_model, "approve_revised_product") mocker.patch.object(ows_assets_model, "apply_corrections") mocker.patch.object( vapi_logic, "_format_release_and_track_localized_data", return_value=_format_release_and_track_localized_data_return_value, ) mocker.patch.object(vapi_model, "save_revised_localized_product_fields") mocker.patch.object(vapi_model, "save_revised_localized_track_fields") mocker.patch.object( review_queue_model, "get_items", return_value=([review_queue_model.ReviewQueue(product_id=1)], 1), ) mocker.patch.object( ows_product_workflow_model, "get_error_correction", return_value=mock_revisions ) vapi_logic.vapi_apply_revisions_if_applicable(mock_revisions) assert ows_product_model.get_product_localization.mock_calls == ( expected_get_product_localization_calls ) assert vapi_logic._format_get_product_localization_response.mock_calls == ( expected__format_get_product_localization_response_calls ) assert ( ows_track_model.get_tracks_on_product.mock_calls == expected_get_tracks_on_product_calls ) assert vapi_logic._format_get_tracks_on_product_response.mock_calls == ( expected__format_get_tracks_on_product_response_calls ) assert ows_assets_model.validate_audio.mock_calls == expected_validate_audio_calls assert vapi_model.approve_revised_product.mock_calls == ( expected_approve_revised_product_calls ) assert ( ows_assets_model.apply_corrections.mock_calls == expected_apply_corrections_calls ) assert vapi_logic._format_release_and_track_localized_data.mock_calls == ( expected__format_release_and_track_localized_data_calls ) assert vapi_model.save_revised_localized_product_fields.mock_calls == ( expected_save_revised_localized_product_fields_calls ) assert vapi_model.save_revised_localized_track_fields.mock_calls == ( expected_save_revised_localized_track_fields_calls ) @pytest.mark.parametrize( ( "test_description", "localized_product_fields", "localized_track_fields", "expected_result", ), [ ( "no localized fields", None, None, { "release_revisions": None, "tracks_revisions": None, }, ), ( "localized_product_fields", { "applesauce": "bananas", }, None, { "release_revisions": "%7B%22applesauce%22%3A%22bananas%22%7D", "tracks_revisions": None, }, ), ( "localized_track_fields", None, [ { "applesauce": "bananas", } ], { "release_revisions": None, "tracks_revisions": ["%7B%22applesauce%22%3A%22bananas%22%7D"], }, ), ( "localized_product_fields and localized_track_fields", { "applesauce": "bananas", }, [ { "applesauce": "bananas", } ], { "release_revisions": "%7B%22applesauce%22%3A%22bananas%22%7D", "tracks_revisions": ["%7B%22applesauce%22%3A%22bananas%22%7D"], }, ), ], ) def test__format_release_and_track_localized_data( test_description, localized_product_fields, localized_track_fields, expected_result, ): """Test _format_release_and_track_localized_data.""" assert ( vapi_logic._format_release_and_track_localized_data( localized_product_fields, localized_track_fields ) == expected_result ) product_localization = { "delivered_version": "jythrdhrtjyrjdtyhrttrdh", "featuring": { "8507546": "ytu5ehrdthrthddryhrt", "8507557": "dfgsdtgettrshsrtj", }, "language_id": 1, "primary_artist": { "8507545": "kyukuykuylkyutlyuk", "8507556": "jkuykytjffthydhrtrdth", }, "producer": { "8507548": "sdfgsrthjdtjrtj", "8507559": "ghsdfgserhsergsergreers", }, "product_name": "asdfaasdfwergherhrjyt", "remixer": { "8507547": "estethfrgtjhdrjhdtrrt", "8507558": "fdbhfgdhdfhfgh", }, "orchestra": { "8507546": "ytu5ehrdthrthddryhrt", "8507557": "dfgsdtgettrshsrtj", }, "conductor": { "8507545": "kyukuykuylkyutlyuk", "8507556": "jkuykytjffthydhrtrdth", }, "composer": { "8507548": "sdfgsrthjdtjrtj", "8507559": "ghsdfgserhsergsergreers", }, "ensemble": { "8507547": "estethfrgtjhdrjhdtrrt", "8507558": "fdbhfgdhdfhfgh", }, } get_product_localization_response = { "items": [ { **product_localization, "language_id": 2, }, { **product_localization, "language_id": 10, }, ], "product_id": 12321, } formatted_get_product_localization_response = { "releaseId": 12321, "releaseName": [ { "languageId": 2, "value": "asdfaasdfwergherhrjyt", }, { "languageId": 10, "value": "asdfaasdfwergherhrjyt", }, ], "releaseArtist": { "performer": { 2: [ {"artist": "kyukuykuylkyutlyuk"}, {"artist": "jkuykytjffthydhrtrdth"}, ], 10: [ {"artist": "kyukuykuylkyutlyuk"}, {"artist": "jkuykytjffthydhrtrdth"}, ], }, "remixer": { 2: [{"artist": "estethfrgtjhdrjhdtrrt"}, {"artist": "fdbhfgdhdfhfgh"}], 10: [{"artist": "estethfrgtjhdrjhdtrrt"}, {"artist": "fdbhfgdhdfhfgh"}], }, "featuring": { 2: [ {"artist": "ytu5ehrdthrthddryhrt"}, {"artist": "dfgsdtgettrshsrtj"}, ], 10: [ {"artist": "ytu5ehrdthrthddryhrt"}, {"artist": "dfgsdtgettrshsrtj"}, ], }, "orchestra": { 2: [ {"artist": "ytu5ehrdthrthddryhrt"}, {"artist": "dfgsdtgettrshsrtj"}, ], 10: [ {"artist": "ytu5ehrdthrthddryhrt"}, {"artist": "dfgsdtgettrshsrtj"}, ], }, "conductor": { 2: [ {"artist": "kyukuykuylkyutlyuk"}, {"artist": "jkuykytjffthydhrtrdth"}, ], 10: [ {"artist": "kyukuykuylkyutlyuk"}, {"artist": "jkuykytjffthydhrtrdth"}, ], }, "composer": { 2: [ {"artist": "sdfgsrthjdtjrtj"}, {"artist": "ghsdfgserhsergsergreers"}, ], 10: [ {"artist": "sdfgsrthjdtjrtj"}, {"artist": "ghsdfgserhsergsergreers"}, ], }, "ensemble": { 2: [{"artist": "estethfrgtjhdrjhdtrrt"}, {"artist": "fdbhfgdhdfhfgh"}], 10: [{"artist": "estethfrgtjhdrjhdtrrt"}, {"artist": "fdbhfgdhdfhfgh"}], }, "producer": { 2: [ {"artist": "sdfgsrthjdtjrtj"}, {"artist": "ghsdfgserhsergsergreers"}, ], 10: [ {"artist": "sdfgsrthjdtjrtj"}, {"artist": "ghsdfgserhsergsergreers"}, ], }, }, } @pytest.mark.parametrize( ( "test_description", "get_product_localization_response", "expected_formatted_get_product_localization_response", ), [ ( "localizations", get_product_localization_response, formatted_get_product_localization_response, ), ( "no localizations", { **get_product_localization_response, "items": [], }, None, ), ], ) def test__format_get_product_localization_response( test_description, get_product_localization_response, expected_formatted_get_product_localization_response, ): """Test _format_get_product_localization_response.""" assert ( vapi_logic._format_get_product_localization_response( get_product_localization_response ) == expected_formatted_get_product_localization_response ) localized_track_artist_list = [ { "name": "rthrehrthrth", "track_artist_id": 98618187, "type": "performer", }, { "name": "ehtrtehrthre", "track_artist_id": 98618188, "type": "performer", }, { "name": "rthrthrte", "track_artist_id": 98618191, "type": "featuring", }, { "name": "trhgehtrgdfh", "track_artist_id": 98618195, "type": "featuring", }, { "name": "drthdrthrdth", "track_artist_id": 98618196, "type": "producer", }, { "name": "drthdrthrdthtr", "track_artist_id": 98618197, "type": "producer", }, { "name": "rthrthdrthdrt", "track_artist_id": 98618198, "type": "remixer", }, { "name": "drthrtdhrdthrt", "track_artist_id": 98618199, "type": "remixer", }, { "name": "rthrehrthrth", "track_artist_id": 98618187, "type": "orchestra", }, { "name": "ehtrtehrthre", "track_artist_id": 98618188, "type": "orchestra", }, { "name": "rthrthrte", "track_artist_id": 98618191, "type": "conductor", }, { "name": "trhgehtrgdfh", "track_artist_id": 98618195, "type": "conductor", }, { "name": "drthdrthrdth", "track_artist_id": 98618196, "type": "composer", }, { "name": "drthdrthrdthtr", "track_artist_id": 98618197, "type": "composer", }, { "name": "rthrthdrthdrt", "track_artist_id": 98618198, "type": "ensemble", }, { "name": "drthrtdhrdthrt", "track_artist_id": 98618199, "type": "ensemble", }, ] track_response = { "localizations": [ { "artists": localized_track_artist_list, "language_id": 1, "track_name": "htrhejyejyrtyejtteyjtyj", "tuid": 37897435, "version": "rehteerhrth", }, { "artists": localized_track_artist_list, "language_id": 3, "track_name": "tryeyrrthrthreht", "tuid": 37897435, "version": "rhtrhthethreht", }, ], "tuid": 37897435, } get_tracks_on_product_response = { "items": [ { **track_response, "tuid": 12321, }, { **track_response, "tuid": 32123, }, ], } formatted_get_tracks_on_product_response = [ { "trackArtist": { "composer": { 12321: { 1: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], 3: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], } }, "conductor": { 12321: { 1: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], 3: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], } }, "ensemble": { 12321: { 1: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], 3: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], } }, "featuring": { 12321: { 1: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], 3: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], } }, "orchestra": { 12321: { 1: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], 3: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], } }, "performer": { 12321: { 1: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], 3: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], } }, "producer": { 12321: { 1: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], 3: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], } }, "remixer": { 12321: { 1: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], 3: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], } }, }, "trackId": 12321, }, { "trackArtist": { "composer": { 32123: { 1: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], 3: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], } }, "conductor": { 32123: { 1: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], 3: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], } }, "ensemble": { 32123: { 1: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], 3: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], } }, "featuring": { 32123: { 1: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], 3: [{"artist": "rthrthrte"}, {"artist": "trhgehtrgdfh"}], } }, "orchestra": { 32123: { 1: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], 3: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], } }, "performer": { 32123: { 1: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], 3: [{"artist": "rthrehrthrth"}, {"artist": "ehtrtehrthre"}], } }, "producer": { 32123: { 1: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], 3: [{"artist": "drthdrthrdth"}, {"artist": "drthdrthrdthtr"}], } }, "remixer": { 32123: { 1: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], 3: [{"artist": "rthrthdrthdrt"}, {"artist": "drthrtdhrdthrt"}], } }, }, "trackId": 32123, }, ] @pytest.mark.parametrize( ( "test_description", "get_tracks_on_product_response", "expected_formatted_get_tracks_on_product_response", ), [ ( "localizations", get_tracks_on_product_response, formatted_get_tracks_on_product_response, ), ( "no localizations", { "items": [ { "localizations": [], "tuid": 12321, }, { "localizations": [], "tuid": 32123, }, ], }, None, ), ], ) def test__format_get_tracks_on_product_response( test_description, get_tracks_on_product_response, expected_formatted_get_tracks_on_product_response, ): """Test _format_get_tracks_on_product_response.""" assert ( vapi_logic._format_get_tracks_on_product_response( get_tracks_on_product_response ) == expected_formatted_get_tracks_on_product_response ) @pytest.mark.parametrize( ( "test_description", "product_with_revisions", "expected__format_get_product_localization_response_calls", "expected__format_get_tracks_on_product_response_calls", "expected__format_release_and_track_localized_data_calls", "_format_release_and_track_localized_data_return_value", "expected_save_revised_localized_product_fields_calls", "expected_save_revised_localized_track_fields_calls", ), [ ( "fetch no localized fields", { "release_id": 12321, "items": [ { "table_name": "releases", "field_name": "applesauce", }, { "table_name": "track", "field_name": "bananas", }, { "table_name": "applesauce", "field_name": "bananas", }, ], }, [], [], [call(None, None)], { "release_revisions": None, "tracks_revisions": None, }, [], [], ), ( "fetch product and track localized fields", { "release_id": 12321, "items": [ { "table_name": "releases", "field_name": "release_artist", }, { "table_name": "track", "field_name": "track_artist", }, ], }, [call("get_product_localization response")], [call("get_tracks_on_product response")], [ call( "_format_get_product_localization_response response", "_format_get_tracks_on_product_response response", ), ], { "release_revisions": "applesauce bananas", "tracks_revisions": [ "applesauce", "bananas", ], }, [call("applesauce bananas")], [call("applesauce"), call("bananas")], ), ( "fetch product and track localized fields, " "_format_release_and_track_localized_data empty response", { "release_id": 12321, "items": [ { "table_name": "releases", "field_name": "release_artist", }, { "table_name": "track", "field_name": "track_artist", }, ], }, [call("get_product_localization response")], [call("get_tracks_on_product response")], [ call( "_format_get_product_localization_response response", "_format_get_tracks_on_product_response response", ), ], { "release_revisions": None, "tracks_revisions": None, }, [], [], ), ], ) def test__save_revised_localized_fields( test_description, product_with_revisions, expected__format_get_product_localization_response_calls, expected__format_get_tracks_on_product_response_calls, expected__format_release_and_track_localized_data_calls, _format_release_and_track_localized_data_return_value, expected_save_revised_localized_product_fields_calls, expected_save_revised_localized_track_fields_calls, mocker, ): """Test _save_revised_localized_fields.""" mocker.patch.object( ows_product_model, "get_product_localization", return_value="get_product_localization response", ) mocker.patch.object( vapi_logic, "_format_get_product_localization_response", return_value="_format_get_product_localization_response response", ) mocker.patch.object( ows_track_model, "get_tracks_on_product", return_value="get_tracks_on_product response", ) mocker.patch.object( vapi_logic, "_format_get_tracks_on_product_response", return_value="_format_get_tracks_on_product_response response", ) mocker.patch.object( vapi_logic, "_format_release_and_track_localized_data", return_value=_format_release_and_track_localized_data_return_value, ) mocker.patch.object( vapi_model, "save_revised_localized_product_fields", ) mocker.patch.object( vapi_model, "save_revised_localized_track_fields", ) vapi_logic._save_revised_localized_fields(product_with_revisions) assert vapi_logic._format_get_product_localization_response.mock_calls == ( expected__format_get_product_localization_response_calls ) assert vapi_logic._format_get_tracks_on_product_response.mock_calls == ( expected__format_get_tracks_on_product_response_calls ) assert vapi_logic._format_release_and_track_localized_data.mock_calls == ( expected__format_release_and_track_localized_data_calls ) assert vapi_model.save_revised_localized_product_fields.mock_calls == ( expected_save_revised_localized_product_fields_calls ) assert vapi_model.save_revised_localized_track_fields.mock_calls == ( expected_save_revised_localized_track_fields_calls ) @patch("product_review.logic.vapi._get_product_id") def test_only_apply_revisions_to_in_content_products(mock_get_product_id, mocker): """Test vapi logic skips non-in_content products.""" mock_get_product_id.return_value = 16 mocker.patch.object( ows_product_model, "get_product", return_value={"status": "transfer_to_content"} ) assert vapi_logic.vapi_apply_revisions_if_applicable(6) is False