Add auto-merge setting and merge now functionality

This commit is contained in:
2026-07-28 17:42:49 +02:00
parent 7511311297
commit 42dcceaf4b
10 changed files with 689 additions and 63 deletions

View File

@@ -294,6 +294,67 @@ func TestUpdatePullRequestMutatesTitleBodyAndBaseBranch(t *testing.T) {
}
}
func TestMergeAndAutoMergeMutationsUseExpectedHeadOID(t *testing.T) {
requests := 0
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requests++
var request graphQLRequest
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
t.Fatal(err)
}
input := request.Variables["input"].(map[string]any)
if input["pullRequestId"] != "pr-id" {
t.Fatalf("mutation input = %#v", input)
}
switch {
case strings.Contains(request.Query, "EnablePullRequestAutoMerge"):
if input["expectedHeadOid"] != "head" || input["mergeMethod"] != "SQUASH" {
t.Fatalf("enable input = %#v", input)
}
_, _ = w.Write([]byte(`{"data":{"enablePullRequestAutoMerge":{"pullRequest":{
"autoMergeRequest":{"mergeMethod":"SQUASH","enabledAt":"2026-07-28T12:00:00Z",
"enabledBy":{"login":"me"}}
}}}}`))
case strings.Contains(request.Query, "DisablePullRequestAutoMerge"):
_, _ = w.Write([]byte(`{"data":{"disablePullRequestAutoMerge":{
"pullRequest":{"id":"pr-id","autoMergeRequest":null}
}}}`))
case strings.Contains(request.Query, "MergePullRequest"):
if input["expectedHeadOid"] != "head" || input["mergeMethod"] != "SQUASH" {
t.Fatalf("merge input = %#v", input)
}
_, _ = w.Write([]byte(`{"data":{"mergePullRequest":{"pullRequest":{
"merged":true,"mergedAt":"2026-07-28T12:01:00Z"
}}}}`))
default:
t.Fatalf("unexpected mutation:\n%s", request.Query)
}
}))
defer server.Close()
client := NewGitHubClient(server.URL, "secret")
auto, err := client.SetPullRequestAutoMerge(
context.Background(), "pr-id", "head", "SQUASH", true,
)
if err != nil || auto == nil || auto.MergeMethod != "SQUASH" || auto.EnabledBy != "me" {
t.Fatalf("enable result = %#v, error = %v", auto, err)
}
if _, err := client.SetPullRequestAutoMerge(
context.Background(), "pr-id", "head", "SQUASH", false,
); err != nil {
t.Fatal(err)
}
merged, err := client.MergePullRequest(
context.Background(), "pr-id", "head", "SQUASH",
)
if err != nil || !merged.Merged || merged.MergedAt.IsZero() {
t.Fatalf("merge result = %#v, error = %v", merged, err)
}
if requests != 3 {
t.Fatalf("mutation requests = %d, want 3", requests)
}
}
func TestCheckContextsAndAnnotationsArePaginated(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var request graphQLRequest
@@ -428,14 +489,18 @@ func TestGetPullRequestPaginatesThreadsCommentsConversationAndReviews(t *testing
func TestGetPullRequestUsesOriginalLineAndMetadata(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(`{"data":{"repository":{"viewerPermission":"WRITE","pullRequest":{
_, _ = w.Write([]byte(`{"data":{"repository":{"viewerPermission":"WRITE",
"squashMergeAllowed":true,"mergeCommitAllowed":false,"rebaseMergeAllowed":true,
"pullRequest":{
"id":"pr","number":9,"title":"Fix","url":"u","body":"body","isDraft":false,
"createdAt":"2025-12-01T00:00:00Z","updatedAt":"2026-01-01T00:00:00Z",
"mergeable":"MERGEABLE","mergeStateStatus":"CLEAN","reviewDecision":"APPROVED",
"additions":12,"deletions":4,"changedFiles":3,
"baseRefName":"main","headRefName":"fix","headRefOid":"abcdef0123456789",
"viewerCanUpdate":true,"viewerCanReact":true,"viewerCanSubscribe":true,
"viewerCanEnableAutoMerge":true,
"viewerCanEnableAutoMerge":false,"viewerCanDisableAutoMerge":true,
"autoMergeRequest":{"mergeMethod":"SQUASH","enabledAt":"2026-01-01T01:00:00Z",
"enabledBy":{"login":"zam"}},
"baseRef":{"branchProtectionRule":{"requiresApprovingReviews":true,
"requiredApprovingReviewCount":2,"requiresStatusChecks":true,
"requiresConversationResolution":true,"requiresCodeOwnerReviews":true}},
@@ -493,6 +558,11 @@ func TestGetPullRequestUsesOriginalLineAndMetadata(t *testing.T) {
!got.Requirements.RequiresConversation || !got.Requirements.RequiresCodeOwnerReview {
t.Fatalf("unexpected read capabilities: %#v", got)
}
if got.AutoMerge == nil || got.AutoMerge.MergeMethod != "SQUASH" ||
got.AutoMerge.EnabledBy != "zam" || !got.Permissions.CanDisableMerge ||
strings.Join(got.AllowedMergeMethods, ",") != "SQUASH,REBASE" {
t.Fatalf("unexpected merge metadata: %#v", got)
}
if len(got.Threads) != 1 || got.Threads[0].Line != 42 || got.Threads[0].StartLine != 40 ||
got.Threads[0].DiffSide != "RIGHT" || got.Threads[0].IsTruncated {
t.Fatalf("unexpected thread: %#v", got.Threads)