diff options
Diffstat (limited to 'spec/features/merge_request/real_time_merge_widget_spec.rb')
-rw-r--r-- | spec/features/merge_request/real_time_merge_widget_spec.rb | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/spec/features/merge_request/real_time_merge_widget_spec.rb b/spec/features/merge_request/real_time_merge_widget_spec.rb new file mode 100644 index 00000000000..299651feb53 --- /dev/null +++ b/spec/features/merge_request/real_time_merge_widget_spec.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Merge request > Real-time merge widget', :js, feature_category: :code_review_workflow do + let_it_be_with_reload(:project) { create(:project, :public, :repository) } + let(:user) { project.creator } + let(:merge_request) { create(:merge_request, :simple, source_project: project, author: user) } + + before do + sign_in(user) + visit project_merge_request_path(project, merge_request) + end + + context 'when merge status changes' do + let(:trigger_action) do + # There are different service classes that can change the merge_status + # so we simulate it here. + merge_request.mark_as_unchecked! + GraphqlTriggers.merge_request_merge_status_updated(merge_request) + end + + let(:widget_text) { s_('mrWidget|Checking if merge request can be merged…') } + + it_behaves_like 'updates merge widget in real-time' + end + + context 'when MR gets closed' do + let(:trigger_action) do + MergeRequests::CloseService + .new(project: project, current_user: user) + .execute(merge_request) + end + + let(:widget_text) { s_('mrWidget|Closed by') } + + it_behaves_like 'updates merge widget in real-time' + end + + context 'when MR gets marked as draft' do + let(:trigger_action) do + MergeRequests::UpdateService + .new(project: project, current_user: user, params: { title: 'Draft: title' }) + .execute(merge_request) + end + + let(:widget_text) { 'Merge blocked: Select Mark as ready to remove it from Draft status.' } + + it_behaves_like 'updates merge widget in real-time' + end + + context 'when MR gets approved' do + let(:trigger_action) do + MergeRequests::ApprovalService + .new(project: project, current_user: user) + .execute(merge_request) + end + + let(:widget_text) { _('Ready to merge!') } + + before do + merge_request.update!(approvals_before_merge: 1) + end + + it_behaves_like 'updates merge widget in real-time' + end + + context 'when a new discussion is started and all threads must be resolved before merge' do + let(:trigger_action) do + Notes::CreateService.new(project, user, { + merge_request_diff_head_sha: merge_request.diff_head_sha, + noteable_id: merge_request.id, + noteable_type: merge_request.class.name, + note: 'Unresolved discussion', + type: 'DiscussionNote' + }).execute + end + + let(:widget_text) { s_('mrWidget|Merge blocked: all threads must be resolved.') } + + before do + project.update!(only_allow_merge_if_all_discussions_are_resolved: true) + end + + it_behaves_like 'updates merge widget in real-time' + end +end |