code.gitea.io/gitea@v1.22.3/models/issues/pull_test.go (about) 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package issues_test 5 6 import ( 7 "testing" 8 9 "code.gitea.io/gitea/models/db" 10 issues_model "code.gitea.io/gitea/models/issues" 11 repo_model "code.gitea.io/gitea/models/repo" 12 "code.gitea.io/gitea/models/unittest" 13 user_model "code.gitea.io/gitea/models/user" 14 "code.gitea.io/gitea/modules/setting" 15 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestPullRequest_LoadAttributes(t *testing.T) { 20 assert.NoError(t, unittest.PrepareTestDatabase()) 21 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 22 assert.NoError(t, pr.LoadAttributes(db.DefaultContext)) 23 assert.NotNil(t, pr.Merger) 24 assert.Equal(t, pr.MergerID, pr.Merger.ID) 25 } 26 27 func TestPullRequest_LoadIssue(t *testing.T) { 28 assert.NoError(t, unittest.PrepareTestDatabase()) 29 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 30 assert.NoError(t, pr.LoadIssue(db.DefaultContext)) 31 assert.NotNil(t, pr.Issue) 32 assert.Equal(t, int64(2), pr.Issue.ID) 33 assert.NoError(t, pr.LoadIssue(db.DefaultContext)) 34 assert.NotNil(t, pr.Issue) 35 assert.Equal(t, int64(2), pr.Issue.ID) 36 } 37 38 func TestPullRequest_LoadBaseRepo(t *testing.T) { 39 assert.NoError(t, unittest.PrepareTestDatabase()) 40 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 41 assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext)) 42 assert.NotNil(t, pr.BaseRepo) 43 assert.Equal(t, pr.BaseRepoID, pr.BaseRepo.ID) 44 assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext)) 45 assert.NotNil(t, pr.BaseRepo) 46 assert.Equal(t, pr.BaseRepoID, pr.BaseRepo.ID) 47 } 48 49 func TestPullRequest_LoadHeadRepo(t *testing.T) { 50 assert.NoError(t, unittest.PrepareTestDatabase()) 51 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 52 assert.NoError(t, pr.LoadHeadRepo(db.DefaultContext)) 53 assert.NotNil(t, pr.HeadRepo) 54 assert.Equal(t, pr.HeadRepoID, pr.HeadRepo.ID) 55 } 56 57 // TODO TestMerge 58 59 // TODO TestNewPullRequest 60 61 func TestPullRequestsNewest(t *testing.T) { 62 assert.NoError(t, unittest.PrepareTestDatabase()) 63 prs, count, err := issues_model.PullRequests(db.DefaultContext, 1, &issues_model.PullRequestsOptions{ 64 ListOptions: db.ListOptions{ 65 Page: 1, 66 }, 67 State: "open", 68 SortType: "newest", 69 }) 70 assert.NoError(t, err) 71 assert.EqualValues(t, 3, count) 72 if assert.Len(t, prs, 3) { 73 assert.EqualValues(t, 5, prs[0].ID) 74 assert.EqualValues(t, 2, prs[1].ID) 75 assert.EqualValues(t, 1, prs[2].ID) 76 } 77 } 78 79 func TestLoadRequestedReviewers(t *testing.T) { 80 assert.NoError(t, unittest.PrepareTestDatabase()) 81 82 pull := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 83 assert.NoError(t, pull.LoadIssue(db.DefaultContext)) 84 issue := pull.Issue 85 assert.NoError(t, issue.LoadRepo(db.DefaultContext)) 86 assert.Len(t, pull.RequestedReviewers, 0) 87 88 user1, err := user_model.GetUserByID(db.DefaultContext, 1) 89 assert.NoError(t, err) 90 91 comment, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user1, &user_model.User{}) 92 assert.NoError(t, err) 93 assert.NotNil(t, comment) 94 95 assert.NoError(t, pull.LoadRequestedReviewers(db.DefaultContext)) 96 assert.Len(t, pull.RequestedReviewers, 1) 97 98 comment, err = issues_model.RemoveReviewRequest(db.DefaultContext, issue, user1, &user_model.User{}) 99 assert.NoError(t, err) 100 assert.NotNil(t, comment) 101 102 pull.RequestedReviewers = nil 103 assert.NoError(t, pull.LoadRequestedReviewers(db.DefaultContext)) 104 assert.Empty(t, pull.RequestedReviewers) 105 } 106 107 func TestPullRequestsOldest(t *testing.T) { 108 assert.NoError(t, unittest.PrepareTestDatabase()) 109 prs, count, err := issues_model.PullRequests(db.DefaultContext, 1, &issues_model.PullRequestsOptions{ 110 ListOptions: db.ListOptions{ 111 Page: 1, 112 }, 113 State: "open", 114 SortType: "oldest", 115 }) 116 assert.NoError(t, err) 117 assert.EqualValues(t, 3, count) 118 if assert.Len(t, prs, 3) { 119 assert.EqualValues(t, 1, prs[0].ID) 120 assert.EqualValues(t, 2, prs[1].ID) 121 assert.EqualValues(t, 5, prs[2].ID) 122 } 123 } 124 125 func TestGetUnmergedPullRequest(t *testing.T) { 126 assert.NoError(t, unittest.PrepareTestDatabase()) 127 pr, err := issues_model.GetUnmergedPullRequest(db.DefaultContext, 1, 1, "branch2", "master", issues_model.PullRequestFlowGithub) 128 assert.NoError(t, err) 129 assert.Equal(t, int64(2), pr.ID) 130 131 _, err = issues_model.GetUnmergedPullRequest(db.DefaultContext, 1, 9223372036854775807, "branch1", "master", issues_model.PullRequestFlowGithub) 132 assert.Error(t, err) 133 assert.True(t, issues_model.IsErrPullRequestNotExist(err)) 134 } 135 136 func TestHasUnmergedPullRequestsByHeadInfo(t *testing.T) { 137 assert.NoError(t, unittest.PrepareTestDatabase()) 138 139 exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(db.DefaultContext, 1, "branch2") 140 assert.NoError(t, err) 141 assert.True(t, exist) 142 143 exist, err = issues_model.HasUnmergedPullRequestsByHeadInfo(db.DefaultContext, 1, "not_exist_branch") 144 assert.NoError(t, err) 145 assert.False(t, exist) 146 } 147 148 func TestGetUnmergedPullRequestsByHeadInfo(t *testing.T) { 149 assert.NoError(t, unittest.PrepareTestDatabase()) 150 prs, err := issues_model.GetUnmergedPullRequestsByHeadInfo(db.DefaultContext, 1, "branch2") 151 assert.NoError(t, err) 152 assert.Len(t, prs, 1) 153 for _, pr := range prs { 154 assert.Equal(t, int64(1), pr.HeadRepoID) 155 assert.Equal(t, "branch2", pr.HeadBranch) 156 } 157 } 158 159 func TestGetUnmergedPullRequestsByBaseInfo(t *testing.T) { 160 assert.NoError(t, unittest.PrepareTestDatabase()) 161 prs, err := issues_model.GetUnmergedPullRequestsByBaseInfo(db.DefaultContext, 1, "master") 162 assert.NoError(t, err) 163 assert.Len(t, prs, 1) 164 pr := prs[0] 165 assert.Equal(t, int64(2), pr.ID) 166 assert.Equal(t, int64(1), pr.BaseRepoID) 167 assert.Equal(t, "master", pr.BaseBranch) 168 } 169 170 func TestGetPullRequestByIndex(t *testing.T) { 171 assert.NoError(t, unittest.PrepareTestDatabase()) 172 pr, err := issues_model.GetPullRequestByIndex(db.DefaultContext, 1, 2) 173 assert.NoError(t, err) 174 assert.Equal(t, int64(1), pr.BaseRepoID) 175 assert.Equal(t, int64(2), pr.Index) 176 177 _, err = issues_model.GetPullRequestByIndex(db.DefaultContext, 9223372036854775807, 9223372036854775807) 178 assert.Error(t, err) 179 assert.True(t, issues_model.IsErrPullRequestNotExist(err)) 180 181 _, err = issues_model.GetPullRequestByIndex(db.DefaultContext, 1, 0) 182 assert.Error(t, err) 183 assert.True(t, issues_model.IsErrPullRequestNotExist(err)) 184 } 185 186 func TestGetPullRequestByID(t *testing.T) { 187 assert.NoError(t, unittest.PrepareTestDatabase()) 188 pr, err := issues_model.GetPullRequestByID(db.DefaultContext, 1) 189 assert.NoError(t, err) 190 assert.Equal(t, int64(1), pr.ID) 191 assert.Equal(t, int64(2), pr.IssueID) 192 193 _, err = issues_model.GetPullRequestByID(db.DefaultContext, 9223372036854775807) 194 assert.Error(t, err) 195 assert.True(t, issues_model.IsErrPullRequestNotExist(err)) 196 } 197 198 func TestGetPullRequestByIssueID(t *testing.T) { 199 assert.NoError(t, unittest.PrepareTestDatabase()) 200 pr, err := issues_model.GetPullRequestByIssueID(db.DefaultContext, 2) 201 assert.NoError(t, err) 202 assert.Equal(t, int64(2), pr.IssueID) 203 204 _, err = issues_model.GetPullRequestByIssueID(db.DefaultContext, 9223372036854775807) 205 assert.Error(t, err) 206 assert.True(t, issues_model.IsErrPullRequestNotExist(err)) 207 } 208 209 func TestPullRequest_Update(t *testing.T) { 210 assert.NoError(t, unittest.PrepareTestDatabase()) 211 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 212 pr.BaseBranch = "baseBranch" 213 pr.HeadBranch = "headBranch" 214 pr.Update(db.DefaultContext) 215 216 pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) 217 assert.Equal(t, "baseBranch", pr.BaseBranch) 218 assert.Equal(t, "headBranch", pr.HeadBranch) 219 unittest.CheckConsistencyFor(t, pr) 220 } 221 222 func TestPullRequest_UpdateCols(t *testing.T) { 223 assert.NoError(t, unittest.PrepareTestDatabase()) 224 pr := &issues_model.PullRequest{ 225 ID: 1, 226 BaseBranch: "baseBranch", 227 HeadBranch: "headBranch", 228 } 229 assert.NoError(t, pr.UpdateCols(db.DefaultContext, "head_branch")) 230 231 pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) 232 assert.Equal(t, "master", pr.BaseBranch) 233 assert.Equal(t, "headBranch", pr.HeadBranch) 234 unittest.CheckConsistencyFor(t, pr) 235 } 236 237 func TestPullRequestList_LoadAttributes(t *testing.T) { 238 assert.NoError(t, unittest.PrepareTestDatabase()) 239 240 prs := []*issues_model.PullRequest{ 241 unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}), 242 unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}), 243 } 244 assert.NoError(t, issues_model.PullRequestList(prs).LoadAttributes(db.DefaultContext)) 245 for _, pr := range prs { 246 assert.NotNil(t, pr.Issue) 247 assert.Equal(t, pr.IssueID, pr.Issue.ID) 248 } 249 250 assert.NoError(t, issues_model.PullRequestList([]*issues_model.PullRequest{}).LoadAttributes(db.DefaultContext)) 251 } 252 253 // TODO TestAddTestPullRequestTask 254 255 func TestPullRequest_IsWorkInProgress(t *testing.T) { 256 assert.NoError(t, unittest.PrepareTestDatabase()) 257 258 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) 259 pr.LoadIssue(db.DefaultContext) 260 261 assert.False(t, pr.IsWorkInProgress(db.DefaultContext)) 262 263 pr.Issue.Title = "WIP: " + pr.Issue.Title 264 assert.True(t, pr.IsWorkInProgress(db.DefaultContext)) 265 266 pr.Issue.Title = "[wip]: " + pr.Issue.Title 267 assert.True(t, pr.IsWorkInProgress(db.DefaultContext)) 268 } 269 270 func TestPullRequest_GetWorkInProgressPrefixWorkInProgress(t *testing.T) { 271 assert.NoError(t, unittest.PrepareTestDatabase()) 272 273 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) 274 pr.LoadIssue(db.DefaultContext) 275 276 assert.Empty(t, pr.GetWorkInProgressPrefix(db.DefaultContext)) 277 278 original := pr.Issue.Title 279 pr.Issue.Title = "WIP: " + original 280 assert.Equal(t, "WIP:", pr.GetWorkInProgressPrefix(db.DefaultContext)) 281 282 pr.Issue.Title = "[wip] " + original 283 assert.Equal(t, "[wip]", pr.GetWorkInProgressPrefix(db.DefaultContext)) 284 } 285 286 func TestDeleteOrphanedObjects(t *testing.T) { 287 assert.NoError(t, unittest.PrepareTestDatabase()) 288 289 countBefore, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{}) 290 assert.NoError(t, err) 291 292 _, err = db.GetEngine(db.DefaultContext).Insert(&issues_model.PullRequest{IssueID: 1000}, &issues_model.PullRequest{IssueID: 1001}, &issues_model.PullRequest{IssueID: 1003}) 293 assert.NoError(t, err) 294 295 orphaned, err := db.CountOrphanedObjects(db.DefaultContext, "pull_request", "issue", "pull_request.issue_id=issue.id") 296 assert.NoError(t, err) 297 assert.EqualValues(t, 3, orphaned) 298 299 err = db.DeleteOrphanedObjects(db.DefaultContext, "pull_request", "issue", "pull_request.issue_id=issue.id") 300 assert.NoError(t, err) 301 302 countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{}) 303 assert.NoError(t, err) 304 assert.EqualValues(t, countBefore, countAfter) 305 } 306 307 func TestParseCodeOwnersLine(t *testing.T) { 308 type CodeOwnerTest struct { 309 Line string 310 Tokens []string 311 } 312 313 given := []CodeOwnerTest{ 314 {Line: "", Tokens: nil}, 315 {Line: "# comment", Tokens: []string{}}, 316 {Line: "!.* @user1 @org1/team1", Tokens: []string{"!.*", "@user1", "@org1/team1"}}, 317 {Line: `.*\\.js @user2 #comment`, Tokens: []string{`.*\.js`, "@user2"}}, 318 {Line: `docs/(aws|google|azure)/[^/]*\\.(md|txt) @org3 @org2/team2`, Tokens: []string{`docs/(aws|google|azure)/[^/]*\.(md|txt)`, "@org3", "@org2/team2"}}, 319 {Line: `\#path @org3`, Tokens: []string{`#path`, "@org3"}}, 320 {Line: `path\ with\ spaces/ @org3`, Tokens: []string{`path with spaces/`, "@org3"}}, 321 } 322 323 for _, g := range given { 324 tokens := issues_model.TokenizeCodeOwnersLine(g.Line) 325 assert.Equal(t, g.Tokens, tokens, "Codeowners tokenizer failed") 326 } 327 } 328 329 func TestGetApprovers(t *testing.T) { 330 assert.NoError(t, unittest.PrepareTestDatabase()) 331 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 5}) 332 // Official reviews are already deduplicated. Allow unofficial reviews 333 // to assert that there are no duplicated approvers. 334 setting.Repository.PullRequest.DefaultMergeMessageOfficialApproversOnly = false 335 approvers := pr.GetApprovers(db.DefaultContext) 336 expected := "Reviewed-by: User Five <user5@example.com>\nReviewed-by: Org Six <org6@example.com>\n" 337 assert.EqualValues(t, expected, approvers) 338 } 339 340 func TestGetPullRequestByMergedCommit(t *testing.T) { 341 assert.NoError(t, unittest.PrepareTestDatabase()) 342 pr, err := issues_model.GetPullRequestByMergedCommit(db.DefaultContext, 1, "1a8823cd1a9549fde083f992f6b9b87a7ab74fb3") 343 assert.NoError(t, err) 344 assert.EqualValues(t, 1, pr.ID) 345 346 _, err = issues_model.GetPullRequestByMergedCommit(db.DefaultContext, 0, "1a8823cd1a9549fde083f992f6b9b87a7ab74fb3") 347 assert.ErrorAs(t, err, &issues_model.ErrPullRequestNotExist{}) 348 _, err = issues_model.GetPullRequestByMergedCommit(db.DefaultContext, 1, "") 349 assert.ErrorAs(t, err, &issues_model.ErrPullRequestNotExist{}) 350 } 351 352 func TestMigrate_InsertPullRequests(t *testing.T) { 353 assert.NoError(t, unittest.PrepareTestDatabase()) 354 reponame := "repo1" 355 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: reponame}) 356 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 357 358 i := &issues_model.Issue{ 359 RepoID: repo.ID, 360 Repo: repo, 361 Title: "title1", 362 Content: "issuecontent1", 363 IsPull: true, 364 PosterID: owner.ID, 365 Poster: owner, 366 } 367 368 p := &issues_model.PullRequest{ 369 Issue: i, 370 } 371 372 err := issues_model.InsertPullRequests(db.DefaultContext, p) 373 assert.NoError(t, err) 374 375 _ = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{IssueID: i.ID}) 376 377 unittest.CheckConsistencyFor(t, &issues_model.Issue{}, &issues_model.PullRequest{}) 378 }