diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index af2175f2104e2328c9e8c50209fac4c43a4fe64f..0c79c0edde52b56c7da8720caa03b7411090e7ab 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -260,7 +260,7 @@ def self.available_state_names state_machine :merge_status, initial: :unchecked do event :mark_as_preparing do - transition unchecked: :preparing + transition [:unchecked, :can_be_merged] => :preparing end event :mark_as_unchecked do diff --git a/app/models/merge_requests/merge_data.rb b/app/models/merge_requests/merge_data.rb index 9d5c7a0823d17413d68bb197cb3e9b755ce94c2a..4e5db754f85afb480054de61ab3dc210a567a1d6 100644 --- a/app/models/merge_requests/merge_data.rb +++ b/app/models/merge_requests/merge_data.rb @@ -40,7 +40,7 @@ class MergeData < ApplicationRecord state_machine :merge_status, initial: :unchecked do event :mark_as_preparing do - transition unchecked: :preparing + transition [:unchecked, :can_be_merged] => :preparing end event :mark_as_unchecked do diff --git a/app/services/suggestions/apply_service.rb b/app/services/suggestions/apply_service.rb index 43c178295bb0129e2a264c19f29d42944f6240e3..79737854380a78d0a03d86c72f951c6d2235532f 100644 --- a/app/services/suggestions/apply_service.rb +++ b/app/services/suggestions/apply_service.rb @@ -23,6 +23,7 @@ def execute def result multi_service.execute.tap do |result| update_suggestions(result) + update_associated_merge_request(result) end end @@ -36,6 +37,12 @@ def update_suggestions(result) .track_apply_suggestion_action(user: current_user, suggestions: suggestion_set.suggestions) end + def update_associated_merge_request(result) + return unless result[:status] == :success + + suggestion_set.merge_request.mark_as_preparing + end + def author authors = suggestion_set.authors diff --git a/lib/gitlab/suggestions/suggestion_set.rb b/lib/gitlab/suggestions/suggestion_set.rb index 21a5acf8afe49faa70becad254148a348e9d16ea..2e91fe4c6808e5fdc56730286f29621c7faa0c89 100644 --- a/lib/gitlab/suggestions/suggestion_set.rb +++ b/lib/gitlab/suggestions/suggestion_set.rb @@ -21,6 +21,10 @@ def branch first_suggestion.branch end + def merge_request + first_suggestion.noteable + end + def valid? error_message.nil? end diff --git a/spec/lib/gitlab/suggestions/suggestion_set_spec.rb b/spec/lib/gitlab/suggestions/suggestion_set_spec.rb index 4a822717c78863bec71024e9ad3d1d437386b679..a43f09d0bc96996d6203d90f33ccce7b6a04a1d6 100644 --- a/spec/lib/gitlab/suggestions/suggestion_set_spec.rb +++ b/spec/lib/gitlab/suggestions/suggestion_set_spec.rb @@ -74,6 +74,12 @@ def create_suggestion(file_path, new_line, to_content) end end + describe '#merge_request' do + it 'returns the merge_request associated with the suggestions' do + expect(suggestion_set.merge_request).to eq(merge_request) + end + end + describe '#valid?' do it 'returns true if no errors are found' do expect(suggestion_set.valid?).to be(true) diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 97764ed2bbfe60c4311284588ea0ef4cb57e122c..06ff0ad8a9dae344a1c85f9c66930fe4a70ce2a6 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -5869,14 +5869,15 @@ def transition! it_behaves_like 'transition not triggering mergeRequestMergeStatusUpdated GraphQL subscription' end - context 'when the status is checking' do - let(:merge_status) { :checking } + context 'when the status is can_be_merged' do + let(:merge_status) { :can_be_merged } - include_examples 'for an invalid state transition' + include_examples 'for a valid state transition' + it_behaves_like 'transition not triggering mergeRequestMergeStatusUpdated GraphQL subscription' end - context 'when the status is can_be_merged' do - let(:merge_status) { :can_be_merged } + context 'when the status is checking' do + let(:merge_status) { :checking } include_examples 'for an invalid state transition' end diff --git a/spec/models/merge_requests/merge_data_spec.rb b/spec/models/merge_requests/merge_data_spec.rb index 7f1af1544ff419171b0fd89892f111f25f8a0035..f22e2bb4119392ab4e4a566b9a398db0c26cb40c 100644 --- a/spec/models/merge_requests/merge_data_spec.rb +++ b/spec/models/merge_requests/merge_data_spec.rb @@ -75,7 +75,7 @@ def transition! context 'when the status is can_be_merged' do let(:merge_status) { :can_be_merged } - include_examples 'for an invalid state transition' + include_examples 'for a valid state transition' end context 'when the status is cannot_be_merged_recheck' do diff --git a/spec/services/suggestions/apply_service_spec.rb b/spec/services/suggestions/apply_service_spec.rb index 1f950548185b27de2bb5534cec0fefdc04d14839..81dc8c2e2523e8a1f3402beac756969e511f2a57 100644 --- a/spec/services/suggestions/apply_service_spec.rb +++ b/spec/services/suggestions/apply_service_spec.rb @@ -76,6 +76,13 @@ def apply(suggestions, custom_message = nil) expect(commit.committer_name).to eq(user.name) end + it 'transitions MR state to preparing' do + expect do + apply(suggestions) + merge_request.reload + end.to change { merge_request.merge_status }.from('can_be_merged').to('preparing') + end + it 'tracks apply suggestion event' do expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) .to receive(:track_apply_suggestion_action) @@ -636,6 +643,9 @@ def popen(cmd, path=nil) message: "You are not allowed to push into this branch", status: :error ) + + expect(merge_request) + .not_to receive(:mark_as_preparing) end end end