def test_handle__execute_return_true_and_do_not_need_schedule(self): for loop, timeout, error_ignore, finish_call_success, on_retry in ( itertools.product((1, 2), (5, None), (True, False), (True, False), (True, False))): root_pipeline_data = 'root_pipeline_data' ex_data = 'ex_data' top_context = MockContext() process = MockPipelineProcess( root_pipeline_data=root_pipeline_data, top_pipeline_context=top_context) service_act = ServiceActObject( interval=None, execute_return=True, error_ignorable=error_ignore, timeout=timeout, need_schedule=False, result_bit=True, data=MockData(get_one_of_outputs_return={ 'ex_data': ex_data, ServiceActivity.result_bit: False }), on_retry=on_retry) status = MockStatus(loop=loop) with patch(PIPELINE_STATUS_GET, MagicMock(return_value=status)): with patch(PIPELINE_STATUS_FINISH, MagicMock(return_value=finish_call_success)): hdl_result = handlers.service_activity_handler( process, service_act, status) if loop > 1 and not on_retry: service_act.prepare_rerun_data.assert_called_once() top_context.recover_variable.assert_called_once() service_act.retry_at_current_exec.assert_not_called() else: service_act.prepare_rerun_data.assert_not_called() if on_retry: service_act.retry_at_current_exec.assert_called_once() self.assertEqual(service_act.data.inputs._loop, status.loop - 1) self.assertEqual(service_act.data.outputs._loop, status.loop - 1) service_act_h.hydrate_node_data.assert_called_once() if timeout: signals.service_activity_timeout_monitor_start.send.assert_called_once_with( sender=service_act.__class__, node_id=service_act.id, version=status.version, root_pipeline_id=process.root_pipeline.id, countdown=service_act.timeout) else: signals.service_activity_timeout_monitor_start.send.assert_not_called( ) service_act.execute.assert_called_once_with( root_pipeline_data) service_act.ignore_error.assert_not_called() service_act.data.set_outputs.assert_not_called() ScheduleService.objects.set_schedule.assert_not_called() top_context.extract_output.assert_has_calls( [mock.call(service_act)] * 2) if timeout: signals.service_activity_timeout_monitor_end.send.assert_called_once_with( sender=service_act.__class__, node_id=service_act.id, version=status.version) else: signals.service_activity_timeout_monitor_end.send.assert_not_called( ) Status.objects.finish.assert_called_once_with( service_act, False) if finish_call_success: self.assertEqual(hdl_result.next_node, service_act.next()) self.assertFalse(hdl_result.should_return) self.assertFalse(hdl_result.should_sleep) else: self.assertIsNone(hdl_result.next_node) self.assertFalse(hdl_result.should_return) self.assertTrue(hdl_result.should_sleep) service_act_h.hydrate_node_data.reset_mock() signals.service_activity_timeout_monitor_start.send.reset_mock( ) signals.service_activity_timeout_monitor_end.send.reset_mock( ) Status.objects.finish.reset_mock()
def test_handle__execute_raise_exception_and_not_ignore_error(self): for loop, timeout in (itertools.product((1, 2), (5, None))): root_pipeline_data = 'root_pipeline_data' ex_data = 'ex_data' top_context = MockContext() process = MockPipelineProcess( root_pipeline_data=root_pipeline_data, top_pipeline_context=top_context) service_act = ServiceActObject( interval=None, execute_exception=Exception(), error_ignorable=False, timeout=timeout, data=MockData(get_one_of_outputs_return=ex_data)) status = MockStatus(loop=loop) with patch(PIPELINE_STATUS_GET, MagicMock(return_value=status)): hdl_result = handlers.service_activity_handler( process, service_act, status) if loop > 1: service_act.prepare_rerun_data.assert_called_once() top_context.recover_variable.assert_called_once() else: service_act.prepare_rerun_data.assert_not_called() self.assertEqual(service_act.data.inputs._loop, status.loop - 1) self.assertEqual(service_act.data.outputs._loop, status.loop - 1) top_context.extract_output.assert_called_once_with(service_act) service_act_h.hydrate_node_data.assert_called_once() if timeout: signals.service_activity_timeout_monitor_start.send.assert_called_once_with( sender=service_act.__class__, node_id=service_act.id, version=status.version, root_pipeline_id=process.root_pipeline.id, countdown=service_act.timeout) else: signals.service_activity_timeout_monitor_start.send.assert_not_called( ) service_act.execute.assert_called_once_with(root_pipeline_data) self.assertIsNotNone(service_act.data.outputs.ex_data) service_act.data.get_one_of_outputs.assert_called_once_with( 'ex_data') Status.objects.fail.assert_called_once_with( service_act, ex_data) service_act.failure_handler.assert_called_once_with( process.root_pipeline.data) if timeout: signals.service_activity_timeout_monitor_end.send.assert_called_once_with( sender=service_act.__class__, node_id=service_act.id, version=status.version) else: signals.service_activity_timeout_monitor_end.send.assert_not_called( ) valve.send.assert_called_once_with( signals, 'activity_failed', sender=process.root_pipeline, pipeline_id=process.root_pipeline.id, pipeline_activity_id=service_act.id) self.assertIsNone(hdl_result.next_node) self.assertFalse(hdl_result.should_return) self.assertTrue(hdl_result.should_sleep) # reset mock service_act_h.hydrate_node_data.reset_mock() signals.service_activity_timeout_monitor_start.send.reset_mock( ) Status.objects.fail.reset_mock() signals.service_activity_timeout_monitor_end.send.reset_mock() valve.send.reset_mock()