|
| 1 | +// Copyright 2024 The Gitea Authors. All rights reserved. |
| 2 | +// SPDX-License-Identifier: MIT |
| 3 | + |
| 4 | +package integration |
| 5 | + |
| 6 | +import ( |
| 7 | + "fmt" |
| 8 | + "net/http" |
| 9 | + "net/url" |
| 10 | + "strings" |
| 11 | + "testing" |
| 12 | + "time" |
| 13 | + |
| 14 | + "code.gitea.io/gitea/models/db" |
| 15 | + git_model "code.gitea.io/gitea/models/git" |
| 16 | + issues_model "code.gitea.io/gitea/models/issues" |
| 17 | + pull_model "code.gitea.io/gitea/models/pull" |
| 18 | + repo_model "code.gitea.io/gitea/models/repo" |
| 19 | + "code.gitea.io/gitea/models/unittest" |
| 20 | + user_model "code.gitea.io/gitea/models/user" |
| 21 | + "code.gitea.io/gitea/modules/gitrepo" |
| 22 | + api "code.gitea.io/gitea/modules/structs" |
| 23 | + commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus" |
| 24 | + |
| 25 | + "github.com/stretchr/testify/assert" |
| 26 | +) |
| 27 | + |
| 28 | +func TestAPIPullAutoMergeAfterCommitStatusSucceed(t *testing.T) { |
| 29 | + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { |
| 30 | + // create a pull request |
| 31 | + session := loginUser(t, "user1") |
| 32 | + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) |
| 33 | + forkedName := "repo1-1" |
| 34 | + testRepoFork(t, session, "user2", "repo1", "user1", forkedName, "") |
| 35 | + defer func() { |
| 36 | + testDeleteRepository(t, session, "user1", forkedName) |
| 37 | + }() |
| 38 | + testEditFile(t, session, "user1", forkedName, "master", "README.md", "Hello, World (Edited)\n") |
| 39 | + testPullCreate(t, session, "user1", forkedName, false, "master", "master", "Indexer notifier test pull") |
| 40 | + |
| 41 | + baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) |
| 42 | + forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: forkedName}) |
| 43 | + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ |
| 44 | + BaseRepoID: baseRepo.ID, |
| 45 | + BaseBranch: "master", |
| 46 | + HeadRepoID: forkedRepo.ID, |
| 47 | + HeadBranch: "master", |
| 48 | + }) |
| 49 | + |
| 50 | + // add protected branch for commit status |
| 51 | + csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") |
| 52 | + // Change master branch to protected |
| 53 | + req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ |
| 54 | + "_csrf": csrf, |
| 55 | + "rule_name": "master", |
| 56 | + "enable_push": "true", |
| 57 | + "enable_status_check": "true", |
| 58 | + "status_check_contexts": "gitea/actions", |
| 59 | + }) |
| 60 | + session.MakeRequest(t, req, http.StatusSeeOther) |
| 61 | + |
| 62 | + // add automerge for this repo |
| 63 | + req = NewRequestWithBody(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/merge", baseRepo.OwnerName, baseRepo.Name, pr.Index), |
| 64 | + strings.NewReader(url.Values{ |
| 65 | + "do": []string{"merge"}, |
| 66 | + "merge_when_checks_succeed": []string{"true"}, |
| 67 | + }.Encode())). |
| 68 | + AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") |
| 69 | + MakeRequest(t, req, http.StatusCreated) |
| 70 | + |
| 71 | + // reload pr again |
| 72 | + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) |
| 73 | + assert.False(t, pr.HasMerged) |
| 74 | + assert.Empty(t, pr.MergedCommitID) |
| 75 | + |
| 76 | + // update commit status to success, then it should be merged automatically |
| 77 | + baseGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, baseRepo) |
| 78 | + assert.NoError(t, err) |
| 79 | + sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) |
| 80 | + assert.NoError(t, err) |
| 81 | + masterCommitID, err := baseGitRepo.GetBranchCommitID("master") |
| 82 | + assert.NoError(t, err) |
| 83 | + |
| 84 | + branches, _, err := baseGitRepo.GetBranchNames(0, 100) |
| 85 | + assert.NoError(t, err) |
| 86 | + assert.ElementsMatch(t, []string{"sub-home-md-img-check", "home-md-img-check", "pr-to-update", "branch2", "DefaultBranch", "develop", "feature/1", "master"}, branches) |
| 87 | + baseGitRepo.Close() |
| 88 | + defer func() { |
| 89 | + testResetRepo(t, baseRepo.RepoPath(), "master", masterCommitID) |
| 90 | + }() |
| 91 | + |
| 92 | + err = commitstatus_service.CreateCommitStatus(db.DefaultContext, baseRepo, user1, sha, &git_model.CommitStatus{ |
| 93 | + State: api.CommitStatusSuccess, |
| 94 | + TargetURL: "https://gitea.com", |
| 95 | + Context: "gitea/actions", |
| 96 | + }) |
| 97 | + assert.NoError(t, err) |
| 98 | + |
| 99 | + time.Sleep(2 * time.Second) |
| 100 | + |
| 101 | + // reload pr again |
| 102 | + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) |
| 103 | + assert.True(t, pr.HasMerged) |
| 104 | + assert.NotEmpty(t, pr.MergedCommitID) |
| 105 | + |
| 106 | + unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) |
| 107 | + }) |
| 108 | +} |
0 commit comments