"""Unit tests for collector task.""" from unittest.mock import MagicMock from oto import response import pytest from social_analytics.logic import collector from social_analytics.models import artist_url from social_analytics.tasks import collectors @pytest.fixture def fixture_social_profiles(): """Fixture with Social Profiles.""" return response.Response( {'items': [ { 'social_profile_id': 1, 'platform': 'facebook', 'platform_id': '123a', 'label_id': '456' } ]} ) @pytest.fixture def fixture_tokens(): """Fixture with platform API tokens.""" return { 'facebook': '123', 'instagram': '345', 'spotify': '456' } def test_collect_facts_no_profiles_to_collect(monkeypatch): """Test collect facts.""" monkeypatch.setattr( artist_url, 'get_social_profiles_for_collection', MagicMock( return_value=[])) result = collectors.collect_facts() assert result is None def test_collect_facts(monkeypatch, fixture_social_profiles, fixture_tokens): """Test collect facts.""" # Mocking monkeypatch.setattr( artist_url, 'get_social_profiles_for_collection', MagicMock( return_value=fixture_social_profiles)) monkeypatch.setattr( collector, 'get_tokens', MagicMock(return_value=fixture_tokens)) collect_result = { 'social_profile_id': 1, 'platform': 'facebook', 'label_id': '456', 'data_response': { 'id': '5748157947', 'is_verified': True, 'fan_count': 968514, 'talking_about_count': 11471 } } monkeypatch.setattr( collector, 'collect', MagicMock(return_value=collect_result)) monkeypatch.setattr( collector, 'upload_raw_json_to_s3', MagicMock(return_value=[])) monkeypatch.setattr( collector, 'upload_metrics_json_to_s3', MagicMock(return_value=[])) # Tested function call result = collectors.collect_facts() # Assert method calls artist_url.get_social_profiles_for_collection.assert_called() collector.get_tokens.assert_called() # Assert called with a list because it will be the result of map collector.upload_metrics_json_to_s3.assert_called_with( [collect_result]) assert result assert result['expected_profiles_count'] == 1 assert result['actual_profiles_count'] == 1 assert result['errors_count'] == 0 def test_collect_facts_errors( monkeypatch, fixture_social_profiles, fixture_tokens): """Test collect facts.""" monkeypatch.setattr( artist_url, 'get_social_profiles_for_collection', MagicMock( return_value=fixture_social_profiles)) monkeypatch.setattr( collector, 'get_tokens', MagicMock(return_value=fixture_tokens)) monkeypatch.setattr( collector, 'upload_raw_json_to_s3', MagicMock( return_value=[{'error'}])) monkeypatch.setattr( collector, 'collect', MagicMock( return_value={ 'social_profile_id': 1, 'platform': 'facebook', 'label_id': '456', 'data_response': None, 'error': 'OAuth exception' })) monkeypatch.setattr( collector, 'upload_metrics_json_to_s3', MagicMock( return_value=[{'error'}])) result = collectors.collect_facts() assert result assert result['expected_profiles_count'] == 1 assert result['actual_profiles_count'] == 0 assert result['errors_count'] == 1 assert len(result['errors_upload_raw_data']) == 1 assert len(result['errors_upload_metrics_data']) == 1