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  }