def test_prepare_build_async_does_not_call_mark_failed_for_canceled_build(self, subjobs):
        mock_project_lock = self.patch('threading.Lock').return_value
        build_scheduler_mock = self.patch('app.master.build_scheduler.BuildScheduler').return_value
        build_request_handler = BuildRequestHandler(build_scheduler_mock)
        build_mock = self.patch('app.master.build.Build').return_value
        build_mock.get_subjobs.return_value = subjobs
        build_mock.is_canceled = True
        build_mock.prepare.side_effect = AtomizerError

        build_request_handler._prepare_build_async(build_mock, mock_project_lock)

        self.assertFalse(build_mock.mark_failed.called, 'Build mark_failed should not be called for CANCELED build')
    def test_prepare_build_async_does_not_call_finish_for_canceled_or_error_build(self):
        subjobs = []
        mock_project_lock = self.patch('threading.Lock').return_value
        build_scheduler_mock = self.patch('app.master.build_scheduler.BuildScheduler').return_value
        build_request_handler = BuildRequestHandler(build_scheduler_mock)
        build_mock = self.patch('app.master.build.Build').return_value
        build_mock.is_stopped = True # this means the BuildState is CANCELED or ERROR
        build_mock.get_subjobs.return_value = subjobs

        build_request_handler._prepare_build_async(build_mock, mock_project_lock)

        self.assertFalse(build_mock.finish.called, 'Build finish should not be called for CANCELED build')
    def test_prepare_build_async_calls_finish_only_if_no_subjobs(self, subjobs, build_finish_called):
        mock_project_lock = self.patch('threading.Lock').return_value
        build_scheduler_mock = self.patch('app.master.build_scheduler.BuildScheduler').return_value
        build_request_handler = BuildRequestHandler(build_scheduler_mock)
        build_mock = self.patch('app.master.build.Build').return_value
        build_mock.is_stopped = False
        build_mock.get_subjobs.return_value = subjobs

        build_request_handler._prepare_build_async(build_mock, mock_project_lock)

        if build_finish_called:
            build_mock.finish.assert_called_once_with()
        else:
            self.assertFalse(build_mock.finish.called)
    def test_prepare_build_async_does_not_call_mark_failed_for_canceled_build(
            self, subjobs):
        mock_project_lock = self.patch('threading.Lock').return_value
        build_scheduler_mock = self.patch(
            'app.master.build_scheduler.BuildScheduler').return_value
        build_request_handler = BuildRequestHandler(build_scheduler_mock)
        build_mock = self.patch('app.master.build.Build').return_value
        build_mock.get_subjobs.return_value = subjobs
        build_mock.is_canceled = True
        build_mock.prepare.side_effect = AtomizerError

        build_request_handler._prepare_build_async(build_mock,
                                                   mock_project_lock)

        self.assertFalse(
            build_mock.mark_failed.called,
            'Build mark_failed should not be called for CANCELED build')
    def test_prepare_build_async_does_not_call_finish_for_canceled_or_error_build(
            self):
        subjobs = []
        mock_project_lock = self.patch('threading.Lock').return_value
        build_scheduler_mock = self.patch(
            'app.master.build_scheduler.BuildScheduler').return_value
        build_request_handler = BuildRequestHandler(build_scheduler_mock)
        build_mock = self.patch('app.master.build.Build').return_value
        build_mock.is_stopped = True  # this means the BuildState is CANCELED or ERROR
        build_mock.get_subjobs.return_value = subjobs

        build_request_handler._prepare_build_async(build_mock,
                                                   mock_project_lock)

        self.assertFalse(
            build_mock.finish.called,
            'Build finish should not be called for CANCELED build')
    def test_prepare_build_async_calls_finish_only_if_no_subjobs(
            self, subjobs, build_finish_called):
        mock_project_lock = self.patch('threading.Lock').return_value
        build_scheduler_mock = self.patch(
            'app.master.build_scheduler.BuildScheduler').return_value
        build_request_handler = BuildRequestHandler(build_scheduler_mock)
        build_mock = self.patch('app.master.build.Build').return_value
        build_mock.is_stopped = False
        build_mock.get_subjobs.return_value = subjobs

        build_request_handler._prepare_build_async(build_mock,
                                                   mock_project_lock)

        if build_finish_called:
            build_mock.finish.assert_called_once_with()
        else:
            self.assertFalse(build_mock.finish.called)