fix: resolve auto merge option only available if multiple merge strategies enabled

add a new button that toggles auto merge if only a single merge strategy
is enabled
This commit is contained in:
Mauritz Sjödin 2026-05-11 16:34:21 +02:00
parent 03312e4f46
commit 229e511a8b
2 changed files with 114 additions and 0 deletions

View file

@ -64,3 +64,93 @@ test('hides merge controls when no merge style is allowed', () => {
expect(mergeform.find('.merge-button').exists()).toBe(false);
expect(mergeform.find('form.form-fetch-action').exists()).toBe(false);
});
test('shows merge styles dropdown when multiple merge styles are allowed', async () => {
window.config.pageData.pullRequestMergeForm = {
textAutoMergeButtonWhenSucceed: '(When checks succeed)',
textAutoMergeWhenSucceed: 'Auto merge when all checks succeed',
textAutoMergeCancelSchedule: 'Cancel auto merge',
canMergeNow: true,
defaultMergeStyle: 'merge',
hasPendingPullRequestMerge: false,
mergeStyles: [
{
name: 'merge',
allowed: true,
textDoMerge: 'Create merge commit',
mergeTitleFieldText: '',
mergeMessageFieldText: '',
hideAutoMerge: false,
},
{
name: 'rebase',
allowed: true,
textDoMerge: 'Rebase then fast-forward',
mergeTitleFieldText: '',
mergeMessageFieldText: '',
hideAutoMerge: false,
},
],
};
const mergeform = mount(PullRequestMergeForm);
await flushPromises();
const mergeBtn = '.merge-button .ui.button .button-text';
expect(mergeform.find(mergeBtn).exists()).toBe(true);
expect(mergeform.find(mergeBtn).text()).toBe('Create merge commit');
expect(mergeform.find('.merge-button .single-merge-strategy-auto-merge-btn').exists()).toBe(false);
expect(mergeform.find('.merge-button .ui.dropdown .menu').exists()).toBe(true);
expect(mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(1)').exists()).toBe(true);
expect(mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(1) .action-text').text()).toBe('Create merge commit');
expect(mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(1) .auto-merge-small').text()).toBe('Auto merge when all checks succeed');
expect(mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(2)').exists()).toBe(true);
expect(mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(2) .action-text').text()).toBe('Rebase then fast-forward');
expect(mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(2) .auto-merge-small').text()).toBe('Auto merge when all checks succeed');
await mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(2)').trigger('click');
expect(mergeform.find(mergeBtn).text()).toBe('Rebase then fast-forward');
await mergeform.find('.merge-button .ui.dropdown .menu .item:nth-of-type(1) .auto-merge-small').trigger('click');
expect(mergeform.find(mergeBtn).text()).toBe('Create merge commit (When checks succeed)');
});
test('shows auto merge button when a single merge style is allowed', async () => {
window.config.pageData.pullRequestMergeForm = {
textAutoMergeButtonWhenSucceed: '(When checks succeed)',
textAutoMergeWhenSucceed: 'Auto merge when all checks succeed',
textAutoMergeCancelSchedule: 'Cancel auto merge',
canMergeNow: true,
defaultMergeStyle: 'merge',
hasPendingPullRequestMerge: false,
mergeStyles: [
{
name: 'merge',
allowed: true,
textDoMerge: 'Create merge commit',
mergeTitleFieldText: '',
mergeMessageFieldText: '',
hideAutoMerge: false,
},
],
};
const mergeform = mount(PullRequestMergeForm);
await flushPromises();
const mergeBtn = '.merge-button .ui.button .button-text';
expect(mergeform.find(mergeBtn).exists()).toBe(true);
expect(mergeform.find(mergeBtn).text()).toBe('Create merge commit');
expect(mergeform.find('.merge-button .ui.dropdown .menu').exists()).toBe(false);
const autoMergeBtn = '.merge-button .single-merge-strategy-auto-merge-btn';
expect(mergeform.find(autoMergeBtn).exists()).toBe(true);
const tooltip = '.merge-button .single-merge-strategy-auto-merge-btn .single-merge-strategy-auto-merge-tooltip';
expect(mergeform.find(tooltip).exists()).toBe(true);
expect(mergeform.find(tooltip).text()).toBe('Auto merge when all checks succeed');
await mergeform.find(autoMergeBtn).trigger('click');
expect(mergeform.find(mergeBtn).text()).toBe('Create merge commit (When checks succeed)');
expect(mergeform.find(tooltip).text()).toBe('Cancel auto merge');
await mergeform.find(autoMergeBtn).trigger('click');
expect(mergeform.find(mergeBtn).text()).toBe('Create merge commit');
expect(mergeform.find(tooltip).text()).toBe('Auto merge when all checks succeed');
});

View file

@ -149,6 +149,16 @@ export default {
</template>
</span>
</button>
<button
v-if="mergeStyleAllowedCount === 1 && !mergeStyleDetail.hideAutoMerge && mergeForm.canMergeNow"
class="ui icon button single-merge-strategy-auto-merge-btn"
@click.stop="autoMergeWhenSucceed = !autoMergeWhenSucceed"
>
<svg-icon name="octicon-clock"/>
<span class="single-merge-strategy-auto-merge-tooltip">
{{ autoMergeWhenSucceed ? mergeForm.textAutoMergeCancelSchedule : mergeForm.textAutoMergeWhenSucceed }}
</span>
</button>
<div class="ui dropdown icon button" @click.stop="showMergeStyleMenu = !showMergeStyleMenu" v-if="mergeStyleAllowedCount > 1">
<svg-icon name="octicon-triangle-down" :size="14"/>
<div class="menu" :class="{'show':showMergeStyleMenu}">
@ -248,6 +258,20 @@ export default {
border: 1px solid var(--color-info-border);
}
.ui.buttons .button.single-merge-strategy-auto-merge-btn {
color: var(--color-info-text);
background-color: var(--color-info-bg);
border: 1px solid var(--color-info-border);
}
.ui.buttons .button.single-merge-strategy-auto-merge-btn .single-merge-strategy-auto-merge-tooltip {
display: none;
}
.ui.buttons .button.single-merge-strategy-auto-merge-btn:hover .single-merge-strategy-auto-merge-tooltip {
display: flex;
}
.auto-merge-small:hover .auto-merge-tip {
display: flex;
}