"""Test for jobs logic tier.""" import datetime from unittest.mock import MagicMock from podcast.logic import email from podcast.logic import jobs from podcast.models import episode as episode_model from podcast.models import ows_analytics from podcast.models import user as user_model def test_episodes_gone_live_job(mock_current_admin_user): """Test episodes gone live job.""" now = datetime.datetime.utcnow() half_hour_ago = (now - datetime.timedelta(minutes=30)).strftime('%Y-%m-%dT%H:%M:%S.000Z') episode_model.update_episode(1, { 'published_date': half_hour_ago, 'draft': False }) episode_model.update_episode(2, { 'published_date': half_hour_ago, 'draft': False }) episode_model.update_episode(3, { 'published_date': half_hour_ago, 'draft': False }) jobs.episode_gone_live() assert email._send_sqs.call_count == 2 def test_episodes_gone_live_job_none(mock_current_admin_user): """Test episodes gone live job with no episodes.""" jobs.episode_gone_live() email._send_sqs.assert_not_called() def test_episodes_going_live_tomorrow_job(mock_current_admin_user): """Test episodes going live tomorrow job.""" now = datetime.datetime.utcnow() tomorrow = (now + datetime.timedelta(hours=24)).strftime('%Y-%m-%dT%H:%M:%S.000Z') episode_model.update_episode(1, { 'published_date': tomorrow, 'draft': False }) episode_model.update_episode(2, { 'published_date': tomorrow, 'draft': False }) episode_model.update_episode(3, { 'published_date': tomorrow, 'draft': False }) jobs.episode_going_live_tomorrow() assert email._send_sqs.call_count == 2 def test_episodes_going_live_tomorrow_job_none(mock_current_admin_user): """Test episodes going live tomorrow job with no episodes.""" jobs.episode_going_live_tomorrow() email._send_sqs.assert_not_called() def test_episode_spike_detection(mock_current_admin_user, monkeypatch): """Test episodes spike detection.""" spikes = [ { 'episode_id': 1, 'avg_listens_over_period': 1342.666667, 'num_listens_for_date': 15156, 'date': '09/16/2020', 'period': 90, 'percent_diff': 1128.798410841907 }, { 'episode_id': 2, 'avg_listens_over_period': 12, 'num_listens_for_date': 13, 'date': '09/16/2020', 'period': 90, 'percent_diff': 14 }, { 'episode_id': 3, 'avg_listens_over_period': 15, 'num_listens_for_date': 16, 'date': '09/16/2020', 'period': 90, 'percent_diff': 17 } ] monkeypatch.setattr(ows_analytics, 'get_episode_spikes', MagicMock(return_value={'items': spikes})) monkeypatch.setattr(email, 'send_podcast_spike_email', MagicMock()) todays_date = datetime.datetime.utcnow().strftime('%d %B %Y') jobs.episode_spike_detection(todays_date) podcast_1_data = { 'todays_date': todays_date, 'period': 90, 'podcast_title': 'title', 'network_title': 'Broccoli test', 'episode_spikes': [ { 'episode_title': 'title', 'episode_published_date': '01 June 2019', 'num_listens_for_date': 15156, 'date': '16 September 2020', 'percent_diff': 1128.798410841907, 'avg_listens_over_period': 1342.666667 }, { 'episode_title': 'title2', 'episode_published_date': '01 January 2018', 'num_listens_for_date': 13, 'date': '16 September 2020', 'percent_diff': 14, 'avg_listens_over_period': 12 }], 'insights_url': 'http://localhost:8080/analytics/podcasts/1/overview?via=email' } podcast_2_data = { 'todays_date': todays_date, 'period': 90, 'podcast_title': 'alpha title 1', 'network_title': 'Cowhead test', 'episode_spikes': [ { 'episode_title': 'Owned by podcast 2', 'episode_published_date': '01 January 2018', 'num_listens_for_date': 16, 'date': '16 September 2020', 'percent_diff': 17, 'avg_listens_over_period': 15 } ], 'insights_url': 'http://localhost:8080/analytics/podcasts/2/episodes/3/overview?via=email' } for access_to_both_user_id in [2, 4, 8]: email.send_podcast_spike_email.assert_any_call( user_model.get_user_by_id(access_to_both_user_id), podcast_1_data ) email.send_podcast_spike_email.assert_any_call( user_model.get_user_by_id(access_to_both_user_id), podcast_2_data ) email.send_podcast_spike_email.assert_any_call( user_model.get_user_by_id(11), podcast_1_data ) email.send_podcast_spike_email.assert_any_call( user_model.get_user_by_id(6), podcast_1_data ) email.send_podcast_spike_email.assert_any_call( user_model.get_user_by_id(1), podcast_1_data ) email.send_podcast_spike_email.assert_any_call( user_model.get_user_by_id(7), podcast_2_data )