Files
orca/src/shared/github-pr-auto-merge-availability.test.ts
T
Jinjing e7d1fa4a21 Disable auto-merge for unstable GitHub PRs (#7415)
Prevent enabling auto-merge when a PR is in an UNSTABLE merge state.
GitHub auto-merge mutations reject UNSTABLE PRs directly instead of
allowing them to wait, so we should suppress the option.
2026-07-05 11:05:58 -07:00

74 lines
2.6 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
canEnableGitHubPRAutoMerge,
canShowGitHubPRAutoMergeControl,
type GitHubPRAutoMergeAvailabilityInput
} from './github-pr-auto-merge-availability'
function pr(
overrides: Partial<GitHubPRAutoMergeAvailabilityInput> = {}
): GitHubPRAutoMergeAvailabilityInput {
return {
state: 'open',
mergeable: 'MERGEABLE',
mergeStateStatus: 'CLEAN',
autoMergeAllowed: true,
...overrides
}
}
describe('github PR auto-merge availability', () => {
it('does not offer auto-merge for directly mergeable PRs with only optional checks pending', () => {
expect(canEnableGitHubPRAutoMerge(pr())).toBe(false)
expect(canShowGitHubPRAutoMergeControl(pr())).toBe(false)
})
it('offers auto-merge for requirement-blocked PRs', () => {
expect(
canEnableGitHubPRAutoMerge(
pr({ mergeable: 'UNKNOWN', mergeStateStatus: 'BLOCKED', reviewDecision: 'REVIEW_REQUIRED' })
)
).toBe(true)
expect(canEnableGitHubPRAutoMerge(pr({ mergeStateStatus: 'BLOCKED' }))).toBe(true)
expect(
canShowGitHubPRAutoMergeControl(pr({ mergeable: 'UNKNOWN', mergeStateStatus: 'BLOCKED' }))
).toBe(true)
})
it('keeps merge-queue branches available for merge-when-ready', () => {
expect(canEnableGitHubPRAutoMerge(pr({ mergeQueueRequired: true }))).toBe(false)
expect(canShowGitHubPRAutoMergeControl(pr({ mergeQueueRequired: true }))).toBe(true)
expect(
canShowGitHubPRAutoMergeControl(pr({ autoMergeAllowed: false, mergeQueueRequired: true }))
).toBe(true)
})
it('keeps enabled auto-merge visible so users can disable it', () => {
expect(canEnableGitHubPRAutoMerge(pr({ autoMergeEnabled: true }))).toBe(false)
expect(canShowGitHubPRAutoMergeControl(pr({ autoMergeEnabled: true }))).toBe(true)
})
it('suppresses closed, draft, disallowed, conflicting, and unstable PRs', () => {
expect(
canShowGitHubPRAutoMergeControl(pr({ state: 'draft', mergeStateStatus: 'BLOCKED' }))
).toBe(false)
expect(canShowGitHubPRAutoMergeControl(pr({ state: 'closed', autoMergeEnabled: true }))).toBe(
false
)
expect(
canShowGitHubPRAutoMergeControl(
pr({ autoMergeAllowed: false, mergeable: 'UNKNOWN', mergeStateStatus: 'BLOCKED' })
)
).toBe(false)
expect(
canShowGitHubPRAutoMergeControl(pr({ mergeable: 'CONFLICTING', mergeStateStatus: 'DIRTY' }))
).toBe(false)
expect(
canEnableGitHubPRAutoMerge(pr({ mergeable: 'UNKNOWN', mergeStateStatus: 'UNSTABLE' }))
).toBe(false)
expect(
canShowGitHubPRAutoMergeControl(pr({ mergeable: 'UNKNOWN', mergeStateStatus: 'UNSTABLE' }))
).toBe(false)
})
})