"""Tests for Artist Url logic.""" from unittest.mock import MagicMock from oto import response from oto import status import pytest from social_analytics.constants import error from social_analytics.logic import artist_search from social_analytics.logic import artist_url from social_analytics.models import ( artist_url as artist_url_model) from social_analytics.models import metric from social_analytics.models import user_interaction @pytest.fixture def fixture_artist_social_profiles(): """Fixture with Artist Social Profiles.""" return response.Response({'items': [{ 'social_profile_id': 3, 'artist_id': 3, 'label_id': 3}]}) @pytest.fixture def fixture_artist_ids_and_social_profiles(): """Fixture with Social Profile Ids.""" return response.Response( {'items': [ { 'artist_id': 1, 'social_profiles': [ { 'social_profile_id': 3, 'platform': 'instagram', 'platform_id': 8910, 'platform_name': 'taylor_swift' }, { 'social_profile_id': 4, 'platform': 'facebook', 'platform_id': 678, 'platform_name': 'Taylor Swift' } ] }, { 'artist_id': 2, 'social_profiles': [ { 'social_profile_id': 5, 'platform': 'instagram', 'platform_id': 8910, 'platform_name': 'Angry Joe' } ] } ]} ) @pytest.fixture def latest_metrics(): """Fixture for latest metrics.""" return response.Response({ 'items': [ { 'social_profile_id': 3, 'metric': 'fan_count', 'platform': 'facebook', 'metric_value': 4598087.0 }, { 'social_profile_id': 4, 'metric': 'followers', 'platform': 'instagram', 'metric_value': 3898087.0 }, { 'social_profile_id': 5, 'metric': 'followed_by', 'platform': 'spotify', 'metric_value': 3898087.0 } ]}) @pytest.fixture def user_interactions(): """Fixture for latest metrics.""" return response.Response({ 'items': [ { 'user_id': 'alw:1010', 'artist_id': '57450', 'created_date': '2017-10-27T12:04:10.590820' } ]}) @pytest.fixture def deleted_social_profile(): """Fixture for deleted social profile.""" return response.Response( {'items': [{ 'url_id': 2, 'artist_id': 1, 'social_profile_id': None, 'site_id': 3, 'url': 'www.instagram.com/123' }]}) @pytest.fixture def fixture_artist_urls_not_found(): """Fixture with artist social profiles not found.""" return response.create_not_found_response() @pytest.fixture def fixture_error_bad_params(): """Fixture for error bad params.""" return response.create_error_response( status.BAD_REQUEST, error.ERROR_MESSAGE_BAD_PARAMS) @pytest.fixture def search_artist_headers(): """Fixture for artist search headers.""" return { 'Grass-Account-Type': 'vendor', 'Grass-Account-Id': 1 } @pytest.fixture def ows_search_response(): """Fixture for search artist response.""" return response.Response({'items': [ { 'artist_name': 'Test artist 1', 'artist_id': '1', 'highlight_fields': { 'artist_name': 'A Test' } }, { 'artist_name': 'Test artist 2', 'artist_id': '2', 'highlight_fields': { 'artist_name': 'Another Test' } }, { 'artist_name': 'Test artist 3', 'artist_id': '3', 'highlight_fields': { 'artist_name': 'Another Test 2' } } ]}) @pytest.fixture def search_artist_params(): """Fixture for artist search params.""" return { 'context': 'test', 'token': 'test', 'term': 'test' } def test_get_last_viewed_artists( monkeypatch, fixture_artist_ids_and_social_profiles, latest_metrics, user_interactions): """Test get linked artists.""" user_id = 'alw:1010' monkeypatch.setattr( user_interaction, 'get_user_interactions_by_user_id', MagicMock(return_value=user_interactions)) monkeypatch.setattr( artist_url_model, 'get_social_profile_ids_by_artist_ids', MagicMock(return_value=fixture_artist_ids_and_social_profiles)) monkeypatch.setattr( metric, 'get_latest_metrics_by_social_profile_ids', MagicMock( return_value=latest_metrics)) result = artist_url.get_last_viewed_artists(user_id) user_interaction.get_user_interactions_by_user_id.assert_called_once_with( user_id) (artist_url_model.get_social_profile_ids_by_artist_ids .assert_called_once_with([57450])) metric.get_latest_metrics_by_social_profile_ids.assert_called_once_with( [3, 4, 5]) assert result items = result.message['items'] assert items assert len(items) == 2 def test_get_last_viewed_artists_bad_params( monkeypatch, fixture_error_bad_params): """Test get linked artists bad params.""" user_id = '' monkeypatch.setattr( user_interaction, 'get_user_interactions_by_user_id', MagicMock(return_value=fixture_error_bad_params)) result = artist_url.get_last_viewed_artists(user_id) user_interaction.get_user_interactions_by_user_id.assert_called_once_with( user_id) assert not result def test_delete_social_profile(monkeypatch, deleted_social_profile): """Test delete social profile.""" monkeypatch.setattr(artist_url_model, 'clear_social_profile', MagicMock( return_value=deleted_social_profile)) social_profile_id = 11 artist_id = 1 result = artist_url.delete_social_profile(social_profile_id, artist_id) assert result for item in result.message['items']: assert not item['social_profile_id'] def test_delete_social_profile_bad_params( monkeypatch, fixture_error_bad_params): """Test delete social profile bad params.""" monkeypatch.setattr(artist_url_model, 'clear_social_profile', MagicMock( return_value=fixture_error_bad_params)) social_profile_id = None artist_id = 1 result = artist_url.delete_social_profile(social_profile_id, artist_id) assert not result assert result.status == status.BAD_REQUEST def test_delete_social_profile_not_found( monkeypatch, fixture_artist_urls_not_found): """Test delete social profile bad params.""" monkeypatch.setattr(artist_url_model, 'clear_social_profile', MagicMock( return_value=fixture_artist_urls_not_found)) social_profile_id = 15 artist_id = 1 result = artist_url.delete_social_profile(social_profile_id, artist_id) assert not result assert result.status == status.NOT_FOUND def test_search_artists_not_found( monkeypatch, search_artist_params, search_artist_headers, ows_search_response): """Test search artists.""" monkeypatch.setattr(artist_search, 'search_artist', MagicMock( return_value=ows_search_response)) monkeypatch.setattr( artist_url_model, 'get_artist_ids_that_have_profiles', MagicMock(return_value=response.create_not_found_response())) result = artist_url.search_artists( search_artist_params, search_artist_headers) assert not result assert result.status == status.NOT_FOUND def test_search_artists_ows_search_no_results( monkeypatch, search_artist_params, search_artist_headers): """Test search artists no ows search results.""" monkeypatch.setattr(artist_search, 'search_artist', MagicMock( return_value=response.create_not_found_response())) monkeypatch.setattr( artist_url_model, 'get_artist_ids_that_have_profiles', MagicMock(return_value=response.create_not_found_response())) result = artist_url.search_artists( search_artist_params, search_artist_headers) assert not result assert result.status == status.NOT_FOUND def test_search_artists( monkeypatch, search_artist_params, search_artist_headers): """Test search artists.""" monkeypatch.setattr(artist_search, 'search_artist', MagicMock( return_value=response.create_not_found_response())) monkeypatch.setattr( artist_url_model, 'get_artist_ids_that_have_profiles', MagicMock(return_value=response.create_not_found_response())) result = artist_url.search_artists( search_artist_params, search_artist_headers) assert not result assert result.status == status.NOT_FOUND