From 09f94f5fa7c5863c49b6118612605722dbe1b64f Mon Sep 17 00:00:00 2001
From: Marc Shaw <mshaw@gitlab.com>
Date: Wed, 14 Feb 2024 20:51:40 +0900
Subject: [PATCH] Check every mergeability checks for detailed_merge_status

MR: gitlab.com/gitlab-org/gitlab/-/merge_requests/144729
---
 .../detailed_merge_status_enum.rb             |  6 ++++++
 .../detailed_merge_status_service.rb          |  4 ++--
 doc/api/graphql/reference/index.md            |  2 ++
 .../detailed_merge_status_service_spec.rb     | 20 +++++++++----------
 4 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/app/graphql/types/merge_requests/detailed_merge_status_enum.rb b/app/graphql/types/merge_requests/detailed_merge_status_enum.rb
index ada572f45e82..2d32bbe9148e 100644
--- a/app/graphql/types/merge_requests/detailed_merge_status_enum.rb
+++ b/app/graphql/types/merge_requests/detailed_merge_status_enum.rb
@@ -54,6 +54,12 @@ class DetailedMergeStatusEnum < BaseEnum
       value 'JIRA_ASSOCIATION',
             value: :jira_association_missing,
             description: 'Either the title or description must reference a Jira issue.'
+      value 'CONFLICT',
+            value: :conflict,
+            description: 'There are conflicts between the source and target branches.'
+      value 'NEED_REBASE',
+            value: :need_rebase,
+            description: 'Merge request needs to be rebased.'
     end
   end
 end
diff --git a/app/services/merge_requests/mergeability/detailed_merge_status_service.rb b/app/services/merge_requests/mergeability/detailed_merge_status_service.rb
index 2e28ffc43639..e4444fdaea9e 100644
--- a/app/services/merge_requests/mergeability/detailed_merge_status_service.rb
+++ b/app/services/merge_requests/mergeability/detailed_merge_status_service.rb
@@ -33,7 +33,7 @@ def execute
       attr_reader :merge_request, :checks, :ci_check
 
       def preparing?
-        merge_request.preparing? && !merge_request.merge_request_diff.persisted?
+        merge_request.preparing?
       end
 
       def checking?
@@ -48,7 +48,7 @@ def check_results
         strong_memoize(:check_results) do
           merge_request
             .execute_merge_checks(
-              MergeRequest.mergeable_state_checks,
+              MergeRequest.all_mergeability_checks,
               params: { skip_ci_check: true }
             )
         end
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 41e227a1c0b2..ef7d2e1b27b5 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -31203,11 +31203,13 @@ Detailed representation of whether a GitLab merge request can be merged.
 | <a id="detailedmergestatusci_must_pass"></a>`CI_MUST_PASS` | Pipeline must succeed before merging. |
 | <a id="detailedmergestatusci_still_running"></a>`CI_STILL_RUNNING` | Pipeline is still running. |
 | <a id="detailedmergestatuscommits_status"></a>`COMMITS_STATUS` | Source branch exists and contains commits. |
+| <a id="detailedmergestatusconflict"></a>`CONFLICT` | There are conflicts between the source and target branches. |
 | <a id="detailedmergestatusdiscussions_not_resolved"></a>`DISCUSSIONS_NOT_RESOLVED` | Discussions must be resolved before merging. |
 | <a id="detailedmergestatusdraft_status"></a>`DRAFT_STATUS` | Merge request must not be draft before merging. |
 | <a id="detailedmergestatusexternal_status_checks"></a>`EXTERNAL_STATUS_CHECKS` | Status checks must pass. |
 | <a id="detailedmergestatusjira_association"></a>`JIRA_ASSOCIATION` | Either the title or description must reference a Jira issue. |
 | <a id="detailedmergestatusmergeable"></a>`MERGEABLE` | Branch can be merged. |
+| <a id="detailedmergestatusneed_rebase"></a>`NEED_REBASE` | Merge request needs to be rebased. |
 | <a id="detailedmergestatusnot_approved"></a>`NOT_APPROVED` | Merge request must be approved before merging. |
 | <a id="detailedmergestatusnot_open"></a>`NOT_OPEN` | Merge request must be open before merging. |
 | <a id="detailedmergestatuspolicies_denied"></a>`POLICIES_DENIED` | There are denied policies for the merge request. |
diff --git a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb
index a3c5427ee825..3d0b341b1fae 100644
--- a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb
+++ b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb
@@ -5,6 +5,16 @@
 RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, feature_category: :code_review_workflow do
   subject(:detailed_merge_status) { described_class.new(merge_request: merge_request).execute }
 
+  let(:merge_request) { create(:merge_request) }
+
+  it 'calls every mergeability check' do
+    expect(merge_request).to receive(:execute_merge_checks)
+      .with(MergeRequest.all_mergeability_checks, any_args)
+      .and_call_original
+
+    detailed_merge_status
+  end
+
   context 'when merge status is cannot_be_merged_rechecking' do
     let(:merge_request) { create(:merge_request, merge_status: :cannot_be_merged_rechecking) }
 
@@ -23,16 +33,6 @@
     end
   end
 
-  context 'when merge status is preparing and merge request diff is persisted' do
-    let(:merge_request) { create(:merge_request, merge_status: :preparing) }
-
-    it 'returns :checking' do
-      allow(merge_request.merge_request_diff).to receive(:persisted?).and_return(true)
-
-      expect(detailed_merge_status).to eq(:mergeable)
-    end
-  end
-
   context 'when merge status is checking' do
     let(:merge_request) { create(:merge_request, merge_status: :checking) }
 
-- 
GitLab