Skip to content
Snippets Groups Projects
Commit fa8af416 authored by Marc Shaw's avatar Marc Shaw :two:
Browse files

Auto-merge when bypassing requested changes and MWCP is set

MR: gitlab.com/gitlab-org/gitlab/-/merge_requests/153400
parent f0895de8
No related branches found
No related tags found
2 merge requests!162233Draft: Script to update Topology Service Gem,!153400Merge MR after bypassing requested changes check when it's set to MWCP
# frozen_string_literal: true
module MergeRequests
class OverrideRequestedChangesStateEvent < Gitlab::EventStore::Event
def schema
{
'type' => 'object',
'required' => %w[
current_user_id
merge_request_id
],
'properties' => {
'current_user_id' => { 'type' => 'integer' },
'merge_request_id' => { 'type' => 'integer' }
}
}
end
end
end
......@@ -75,6 +75,14 @@ def handle_override_requested_changes(merge_request, changed_fields)
::SystemNoteService.override_requested_changes(merge_request, current_user, override_requested_changes.last)
trigger_merge_request_status_updated(merge_request)
return unless ::Feature.enabled?(:additional_merge_when_checks_ready, merge_request.project)
::Gitlab::EventStore.publish(
::MergeRequests::OverrideRequestedChangesStateEvent.new(
data: { current_user_id: current_user.id, merge_request_id: merge_request.id }
)
)
end
end
end
......
......@@ -33,6 +33,8 @@ def configure!(store)
store.subscribe ::MergeRequests::ProcessAutoMergeFromEventWorker,
to: ::MergeRequests::ExternalStatusCheckPassedEvent
store.subscribe ::MergeRequests::ProcessAutoMergeFromEventWorker, to: ::MergeRequests::UnblockedStateEvent
store.subscribe ::MergeRequests::ProcessAutoMergeFromEventWorker,
to: ::MergeRequests::OverrideRequestedChangesStateEvent
store.subscribe ::MergeRequests::ProcessAutoMergeFromEventWorker, to: ::MergeRequests::ApprovedEvent
store.subscribe ::MergeRequests::ProcessAutoMergeFromEventWorker, to: ::MergeRequests::DraftStateChangeEvent
store.subscribe ::Search::ElasticDefaultBranchChangedWorker,
......
......@@ -15,6 +15,7 @@
::MergeRequests::ApprovalsResetEvent,
::MergeRequests::DraftStateChangeEvent,
::MergeRequests::UnblockedStateEvent,
::MergeRequests::OverrideRequestedChangesStateEvent,
::GitlabSubscriptions::RenewedEvent,
::Repositories::DefaultBranchChangedEvent,
::NamespaceSettings::AiRelatedSettingsChangedEvent,
......
......@@ -131,6 +131,27 @@ def update_merge_request(opts)
update_merge_request(override_requested_changes: true)
end
it 'publishes a OverrideRequestedChanges state event' do
expect do
update_merge_request(override_requested_changes: true)
end.to publish_event(MergeRequests::OverrideRequestedChangesStateEvent).with({
current_user_id: current_user.id,
merge_request_id: merge_request.id
})
end
context 'when additional_merge_when_checks_ready ff is off' do
before do
stub_feature_flags(additional_merge_when_checks_ready: false)
end
it 'does not publish a OverrideRequestedChanges state event' do
expect do
update_merge_request(override_requested_changes: true)
end.not_to publish_event(MergeRequests::OverrideRequestedChangesStateEvent)
end
end
it_behaves_like 'triggers GraphQL subscription mergeRequestMergeStatusUpdated' do
let(:action) { update_merge_request(override_requested_changes: true) }
end
......
......@@ -7,50 +7,68 @@
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:merge_request) { create(:merge_request, source_project: project, merge_user: user) }
let(:merge_request_id) { merge_request.id }
let(:data) { { current_user_id: user.id, merge_request_id: merge_request.id } }
let(:approved_event) { MergeRequests::ApprovedEvent.new(data: data) }
let(:data) { { current_user_id: user.id, merge_request_id: merge_request_id } }
it_behaves_like 'subscribes to event' do
let(:event) { approved_event }
shared_examples 'process auto merge from event worker' do
it_behaves_like 'subscribes to event' do
it 'calls AutoMergeService' do
expect_next_instance_of(
AutoMergeService,
project, user
) do |service|
expect(service).to receive(:process).with(merge_request)
end
it 'calls AutoMergeService' do
expect_next_instance_of(
AutoMergeService,
project, user
) do |service|
expect(service).to receive(:process).with(merge_request)
consume_event(subscriber: described_class, event: event)
end
consume_event(subscriber: described_class, event: approved_event)
end
context 'when the merge request does not exist' do
let(:merge_request_id) { -1 }
it 'logs and does not call AutoMergeService' do
expect(Sidekiq.logger).to receive(:info).with(
hash_including('message' => 'Merge request not found.', 'merge_request_id' => merge_request_id)
)
expect(AutoMergeService).not_to receive(:new)
context 'when the merge request does not exist' do
before do
merge_request.destroy!
expect { consume_event(subscriber: described_class, event: event) }
.not_to raise_exception
end
end
it 'logs and does not call AutoMergeService' do
expect(Sidekiq.logger).to receive(:info).with(
hash_including('message' => 'Merge request not found.', 'merge_request_id' => merge_request.id)
)
expect(AutoMergeService).not_to receive(:new)
context 'when feature flag "merge_when_checks_pass" is disabled' do
before do
stub_feature_flags(merge_when_checks_pass: false)
end
expect { consume_event(subscriber: described_class, event: approved_event) }
.not_to raise_exception
it "doesn't call AutoMergeService" do
expect(AutoMergeService).not_to receive(:new)
consume_event(subscriber: described_class, event: event)
end
end
end
end
context 'when feature flag "merge_when_checks_pass" is disabled' do
before do
stub_feature_flags(merge_when_checks_pass: false)
end
it_behaves_like 'process auto merge from event worker' do
let(:event) { MergeRequests::ApprovedEvent.new(data: data) }
end
it "doesn't call AutoMergeService" do
expect(AutoMergeService).not_to receive(:new)
it_behaves_like 'process auto merge from event worker' do
let(:event) { ::MergeRequests::DraftStateChangeEvent.new(data: data) }
end
consume_event(subscriber: described_class, event: approved_event)
end
end
it_behaves_like 'process auto merge from event worker' do
let(:event) { ::MergeRequests::UnblockedStateEvent.new(data: data) }
end
it_behaves_like 'process auto merge from event worker' do
let(:event) { ::MergeRequests::ExternalStatusCheckPassedEvent.new(data: data) }
end
it_behaves_like 'process auto merge from event worker' do
let(:event) { ::MergeRequests::OverrideRequestedChangesStateEvent.new(data: data) }
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment