Skip to content
Snippets Groups Projects
Commit 03d48ae8 authored by Jose Ivan Vargas's avatar Jose Ivan Vargas :palm_tree:
Browse files

Merge branch 'jivanvl-remove-auto-merge-labels-ff' into 'master'

Draft: Remove the auto_merge_labels_mr_widget feature flag

See merge request gitlab-org/gitlab!120922



Merged-by: Jose Ivan Vargas's avatarJose Ivan Vargas <jvargas@gitlab.com>
parents 3f1cb40d 6b54b3ec
No related branches found
No related tags found
No related merge requests found
Showing
with 41 additions and 714 deletions
......@@ -27,7 +27,6 @@ import readyToMergeSubscription from '~/vue_merge_request_widget/queries/states/
import HelpPopover from '~/vue_shared/components/help_popover.vue';
import {
AUTO_MERGE_STRATEGIES,
WARNING,
MT_MERGE_STRATEGY,
PIPELINE_FAILED_STATE,
STATE_MACHINE,
......@@ -42,7 +41,6 @@ import CommitMessageDropdown from './commit_message_dropdown.vue';
import SquashBeforeMerge from './squash_before_merge.vue';
import MergeFailedPipelineConfirmationDialog from './merge_failed_pipeline_confirmation_dialog.vue';
const PIPELINE_RUNNING_STATE = 'running';
const PIPELINE_PENDING_STATE = 'pending';
const PIPELINE_SUCCESS_STATE = 'success';
......@@ -133,8 +131,6 @@ export default {
GlFormCheckbox,
GlSkeletonLoader,
MergeFailedPipelineConfirmationDialog,
MergeTrainHelperIcon: () =>
import('ee_component/vue_merge_request_widget/components/merge_train_helper_icon.vue'),
MergeImmediatelyConfirmationDialog: () =>
import(
'ee_component/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue'
......@@ -244,30 +240,11 @@ export default {
return PIPELINE_SUCCESS_STATE;
},
iconClass() {
if (this.shouldRenderMergeTrainHelperIcon && !this.mr.preventMerge) {
return PIPELINE_RUNNING_STATE;
}
if (
this.status === PIPELINE_FAILED_STATE ||
!this.commitMessage.length ||
!this.isMergeAllowed ||
this.mr.preventMerge
) {
return WARNING;
}
return PIPELINE_SUCCESS_STATE;
},
mergeButtonText() {
if (this.isMergingImmediately) {
return __('Merge in progress');
}
if (this.isAutoMergeAvailable && !this.autoMergeLabelsEnabled) {
return this.autoMergeTextLegacy;
}
if (this.isAutoMergeAvailable && this.autoMergeLabelsEnabled) {
if (this.isAutoMergeAvailable) {
return this.autoMergeText;
}
......@@ -277,9 +254,6 @@ export default {
return __('Merge');
},
autoMergeLabelsEnabled() {
return window.gon?.features?.autoMergeLabelsMrWidget;
},
showAutoMergeHelperText() {
return (
!(this.status === PIPELINE_FAILED_STATE || this.isPipelineFailed) &&
......@@ -695,18 +669,19 @@ export default {
@cancel="isPipelineFailedModalVisibleNormalMerge = false"
/>
</gl-button-group>
<merge-train-helper-icon
v-if="shouldRenderMergeTrainHelperIcon && !autoMergeLabelsEnabled"
class="gl-mx-3"
/>
<template v-if="showAutoMergeHelperText && autoMergeLabelsEnabled">
<template v-if="showAutoMergeHelperText">
<div
class="gl-ml-4 gl-text-gray-500 gl-font-sm"
data-qa-selector="auto_merge_helper_text"
data-testid="auto-merge-helper-text"
>
{{ autoMergeHelperText }}
</div>
<help-popover class="gl-ml-2" :options="autoMergeHelpPopoverOptions">
<help-popover
class="gl-ml-2"
:options="autoMergeHelpPopoverOptions"
data-testid="auto-merge-helper-text-icon"
>
<gl-sprintf :message="autoMergePopoverSettings.bodyText">
<template #link="{ content }">
<gl-link
......
......@@ -31,10 +31,6 @@ export default {
pipelineMustSucceedConflictText() {
return PIPELINE_MUST_SUCCEED_CONFLICT_TEXT;
},
autoMergeTextLegacy() {
// MWPS is currently the only auto merge strategy available in CE
return __('Merge when pipeline succeeds');
},
autoMergeText() {
return __('Set to auto-merge');
},
......
......@@ -51,7 +51,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:saved_replies, current_user)
push_frontend_feature_flag(:code_quality_inline_drawer, project)
push_frontend_feature_flag(:hide_create_issue_resolve_all, project)
push_frontend_feature_flag(:auto_merge_labels_mr_widget, project)
push_force_frontend_feature_flag(:summarize_my_code_review, summarize_my_code_review_enabled?)
push_frontend_feature_flag(:mr_activity_filters, current_user)
end
......
---
name: auto_merge_labels_mr_widget
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115436
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/409530
milestone: '15.11'
type: development
group: group::pipeline execution
default_enabled: true
<script>
import { GlIcon, GlLink, GlPopover } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
export default {
name: 'MergeTrainHelperIcon',
components: {
GlIcon,
GlLink,
GlPopover,
},
i18n: {
popoverTitle: s__('mrWidget|What is a merge train?'),
popoverContent: s__(
'mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge.',
),
moreInfo: s__('mrWidget|More information'),
learnMore: s__('mrWidget|Learn more'),
},
popoverConstants: {
target: 'merge-train-help',
container: 'merge-train-help-container',
},
computed: {
mergeTrainWhenPipelineSucceedsDocsPath() {
return helpPagePath('ci/pipelines/merge_trains.md', {
anchor: 'add-a-merge-request-to-a-merge-train',
});
},
},
};
</script>
<template>
<div :id="$options.popoverConstants.container">
<gl-icon
:id="$options.popoverConstants.target"
name="question-o"
class="gl-text-blue-600"
:aria-label="$options.i18n.moreInfo"
data-testid="merge-train-helper-icon"
/>
<gl-popover
:target="$options.popoverConstants.target"
:container="$options.popoverConstants.container"
placement="top"
:title="$options.i18n.popoverTitle"
triggers="hover focus"
>
<p data-testid="merge-train-helper-content">{{ $options.i18n.popoverContent }}</p>
<gl-link
class="gl-mt-3"
:href="mergeTrainWhenPipelineSucceedsDocsPath"
target="_blank"
rel="noopener noreferrer"
>
{{ $options.i18n.learnMore }}
</gl-link>
</gl-popover>
</div>
</template>
......@@ -8,7 +8,6 @@ import {
PIPELINE_FAILED_STATE,
} from '~/vue_merge_request_widget/constants';
import base from '~/vue_merge_request_widget/mixins/ready_to_merge';
import { MERGE_TRAIN_BUTTON_TEXT } from '~/vue_merge_request_widget/i18n';
export const MERGE_DISABLED_TEXT_UNAPPROVED = s__(
'mrWidget|Merge blocked: all required approvals must be given.',
......@@ -58,22 +57,6 @@ export default {
pipelineMustSucceedConflictText() {
return PIPELINE_MUST_SUCCEED_CONFLICT_TEXT;
},
autoMergeTextLegacy() {
if (this.preferredAutoMergeStrategy === MTWPS_MERGE_STRATEGY) {
if (this.stateData.mergeTrainsCount === 0) {
return __('Start merge train when pipeline succeeds');
}
return __('Add to merge train when pipeline succeeds');
} else if (this.preferredAutoMergeStrategy === MT_MERGE_STRATEGY) {
if (this.stateData.mergeTrainsCount === 0) {
const pipelineFailed = this.status === PIPELINE_FAILED_STATE || this.isPipelineFailed;
return pipelineFailed ? MERGE_TRAIN_BUTTON_TEXT.failed : MERGE_TRAIN_BUTTON_TEXT.passed;
}
return __('Add to merge train');
}
return __('Merge when pipeline succeeds');
},
autoMergeText() {
if (this.preferredAutoMergeStrategy === MT_MERGE_STRATEGY) {
return __('Merge');
......
......@@ -36,39 +36,6 @@ def open_warning_dialog
end
context 'when the merge request is on the merge train' do
before do
stub_feature_flags(disable_merge_trains: false)
stub_licensed_features(merge_pipelines: true, merge_trains: true)
stub_ci_pipeline_yaml_file(YAML.dump(ci_yaml))
stub_feature_flags(auto_merge_labels_mr_widget: false)
sign_in(user)
visit project_merge_request_path(project, merge_request)
wait_for_requests
end
it 'shows a warning dialog and does nothing if the user selects "Cancel"' do
Sidekiq::Testing.fake! do
open_warning_dialog
find(':focus').send_keys :enter
expect(merge_button).to have_content('Start merge train')
end
end
it 'shows a warning dialog and merges immediately after the user confirms' do
Sidekiq::Testing.fake! do
open_warning_dialog
click_button 'Merge immediately'
expect(find('[data-testid="merging-state"]')).to have_content('Merging!')
end
end
end
context 'when the merge request is on the merge train with the auto merge labels feature flag turned on' do
before do
stub_feature_flags(disable_merge_trains: false)
stub_licensed_features(merge_pipelines: true, merge_trains: true)
......
......@@ -25,7 +25,6 @@
merge_request.all_pipelines.first.succeed!
merge_request.update_head_pipeline
stub_ci_pipeline_yaml_file(YAML.dump(ci_yaml))
stub_feature_flags(auto_merge_labels_mr_widget: false)
sign_in(user)
end
......@@ -33,7 +32,8 @@
it "shows 'Start merge train' button" do
visit project_merge_request_path(project, merge_request)
expect(page).to have_button('Start merge train')
expect(page).to have_button('Merge')
expect(page).to have_content('Add to merge train')
end
context 'when merge_trains EEP license is not available' do
......@@ -41,17 +41,17 @@
stub_licensed_features(merge_trains: false)
end
it 'does not show Start merge train' do
it 'does not show Start merge train helper text' do
visit project_merge_request_path(project, merge_request)
expect(page).not_to have_button('Start merge train')
expect(page).not_to have_content('Start merge train')
end
end
context "when user clicks 'Start merge train' button" do
before do
visit project_merge_request_path(project, merge_request)
click_button 'Start merge train'
click_button 'Merge'
wait_for_requests
end
......@@ -90,7 +90,8 @@
it 'cancels automatic merge' do
page.within('.mr-state-widget') do
expect(page).not_to have_content("Added to the merge train by #{user.name}")
expect(page).to have_button('Start merge train')
expect(page).to have_button('Merge')
expect(page).to have_content('Add to merge train')
end
end
end
......@@ -103,10 +104,11 @@
target_project: project, target_branch: 'master')
end
it "shows 'Add to merge train' button" do
it "shows 'Merge' button and 'Add to merge train' helper text" do
visit project_merge_request_path(project, merge_request)
expect(page).to have_button('Add to merge train')
expect(page).to have_button('Merge')
expect(page).to have_content('Add to merge train')
end
end
end
......@@ -19,7 +19,6 @@
stub_licensed_features(merge_pipelines: true, merge_trains: true)
project.add_maintainer(user)
project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true)
stub_feature_flags(auto_merge_labels_mr_widget: false)
merge_request.update_head_pipeline
......@@ -29,12 +28,14 @@
it 'shows Start merge train when pipeline succeeds button and helper icon' do
visit project_merge_request_path(project, merge_request)
expect(page).to have_button('Start merge train when pipeline succeeds')
expect(page).to have_button('Set to auto-merge')
expect(page).to have_selector('[data-testid="auto-merge-helper-text"]')
find('[data-testid="merge-train-helper-icon"]').hover
within '[data-testid="ready_to_merge_state"]' do
find('[data-testid="auto-merge-helper-text-icon"]').hover
end
expect(page).to have_selector('[data-testid="merge-train-helper-content"]')
expect(page).to have_link('Learn more', href: help_page_path('ci/pipelines/merge_trains.md', anchor: 'add-a-merge-request-to-a-merge-train'))
expect(page).to have_link('merge train')
end
context 'when merge_trains EEP license is not available' do
......@@ -45,15 +46,15 @@
it 'does not show Start merge train when pipeline succeeds button' do
visit project_merge_request_path(project, merge_request)
expect(page).not_to have_button('Start merge train when pipeline succeeds')
expect(page).not_to have_selector('[data-testid="merge-train-helper-icon"]')
expect(page).to have_button('Set to auto-merge')
expect(page).to have_content('Merge when pipeline succeeds')
end
end
context "when user clicks 'Start merge train when pipeline succeeds' button" do
before do
visit project_merge_request_path(project, merge_request)
click_button 'Start merge train when pipeline succeeds'
click_button 'Set to auto-merge'
end
it 'informs merge request that auto merge is enabled' do
......@@ -72,7 +73,8 @@
it 'cancels automatic merge' do
page.within('.mr-state-widget') do
expect(page).not_to have_content("Set by #{user.name} to start a merge train when the pipeline succeeds")
expect(page).to have_button('Start merge train when pipeline succeeds')
expect(page).to have_button('Set to auto-merge')
expect(page).to have_content('Add to merge train when pipeline succeeds')
end
end
end
......@@ -88,7 +90,8 @@
it 'shows Add to merge train when pipeline succeeds button' do
visit project_merge_request_path(project, merge_request)
expect(page).to have_button('Add to merge train when pipeline succeeds')
expect(page).to have_button('Set to auto-merge')
expect(page).to have_content('Add to merge train when pipeline succeeds')
end
end
end
import { GlLink, GlPopover, GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import MergeTrainHelperIcon from 'ee/vue_merge_request_widget/components/merge_train_helper_icon.vue';
describe('MergeTrainHelperIcon', () => {
let wrapper;
const helpLink = '/help/ci/pipelines/merge_trains.md#add-a-merge-request-to-a-merge-train';
const findIcon = () => wrapper.findComponent(GlIcon);
const findPopover = () => wrapper.findComponent(GlPopover);
const findLink = () => wrapper.findComponent(GlLink);
const createComponent = () => {
wrapper = shallowMount(MergeTrainHelperIcon);
};
beforeEach(() => {
createComponent();
});
it('displays the correct icon', () => {
expect(findIcon().props('name')).toBe('question-o');
});
it('displays the correct help link', () => {
expect(findLink().attributes('href')).toBe(helpLink);
});
it('displays the correct popover title', () => {
expect(findPopover().props('title')).toBe('What is a merge train?');
});
it('displays the correct popover content', () => {
expect(wrapper.text()).toContain(
'A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge',
);
});
});
......@@ -2,7 +2,6 @@ import { GlLink, GlSprintf } from '@gitlab/ui';
import { nextTick } from 'vue';
import MergeImmediatelyConfirmationDialog from 'ee/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue';
import MergeTrainFailedPipelineConfirmationDialog from 'ee/vue_merge_request_widget/components/merge_train_failed_pipeline_confirmation_dialog.vue';
import MergeTrainHelperIcon from 'ee/vue_merge_request_widget/components/merge_train_helper_icon.vue';
import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { stubComponent } from 'helpers/stub_component';
import ReadyToMerge from '~/vue_merge_request_widget/components/states/ready_to_merge.vue';
......@@ -11,7 +10,6 @@ import {
MT_MERGE_STRATEGY,
MTWPS_MERGE_STRATEGY,
} from '~/vue_merge_request_widget/constants';
import { MERGE_TRAIN_BUTTON_TEXT } from '~/vue_merge_request_widget/i18n';
describe('ReadyToMerge', () => {
let wrapper;
......@@ -22,12 +20,6 @@ describe('ReadyToMerge', () => {
poll: () => {},
};
const activePipeline = {
id: 1,
path: 'path/to/pipeline',
active: true,
};
const mr = {
isPipelineActive: false,
headPipeline: { id: 'gid://gitlab/Pipeline/1', path: 'path/to/pipeline' },
......@@ -75,7 +67,6 @@ describe('ReadyToMerge', () => {
MergeImmediatelyConfirmationDialog: stubComponent(MergeImmediatelyConfirmationDialog, {
methods: { show: showMock },
}),
MergeTrainHelperIcon,
GlSprintf,
GlLink,
MergeTrainFailedPipelineConfirmationDialog,
......@@ -86,60 +77,11 @@ describe('ReadyToMerge', () => {
const findMergeButton = () => wrapper.findByTestId('merge-button');
const findMergeImmediatelyDropdown = () => wrapper.findByTestId('merge-immediately-dropdown');
const findMergeImmediatelyButton = () => wrapper.findByTestId('merge-immediately-button');
const findMergeTrainHelperIcon = () => wrapper.findComponent(MergeTrainHelperIcon);
const findMergeTrainFailedPipelineConfirmationDialog = () =>
wrapper.findComponent(MergeTrainFailedPipelineConfirmationDialog);
const findMergeImmediatelyConfirmationDialog = () =>
wrapper.findComponent(MergeImmediatelyConfirmationDialog);
describe('Merge button text', () => {
it.each`
availableAutoMergeStrategies | mergeTrainsCount | expectedText
${[]} | ${0} | ${'Merge'}
${[MWPS_MERGE_STRATEGY]} | ${0} | ${'Merge when pipeline succeeds'}
${[MT_MERGE_STRATEGY]} | ${0} | ${'Start merge train'}
${[MT_MERGE_STRATEGY]} | ${1} | ${'Add to merge train'}
${[MTWPS_MERGE_STRATEGY]} | ${0} | ${'Start merge train when pipeline succeeds'}
${[MTWPS_MERGE_STRATEGY]} | ${1} | ${'Add to merge train when pipeline succeeds'}
`(
'displays $expectedText with merge strategy $availableAutoMergeStrategies and merge train count $mergeTrainsCount',
({ availableAutoMergeStrategies, mergeTrainsCount, expectedText }) => {
createComponent({ availableAutoMergeStrategies, mergeTrainsCount });
expect(findMergeButton().text()).toBe(expectedText);
},
);
it('displays "Merge in progress"', () => {
createComponent({}, shallowMountExtended, { isMergingImmediately: true });
expect(findMergeButton().text()).toBe('Merge in progress');
});
});
describe('shouldRenderMergeTrainHelperIcon', () => {
it('should render the helper icon if MTWPS is available and the user has not yet pressed the MTWPS button', () => {
createComponent({
onlyAllowMergeIfPipelineSucceeds: true,
availableAutoMergeStrategies: [MTWPS_MERGE_STRATEGY],
autoMergeEnabled: false,
});
expect(findMergeTrainHelperIcon().exists()).toBe(true);
});
});
describe('merge train helper icon', () => {
it('does not render the merge train helper icon if the MTWPS strategy is not available', () => {
createComponent({
availableAutoMergeStrategies: [MT_MERGE_STRATEGY],
headPipeline: activePipeline,
});
expect(findMergeTrainHelperIcon().exists()).toBe(false);
});
});
describe('Merge Immediately Dropdown', () => {
it('should return false if no pipeline is active', () => {
createComponent({
......@@ -229,7 +171,7 @@ describe('ReadyToMerge', () => {
expect(showMock).toHaveBeenCalled();
expect(findMergeTrainFailedPipelineConfirmationDialog().props('visible')).toBe(false);
expect(findMergeButton().text()).toBe('Start merge train');
expect(findMergeButton().text()).toBe('Merge');
expect(mr.transitionStateMachine).toHaveBeenCalledTimes(0);
});
......@@ -262,47 +204,7 @@ describe('ReadyToMerge', () => {
});
});
describe('Merge train text', () => {
describe('pipeline failed', () => {
beforeEach(() => {
createComponent({
isPipelineFailed: true,
availableAutoMergeStrategies: [MT_MERGE_STRATEGY],
hasCI: true,
onlyAllowMergeIfPipelineSucceeds: false,
});
});
it('merge button text should contain ellipsis', () => {
expect(findMergeButton().text()).toBe(MERGE_TRAIN_BUTTON_TEXT.failed);
});
});
describe('pipeline passed', () => {
beforeEach(() => {
createComponent({
availableAutoMergeStrategies: [MT_MERGE_STRATEGY],
hasCI: true,
onlyAllowMergeIfPipelineSucceeds: false,
headPipeline: {
id: 'gid://gitlab/Pipeline/1',
path: 'path/to/pipeline',
status: 'passed',
},
});
});
it('merge button text should not contain ellipsis', () => {
expect(findMergeButton().text()).toBe(MERGE_TRAIN_BUTTON_TEXT.passed);
});
});
});
describe('Merge button text with auto_merge_labels_mr_widget feature flag turned on', () => {
beforeEach(() => {
window.gon = { features: { autoMergeLabelsMrWidget: true } };
});
describe('Merge button text', () => {
it.each`
availableAutoMergeStrategies | mergeTrainsCount | expectedText
${[]} | ${0} | ${'Merge'}
......
......@@ -43185,9 +43185,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
 
msgid "Start merge train when pipeline succeeds"
msgstr ""
msgid "Start merge train..."
msgstr ""
 
......@@ -53757,9 +53754,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
 
msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
msgstr ""
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
 
......@@ -53858,9 +53852,6 @@ msgstr ""
msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccurate. Before merge, we advise running a pipeline in this project."
msgstr ""
 
msgid "mrWidget|Learn more"
msgstr ""
msgid "mrWidget|Loading deployment statistics"
msgstr ""
 
......@@ -53884,9 +53875,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
 
msgid "mrWidget|More information"
msgstr ""
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
 
......@@ -53962,9 +53950,6 @@ msgstr ""
msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
 
msgid "mrWidget|What is a merge train?"
msgstr ""
msgid "mrWidget|Your password"
msgstr ""
 
......@@ -13,22 +13,6 @@
context 'project does not have CI enabled' do
it 'allows MR to be merged' do
stub_feature_flags(auto_merge_labels_mr_widget: false)
visit project_merge_request_path(project, merge_request)
wait_for_requests
page.within('.mr-state-widget') do
expect(page).to have_button 'Merge'
end
end
end
context 'project does not have CI enabled and auto_merge_labels_mr_widget on' do
it 'allows MR to be merged' do
stub_feature_flags(auto_merge_labels_mr_widget: true)
visit project_merge_request_path(project, merge_request)
wait_for_requests
......@@ -51,79 +35,6 @@
context 'when merge requests can only be merged if the pipeline succeeds' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, true)
stub_feature_flags(auto_merge_labels_mr_widget: false)
end
context 'when CI is running' do
let(:status) { :running }
it 'does not allow to merge immediately' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
expect(page).to have_button 'Merge when pipeline succeeds'
expect(page).not_to have_button '.js-merge-moment'
end
end
context 'when CI failed' do
let(:status) { :failed }
it 'does not allow MR to be merged' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
expect(page).not_to have_button('Merge', exact: true)
expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.')
end
end
context 'when CI canceled' do
let(:status) { :canceled }
it 'does not allow MR to be merged' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
expect(page).not_to have_button('Merge', exact: true)
expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.')
end
end
context 'when CI succeeded' do
let(:status) { :success }
it 'allows MR to be merged' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
expect(page).to have_button('Merge', exact: true)
end
end
context 'when CI skipped' do
let(:status) { :skipped }
it 'does not allow MR to be merged' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
expect(page).not_to have_button('Merge', exact: true)
end
end
end
context 'when merge requests can only be merged if the pipeline succeeds with auto_merge_labels_mr_widget on' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, true)
stub_feature_flags(auto_merge_labels_mr_widget: true)
end
context 'when CI is running' do
......@@ -193,58 +104,6 @@
context 'when merge requests can be merged when the build failed' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, false)
stub_feature_flags(auto_merge_labels_mr_widget: false)
end
context 'when CI is running' do
let(:status) { :running }
it 'allows MR to be merged immediately' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
expect(page).to have_button 'Merge when pipeline succeeds'
page.find('.js-merge-moment').click
expect(page).to have_content 'Merge immediately'
end
end
context 'when CI failed' do
let(:status) { :failed }
it 'allows MR to be merged' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
page.within('.mr-state-widget') do
expect(page).to have_button 'Merge'
end
end
end
context 'when CI succeeded' do
let(:status) { :success }
it 'allows MR to be merged' do
visit project_merge_request_path(project, merge_request)
wait_for_requests
page.within('.mr-state-widget') do
expect(page).to have_button 'Merge'
end
end
end
end
context 'when merge requests can be merged when the build failed with auto_merge_labels_mr_widget on' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, false)
stub_feature_flags(auto_merge_labels_mr_widget: true)
end
context 'when CI is running' do
......
......@@ -24,83 +24,6 @@
end
context 'when there is active pipeline for merge request' do
before do
create(:ci_build, pipeline: pipeline)
stub_feature_flags(auto_merge_labels_mr_widget: false)
sign_in(user)
visit project_merge_request_path(project, merge_request)
end
describe 'enabling Merge when pipeline succeeds' do
shared_examples 'Merge when pipeline succeeds activator' do
it 'activates the Merge when pipeline succeeds feature', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410105' do
click_button "Merge when pipeline succeeds"
expect(page).to have_content "Set by #{user.name} to be merged automatically when the pipeline succeeds"
expect(page).to have_content "Source branch will not be deleted"
expect(page).to have_selector ".js-cancel-auto-merge"
visit project_merge_request_path(project, merge_request) # Needed to refresh the page
expect(page).to have_content /enabled an automatic merge when the pipeline for \h{8} succeeds/i
end
end
context "when enabled immediately" do
it_behaves_like 'Merge when pipeline succeeds activator'
end
context 'when enabled after pipeline status changed', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/258667' do
before do
pipeline.run!
# We depend on merge request widget being reloaded
# so we have to wait for asynchronous call to reload it
# and have_content expectation handles that.
#
expect(page).to have_content "Pipeline ##{pipeline.id} running"
end
it_behaves_like 'Merge when pipeline succeeds activator'
end
context 'when enabled after it was previously canceled' do
before do
click_button "Merge when pipeline succeeds"
wait_for_requests
click_button "Cancel auto-merge"
wait_for_requests
expect(page).to have_content 'Merge when pipeline succeeds'
end
it_behaves_like 'Merge when pipeline succeeds activator'
end
context 'when it was enabled and then canceled' do
let(:merge_request) do
create(:merge_request_with_diffs,
:merge_when_pipeline_succeeds,
source_project: project,
title: 'Bug NS-04',
author: user,
merge_user: user)
end
before do
merge_request.merge_params['force_remove_source_branch'] = '0'
merge_request.save!
click_button "Cancel auto-merge"
end
it_behaves_like 'Merge when pipeline succeeds activator'
end
end
end
context 'when there is active pipeline for merge request with auto_merge_labels_mr_widget on' do
before do
create(:ci_build, pipeline: pipeline)
stub_feature_flags(auto_merge_labels_mr_widget: true)
......@@ -164,86 +87,6 @@
end
context 'when merge when pipeline succeeds is enabled' do
let(:merge_request) do
create(:merge_request_with_diffs, :simple, :merge_when_pipeline_succeeds,
source_project: project,
author: user,
merge_user: user,
title: 'MepMep')
end
let!(:build) do
create(:ci_build, pipeline: pipeline)
end
before do
stub_feature_flags(auto_merge_labels_mr_widget: false)
sign_in user
visit project_merge_request_path(project, merge_request)
end
it 'allows to cancel the automatic merge' do
click_button "Cancel auto-merge"
expect(page).to have_button "Merge when pipeline succeeds"
refresh
expect(page).to have_content "canceled the automatic merge"
end
context 'when pipeline succeeds' do
before do
build.success
refresh
end
it 'merges merge request', :sidekiq_might_not_need_inline do
expect(page).to have_content 'Changes merged'
expect(merge_request.reload).to be_merged
end
end
context 'view merge request with MWPS enabled but automatically merge fails' do
before do
merge_request.update!(
merge_user: merge_request.author,
merge_error: 'Something went wrong'
)
refresh
end
it 'shows information about the merge error' do
# Wait for the `ci_status` and `merge_check` requests
wait_for_requests
page.within('.mr-state-widget') do
expect(page).to have_content('Something went wrong. Try again.')
end
end
end
context 'view merge request with MWPS enabled but automatically merge fails' do
before do
merge_request.update!(
merge_user: merge_request.author,
merge_error: 'Something went wrong.'
)
refresh
end
it 'shows information about the merge error' do
# Wait for the `ci_status` and `merge_check` requests
wait_for_requests
page.within('.mr-state-widget') do
expect(page).to have_content('Something went wrong. Try again.')
end
end
end
end
context 'when merge when pipeline succeeds is enabled and auto_merge_labels_mr_widget on' do
let(:merge_request) do
create(:merge_request_with_diffs, :simple, :merge_when_pipeline_succeeds,
source_project: project,
......
......@@ -56,8 +56,6 @@
end
before do
stub_feature_flags(auto_merge_labels_mr_widget: false)
visit project_merge_request_path(project, merge_request)
page.within('.merge-request-tabs') do
......@@ -144,53 +142,8 @@
end
end
context 'when a user merges a merge request in the parent project', :sidekiq_might_not_need_inline do
before do
click_link 'Overview'
click_button 'Merge when pipeline succeeds'
wait_for_requests
end
context 'when detached merge request pipeline is pending' do
it 'waits the head pipeline' do
expect(page).to have_content('to be merged automatically when the pipeline succeeds')
expect(page).to have_button('Cancel auto-merge')
end
end
context 'when detached merge request pipeline succeeds' do
before do
detached_merge_request_pipeline.reload.succeed!
wait_for_requests
end
it 'merges the merge request' do
expect(page).to have_content('Merged by')
expect(page).to have_button('Revert')
end
end
context 'when branch pipeline succeeds' do
before do
click_link 'Overview'
push_pipeline.reload.succeed!
wait_for_requests
end
it 'waits the head pipeline' do
expect(page).to have_content('to be merged automatically when the pipeline succeeds')
expect(page).to have_button('Cancel auto-merge')
end
end
end
context 'when a user created a merge request in the parent project with auto_merge_labels_mr_widget on' do
context 'when a user created a merge request in the parent project' do
before do
stub_feature_flags(auto_merge_labels_mr_widget: true)
visit project_merge_request_path(project, merge_request)
page.within('.merge-request-tabs') do
......@@ -404,10 +357,10 @@
project.update!(only_allow_merge_if_pipeline_succeeds: true)
end
it 'shows MWPS button' do
it 'shows Set to auto-merge button' do
visit project_merge_request_path(project, merge_request)
expect(page).to have_button('Merge when pipeline succeeds')
expect(page).to have_button('Set to auto-merge')
end
end
end
......@@ -417,7 +370,7 @@
before do
click_link("Overview")
click_button 'Merge when pipeline succeeds'
click_button 'Set to auto-merge'
wait_for_requests
end
......
......@@ -113,11 +113,6 @@ const createComponent = (customConfig = {}, createState = true) => {
GlSprintf,
},
apolloProvider: createMockApollo([[readyToMergeQuery, readyToMergeResponseSpy]]),
provide: {
glFeatures: {
autoMergeLabelsMrWidget: false,
},
},
});
};
......@@ -144,6 +139,7 @@ const findDeleteSourceBranchCheckbox = () =>
const triggerApprovalUpdated = () => eventHub.$emit('ApprovalUpdated');
const triggerEditCommitInput = () =>
wrapper.find('[data-testid="widget_edit_commit_message"]').vm.$emit('input', true);
const findMergeHelperText = () => wrapper.find('[data-qa-selector="auto_merge_helper_text"]');
describe('ReadyToMerge', () => {
beforeEach(() => {
......@@ -185,26 +181,6 @@ describe('ReadyToMerge', () => {
expect(wrapper.vm.status).toEqual('failed');
});
});
describe('status icon', () => {
it('defaults to tick icon', () => {
createComponent({ mr: { mergeable: true } });
expect(wrapper.vm.iconClass).toEqual('success');
});
it('shows tick for success status', () => {
createComponent({ mr: { pipeline: { status: 'SUCCESS' }, mergeable: true } });
expect(wrapper.vm.iconClass).toEqual('success');
});
it('shows tick for pending status', () => {
createComponent({ mr: { pipeline: { active: true }, mergeable: true } });
expect(wrapper.vm.iconClass).toEqual('success');
});
});
});
describe('merge button text', () => {
......@@ -214,18 +190,11 @@ describe('ReadyToMerge', () => {
expect(findMergeButton().text()).toBe('Merge');
});
it('should return "Merge when pipeline succeeds" when the MWPS auto merge strategy is available', () => {
createComponent({
mr: { preferredAutoMergeStrategy: MWPS_MERGE_STRATEGY },
});
expect(findMergeButton().text()).toBe('Merge when pipeline succeeds');
});
it('should return Merge when pipeline succeeds', () => {
it('should return Set to auto-merge in the button and Merge when pipeline succeeds in the helper text', () => {
createComponent({ mr: { preferredAutoMergeStrategy: MWPS_MERGE_STRATEGY } });
expect(findMergeButton().text()).toBe('Merge when pipeline succeeds');
expect(findMergeButton().text()).toBe('Set to auto-merge');
expect(findMergeHelperText().text()).toBe('Merge when pipeline succeeds');
});
});
......
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