"""Unit tests for spike detector workflow activities.""" from unittest.mock import MagicMock from freezegun import freeze_time from garcon.activity import Activity import pytest from activity_detector.flows.spike_detector.flow import Flow class TestFlow(object): """Tests for Flow.""" @pytest.fixture def flow(self): """Create flow.""" return Flow() @pytest.fixture def mock_schedule_do_not_run(self, mock_schedule): """Mock schedule for not rebuilding view.""" mock_schedule.return_value = MagicMock( result={'check_dynamo_status.should_run': False}) return mock_schedule @pytest.fixture def run_flow(self, flow, mock_schedule, mock_context): """Run flow.""" flow.decider(mock_schedule, mock_context) @pytest.fixture def run_flow_do_not_run( self, flow, mock_schedule_do_not_run, mock_context): """Stop running flow.""" flow.decider(mock_schedule_do_not_run, mock_context) def test_decider_schedules_bootstrap( self, mock_schedule, run_flow): """Test decider schedules activity bootstrap.""" (name, activity), _ = mock_schedule.call_args_list[0] assert name == 'bootstrap' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'bootstrap' def test_decider_schedules_check_dynamo_status( self, mock_schedule, run_flow): """Test decider schedules activity check_dynamo_status.""" (name, activity), _ = mock_schedule.call_args_list[1] assert name == 'check_dynamo_status' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'check_dynamo_status' def test_decider_schedules_populate_temp_activity_history_table( self, mock_schedule, run_flow): """Test decider schedules activity populate_temp_activity_history_table.""" (name, activity), _ = mock_schedule.call_args_list[2] assert name == 'populate_temp_activity_history_table' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'create_temp_activity' \ '_history_table' def test_decider_schedules_populate_activity_history_table( self, mock_schedule, run_flow): """Test decider schedules activity populate_activity_history_table.""" (name, activity), _ = mock_schedule.call_args_list[3] assert name == 'populate_activity_history_table' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'populate_activity_history' \ '_table' def test_decider_schedules_drop_temp_table( self, mock_schedule, run_flow): """Test decider schedules activity drop_temp_table.""" (name, activity), _ = mock_schedule.call_args_list[4] assert name == 'drop_temp_table' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'drop_temp_table' def test_decider_schedules_detect_spikes_label( self, mock_schedule, run_flow): """Test decider schedules activity detect_spikes_label.""" (name, activity), _ = mock_schedule.call_args_list[5] assert name == 'detect_spikes_label' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'detect_spikes' def test_decider_schedules_detect_spikes_subaccount( self, mock_schedule, run_flow): """Test decider schedules activity detect_spikes_subaccount.""" (name, activity), _ = mock_schedule.call_args_list[6] assert name == 'detect_spikes_subaccount' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'detect_spikes' def test_decider_schedules_set_dynamo_status( self, mock_schedule, run_flow): """Test decider schedules activity set_dynamo_status.""" (name, activity), _ = mock_schedule.call_args_list[7] assert name == 'set_dynamo_status' assert isinstance(activity, Activity) assert activity.runner.tasks[0].__name__ == 'set_dynamo_status' def test_workflow_id_contains_view_name(self, flow): """Test workflow_id contains view name.""" workflow_id = flow.workflow_id({'context_date': '1970-01-01'}) assert workflow_id == '{flow_name}-{date}'.format( flow_name=flow.name, date='1970-01-01') @freeze_time('2017-10-04') def test_workflow_id_no_context_date(self, flow): """Test workflow_id contains view name.""" workflow_id = flow.workflow_id({}) assert workflow_id == '{flow_name}-{date}'.format( flow_name=flow.name, date='2017-10-02') def test_decider_stops_after_check_dynamo_status( self, mock_schedule_do_not_run, run_flow_do_not_run): """Test decider stops after check_dynamo_status.""" assert mock_schedule_do_not_run.call_count == 2