code.gitea.io/gitea@v1.22.3/tests/integration/pull_update_test.go (about) 1 // Copyright 2020 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "net/http" 8 "net/url" 9 "strings" 10 "testing" 11 "time" 12 13 auth_model "code.gitea.io/gitea/models/auth" 14 "code.gitea.io/gitea/models/db" 15 issues_model "code.gitea.io/gitea/models/issues" 16 "code.gitea.io/gitea/models/unittest" 17 user_model "code.gitea.io/gitea/models/user" 18 "code.gitea.io/gitea/modules/git" 19 pull_service "code.gitea.io/gitea/services/pull" 20 repo_service "code.gitea.io/gitea/services/repository" 21 files_service "code.gitea.io/gitea/services/repository/files" 22 23 "github.com/stretchr/testify/assert" 24 ) 25 26 func TestAPIPullUpdate(t *testing.T) { 27 onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { 28 // Create PR to test 29 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 30 org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26}) 31 pr := createOutdatedPR(t, user, org26) 32 33 // Test GetDiverging 34 diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr) 35 assert.NoError(t, err) 36 assert.EqualValues(t, 1, diffCount.Behind) 37 assert.EqualValues(t, 1, diffCount.Ahead) 38 assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext)) 39 assert.NoError(t, pr.LoadIssue(db.DefaultContext)) 40 41 session := loginUser(t, "user2") 42 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 43 req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index). 44 AddTokenAuth(token) 45 session.MakeRequest(t, req, http.StatusOK) 46 47 // Test GetDiverging after update 48 diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr) 49 assert.NoError(t, err) 50 assert.EqualValues(t, 0, diffCount.Behind) 51 assert.EqualValues(t, 2, diffCount.Ahead) 52 }) 53 } 54 55 func TestAPIPullUpdateByRebase(t *testing.T) { 56 onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { 57 // Create PR to test 58 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 59 org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26}) 60 pr := createOutdatedPR(t, user, org26) 61 62 // Test GetDiverging 63 diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr) 64 assert.NoError(t, err) 65 assert.EqualValues(t, 1, diffCount.Behind) 66 assert.EqualValues(t, 1, diffCount.Ahead) 67 assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext)) 68 assert.NoError(t, pr.LoadIssue(db.DefaultContext)) 69 70 session := loginUser(t, "user2") 71 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 72 req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update?style=rebase", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index). 73 AddTokenAuth(token) 74 session.MakeRequest(t, req, http.StatusOK) 75 76 // Test GetDiverging after update 77 diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr) 78 assert.NoError(t, err) 79 assert.EqualValues(t, 0, diffCount.Behind) 80 assert.EqualValues(t, 1, diffCount.Ahead) 81 }) 82 } 83 84 func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_model.PullRequest { 85 baseRepo, err := repo_service.CreateRepository(db.DefaultContext, actor, actor, repo_service.CreateRepoOptions{ 86 Name: "repo-pr-update", 87 Description: "repo-tmp-pr-update description", 88 AutoInit: true, 89 Gitignores: "C,C++", 90 License: "MIT", 91 Readme: "Default", 92 IsPrivate: false, 93 }) 94 assert.NoError(t, err) 95 assert.NotEmpty(t, baseRepo) 96 97 headRepo, err := repo_service.ForkRepository(git.DefaultContext, actor, forkOrg, repo_service.ForkRepoOptions{ 98 BaseRepo: baseRepo, 99 Name: "repo-pr-update", 100 Description: "desc", 101 }) 102 assert.NoError(t, err) 103 assert.NotEmpty(t, headRepo) 104 105 // create a commit on base Repo 106 _, err = files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, actor, &files_service.ChangeRepoFilesOptions{ 107 Files: []*files_service.ChangeRepoFile{ 108 { 109 Operation: "create", 110 TreePath: "File_A", 111 ContentReader: strings.NewReader("File A"), 112 }, 113 }, 114 Message: "Add File A", 115 OldBranch: "master", 116 NewBranch: "master", 117 Author: &files_service.IdentityOptions{ 118 Name: actor.Name, 119 Email: actor.Email, 120 }, 121 Committer: &files_service.IdentityOptions{ 122 Name: actor.Name, 123 Email: actor.Email, 124 }, 125 Dates: &files_service.CommitDateOptions{ 126 Author: time.Now(), 127 Committer: time.Now(), 128 }, 129 }) 130 assert.NoError(t, err) 131 132 // create a commit on head Repo 133 _, err = files_service.ChangeRepoFiles(git.DefaultContext, headRepo, actor, &files_service.ChangeRepoFilesOptions{ 134 Files: []*files_service.ChangeRepoFile{ 135 { 136 Operation: "create", 137 TreePath: "File_B", 138 ContentReader: strings.NewReader("File B"), 139 }, 140 }, 141 Message: "Add File on PR branch", 142 OldBranch: "master", 143 NewBranch: "newBranch", 144 Author: &files_service.IdentityOptions{ 145 Name: actor.Name, 146 Email: actor.Email, 147 }, 148 Committer: &files_service.IdentityOptions{ 149 Name: actor.Name, 150 Email: actor.Email, 151 }, 152 Dates: &files_service.CommitDateOptions{ 153 Author: time.Now(), 154 Committer: time.Now(), 155 }, 156 }) 157 assert.NoError(t, err) 158 159 // create Pull 160 pullIssue := &issues_model.Issue{ 161 RepoID: baseRepo.ID, 162 Title: "Test Pull -to-update-", 163 PosterID: actor.ID, 164 Poster: actor, 165 IsPull: true, 166 } 167 pullRequest := &issues_model.PullRequest{ 168 HeadRepoID: headRepo.ID, 169 BaseRepoID: baseRepo.ID, 170 HeadBranch: "newBranch", 171 BaseBranch: "master", 172 HeadRepo: headRepo, 173 BaseRepo: baseRepo, 174 Type: issues_model.PullRequestGitea, 175 } 176 err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil) 177 assert.NoError(t, err) 178 179 issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "Test Pull -to-update-"}) 180 assert.NoError(t, issue.LoadPullRequest(db.DefaultContext)) 181 182 return issue.PullRequest 183 }