def test_when_post_processor_fails(self):
        mock_exception = MockException()
        mock_post_processor = MagicMock(side_effect=mock_exception)
        mock_failure_handler_return_value = MagicMock()
        mock_failure_handler = MagicMock(
            return_value=mock_failure_handler_return_value)
        self.mock_step.failure_handler = mock_failure_handler
        self.mock_step.post_processor = mock_post_processor

        check_running_step(self.mock_step)

        mock_post_processor.assert_called_once_with(
            self.mock_step.environment, self.mock_step.context,
            self.mock_result.return_value)
        self.assertEqual(self.mock_step.state, Step.PAUSED_ON_FAIL)
        mock_failure_handler.assert_called_once_with(
            self.mock_step.environment, self.mock_step.context, mock_exception)
        self.assertEqual(self.mock_step.return_value,
                         mock_failure_handler_return_value)
        self.mock_log_step.assert_called_once_with(
            logging.debug, self.mock_step,
            ('Step has failed. Changed state to: {}. Setting return value to: {}'
             ).format(Step.PAUSED_ON_FAIL, mock_failure_handler_return_value))
        self.assertEqual(self.mock_skip_progeny.call_count, 0)
        self.mock_collect_output_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.mock_collect_prompt_messages_from_step.assert_called_once_with(
            self.mock_step)
    def test_when_step_fails_and_progeny_need_to_be_skipped(self):
        self.mock_result.result = Step.FAILURE
        self.mock_result.return_value = 'mock_return_value'
        self.mock_step.skip_progeny_on_failure = True
        self.mock_step.state = Step.RUN
        self.mock_step.return_value = None
        self.mock_step.result_queue.get_nowait = MagicMock(
            return_value=self.mock_result)

        check_running_step(self.mock_step)

        self.mock_failure_handler.assert_called_once_with(
            self.mock_step.environment, self.mock_step.context,
            self.mock_result.return_value)
        self.assertEqual(self.mock_step.state, Step.PAUSED_ON_FAIL)
        self.assertEqual(self.mock_step.return_value,
                         self.mock_failed_return_value)
        self.mock_log_step.assert_called_once_with(
            logging.debug, self.mock_step,
            ('Step has failed. Changed state to: {}. Setting return value to: {}'
             ).format(Step.PAUSED_ON_FAIL, self.mock_failed_return_value))
        self.mock_skip_progeny.assert_called_once_with(self.mock_step)
        self.mock_collect_output_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.mock_collect_prompt_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.assertEqual(self.mock_post_processor.call_count, 0)
    def test_when_step_does_not_return_a_result(self):
        self.mock_step.result_queue.get_nowait = MagicMock(
            side_effect=QueueEmpty)

        check_running_step(self.mock_step)

        self.assertNotEqual(self.mock_step.state, 'mock_result')
        self.assertNotEqual(self.mock_step.return_value, 'mock_return_value')
        self.assertEqual(self.mock_log_step.call_count, 0)
        self.assertEqual(self.mock_skip_progeny.call_count, 0)
        self.mock_collect_output_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.mock_collect_prompt_messages_from_step.assert_called_once_with(
            self.mock_step)
    def test_when_step_returns_result(self):
        check_running_step(self.mock_step)

        self.assertEqual(self.mock_step.state, 'mock_result')
        self.assertEqual(self.mock_step.return_value, 'mock_return_value')
        self.mock_log_step.assert_called_once_with(
            logging.debug, self.mock_step,
            ('Step has completed. Changed state to: mock_result. Setting return value to: mock_return_value'
             ))
        self.assertEqual(self.mock_skip_progeny.call_count, 0)
        self.mock_collect_output_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.mock_collect_prompt_messages_from_step.assert_called_once_with(
            self.mock_step)
    def test_when_step_returns_result(self):
        check_running_step(self.mock_step)

        self.mock_post_processor.assert_called_once_with(
            self.mock_step.environment, self.mock_step.context,
            self.mock_result.return_value)
        self.assertEqual(self.mock_step.state, Step.SUCCESS)
        self.assertEqual(self.mock_step.return_value, self.mock_return_value)
        self.mock_log_step.assert_called_once_with(
            logging.debug, self.mock_step,
            ('Step has succeeded. Changed state to: {}. Setting return value to: {}'
             .format(Step.SUCCESS, self.mock_return_value)))
        self.assertEqual(self.mock_skip_progeny.call_count, 0)
        self.assertEqual(self.mock_failure_handler.call_count, 0)
        self.mock_collect_output_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.mock_collect_prompt_messages_from_step.assert_called_once_with(
            self.mock_step)
    def test_when_step_fails_and_progeny_need_to_be_skipped(self):
        self.mock_result.result = Step.FAILURE
        self.mock_result.return_value = 'mock_return_value'
        self.mock_step.skip_progeny_on_failure = True
        self.mock_step.state = Step.RUN
        self.mock_step.return_value = None
        self.mock_step.result_queue.get_nowait = MagicMock(
            return_value=self.mock_result)

        check_running_step(self.mock_step)

        self.assertEqual(self.mock_step.state, Step.FAILURE)
        self.assertEqual(self.mock_step.return_value, 'mock_return_value')
        self.mock_log_step.assert_called_once_with(
            logging.debug, self.mock_step,
            ('Step has completed. Changed state to: {}. Setting return value to: mock_return_value'
             ).format(Step.FAILURE))
        self.mock_skip_progeny.assert_called_once_with(self.mock_step)
        self.mock_collect_output_messages_from_step.assert_called_once_with(
            self.mock_step)
        self.mock_collect_prompt_messages_from_step.assert_called_once_with(
            self.mock_step)