"""Unit tests for Apple Podcasts Subscription Events Workflow.""" from unittest.mock import MagicMock from unittest.mock import patch from garcon.activity import Activity import pytest from feed_ingestion.flows.apple_podcasts_subscription_events.flow \ import Flow @pytest.fixture def mock_garcon_feed_status(): """Yield garcon_feed_status.""" path = 'feed_ingestion.flows.apple_podcasts_subscription_events.' \ 'flow.garcon_feed_status' with patch(path) as garcon_feed_status: garcon_feed_status.STATUS_DOWNLOADED = False yield garcon_feed_status def test_decider(mock_garcon_feed_status): """Test decider method.""" activity_result = MagicMock() activity_result.result.get.return_value = False schedule = MagicMock() schedule.return_value = activity_result # list of activities activity_names = { 'bootstrap', 'reporter_to_s3', 'set_status_to_downloaded', 'load_staging_raw_table', 'set_status_to_populated_raw_table', 'load_subscription_events_table', 'set_status_to_ingested' } # test activities are called flow = Flow() flow.decider(schedule) scheduled_activities = set() for (name, activity), _ in schedule.call_args_list: assert name in activity_names assert isinstance(activity, Activity) scheduled_activities.add(name) assert scheduled_activities == activity_names # test flow stops if data is already ingested schedule.reset_mock() activity_result.result.get.return_value = {'stop': True} activity_names = {'bootstrap'} flow.decider(schedule) scheduled_activities = set() for (name, activity), _ in schedule.call_args_list: assert name in activity_names assert isinstance(activity, Activity) scheduled_activities.add(name) assert scheduled_activities == activity_names