"""Unit tests for Music Analytics report flow.""" from unittest import TestCase from unittest.mock import MagicMock from garcon.activity import Activity from feed_ingestion.flows.music_analytics_reports.flow import Flow class TestFlow(TestCase): """Test music_analytics flow.""" schedule = MagicMock() activity_result = MagicMock() schedule.return_value = activity_result flow = Flow() def test_decider(self): """Test the flow decider.""" self.schedule.reset_mock() self.activity_result.result = { 'bootstrap.date': '2022-12-07', } activities, scheduled_activities = [ 'bootstrap', 'get_report_file', 'load_report_to_s3', 'set_status_to_downloaded', 'create_temp_staging_raw_table', 'load_temp_staging_raw_table', 'load_staging_raw_table', 'set_overall_status_ingested'], [] self.flow.decider(self.schedule) for (name, activity), requires in self.schedule.call_args_list: self.assertIn(name, activities) self.assertIsInstance(activity, Activity) scheduled_activities.append(name) self.assertEqual(scheduled_activities, activities) def test_decider_unavailable_report(self): """Test the flow decider when get_report_file returns stop.""" self.schedule.reset_mock() activities, scheduled_activities = [ 'bootstrap', 'get_report_file'], [] self.activity_result.result = { 'get_report_file.stop': 'True' } self.flow.decider(self.schedule) for (name, activity), _ in self.schedule.call_args_list: self.assertIn(name, activities) scheduled_activities.append(name) self.assertEqual(scheduled_activities, activities) def test_decider_already_ingested(self): """Test the flow decider when bootstrap returns stop.""" self.schedule.reset_mock() activity = 'bootstrap' self.activity_result.result = {'bootstrap.stop': True} self.flow.decider(self.schedule) self.assertEqual(len(self.schedule.call_args_list), 1) self.assertEqual(self.schedule.call_args_list[0][0][0], activity) self.assertIsInstance(self.schedule.call_args_list[0][0][1], Activity)