Files
orca/src/shared/github-pr-auto-merge-availability.test.ts
T
Jinjing dd0fa77882 Enhance PR auto-merge controls and switch to GraphQL mutation (#6405)
- Centralize and align auto-merge eligibility logic across web and
  mobile clients.
- Use the `enablePullRequestAutoMerge` GraphQL mutation instead of
  `gh pr merge --auto` to prevent immediate merges on clean branches.
- Fall back to `gh pr merge --auto` when a merge queue is required on
  the base branch.
- Hide the auto-merge control when only optional checks are pending.
2026-06-25 22:00:34 -07:00

68 lines
2.4 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, and conflicting 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)
})
})