code.gitea.io/gitea@v1.21.7/services/issue/commit_test.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package issue
     5  
     6  import (
     7  	"testing"
     8  
     9  	activities_model "code.gitea.io/gitea/models/activities"
    10  	"code.gitea.io/gitea/models/db"
    11  	issues_model "code.gitea.io/gitea/models/issues"
    12  	repo_model "code.gitea.io/gitea/models/repo"
    13  	"code.gitea.io/gitea/models/unittest"
    14  	user_model "code.gitea.io/gitea/models/user"
    15  	"code.gitea.io/gitea/modules/repository"
    16  	"code.gitea.io/gitea/modules/setting"
    17  
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  func TestUpdateIssuesCommit(t *testing.T) {
    22  	assert.NoError(t, unittest.PrepareTestDatabase())
    23  	pushCommits := []*repository.PushCommit{
    24  		{
    25  			Sha1:           "abcdef1",
    26  			CommitterEmail: "user2@example.com",
    27  			CommitterName:  "User Two",
    28  			AuthorEmail:    "user4@example.com",
    29  			AuthorName:     "User Four",
    30  			Message:        "start working on #FST-1, #1",
    31  		},
    32  		{
    33  			Sha1:           "abcdef2",
    34  			CommitterEmail: "user2@example.com",
    35  			CommitterName:  "User Two",
    36  			AuthorEmail:    "user2@example.com",
    37  			AuthorName:     "User Two",
    38  			Message:        "a plain message",
    39  		},
    40  		{
    41  			Sha1:           "abcdef2",
    42  			CommitterEmail: "user2@example.com",
    43  			CommitterName:  "User Two",
    44  			AuthorEmail:    "user2@example.com",
    45  			AuthorName:     "User Two",
    46  			Message:        "close #2",
    47  		},
    48  	}
    49  
    50  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    51  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    52  	repo.Owner = user
    53  
    54  	commentBean := &issues_model.Comment{
    55  		Type:      issues_model.CommentTypeCommitRef,
    56  		CommitSHA: "abcdef1",
    57  		PosterID:  user.ID,
    58  		IssueID:   1,
    59  	}
    60  	issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 4}
    61  
    62  	unittest.AssertNotExistsBean(t, commentBean)
    63  	unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
    64  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
    65  	unittest.AssertExistsAndLoadBean(t, commentBean)
    66  	unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
    67  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
    68  
    69  	// Test that push to a non-default branch closes no issue.
    70  	pushCommits = []*repository.PushCommit{
    71  		{
    72  			Sha1:           "abcdef1",
    73  			CommitterEmail: "user2@example.com",
    74  			CommitterName:  "User Two",
    75  			AuthorEmail:    "user4@example.com",
    76  			AuthorName:     "User Four",
    77  			Message:        "close #1",
    78  		},
    79  	}
    80  	repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
    81  	commentBean = &issues_model.Comment{
    82  		Type:      issues_model.CommentTypeCommitRef,
    83  		CommitSHA: "abcdef1",
    84  		PosterID:  user.ID,
    85  		IssueID:   6,
    86  	}
    87  	issueBean = &issues_model.Issue{RepoID: repo.ID, Index: 1}
    88  
    89  	unittest.AssertNotExistsBean(t, commentBean)
    90  	unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
    91  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, "non-existing-branch"))
    92  	unittest.AssertExistsAndLoadBean(t, commentBean)
    93  	unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
    94  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
    95  
    96  	pushCommits = []*repository.PushCommit{
    97  		{
    98  			Sha1:           "abcdef3",
    99  			CommitterEmail: "user2@example.com",
   100  			CommitterName:  "User Two",
   101  			AuthorEmail:    "user2@example.com",
   102  			AuthorName:     "User Two",
   103  			Message:        "close " + setting.AppURL + repo.FullName() + "/pulls/1",
   104  		},
   105  	}
   106  	repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
   107  	commentBean = &issues_model.Comment{
   108  		Type:      issues_model.CommentTypeCommitRef,
   109  		CommitSHA: "abcdef3",
   110  		PosterID:  user.ID,
   111  		IssueID:   6,
   112  	}
   113  	issueBean = &issues_model.Issue{RepoID: repo.ID, Index: 1}
   114  
   115  	unittest.AssertNotExistsBean(t, commentBean)
   116  	unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
   117  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
   118  	unittest.AssertExistsAndLoadBean(t, commentBean)
   119  	unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
   120  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
   121  }
   122  
   123  func TestUpdateIssuesCommit_Colon(t *testing.T) {
   124  	assert.NoError(t, unittest.PrepareTestDatabase())
   125  	pushCommits := []*repository.PushCommit{
   126  		{
   127  			Sha1:           "abcdef2",
   128  			CommitterEmail: "user2@example.com",
   129  			CommitterName:  "User Two",
   130  			AuthorEmail:    "user2@example.com",
   131  			AuthorName:     "User Two",
   132  			Message:        "close: #2",
   133  		},
   134  	}
   135  
   136  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   137  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   138  	repo.Owner = user
   139  
   140  	issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 4}
   141  
   142  	unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
   143  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
   144  	unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
   145  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
   146  }
   147  
   148  func TestUpdateIssuesCommit_Issue5957(t *testing.T) {
   149  	assert.NoError(t, unittest.PrepareTestDatabase())
   150  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   151  
   152  	// Test that push to a non-default branch closes an issue.
   153  	pushCommits := []*repository.PushCommit{
   154  		{
   155  			Sha1:           "abcdef1",
   156  			CommitterEmail: "user2@example.com",
   157  			CommitterName:  "User Two",
   158  			AuthorEmail:    "user4@example.com",
   159  			AuthorName:     "User Four",
   160  			Message:        "close #2",
   161  		},
   162  	}
   163  
   164  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
   165  	commentBean := &issues_model.Comment{
   166  		Type:      issues_model.CommentTypeCommitRef,
   167  		CommitSHA: "abcdef1",
   168  		PosterID:  user.ID,
   169  		IssueID:   7,
   170  	}
   171  
   172  	issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 2, ID: 7}
   173  
   174  	unittest.AssertNotExistsBean(t, commentBean)
   175  	unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
   176  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, "non-existing-branch"))
   177  	unittest.AssertExistsAndLoadBean(t, commentBean)
   178  	unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
   179  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
   180  }
   181  
   182  func TestUpdateIssuesCommit_AnotherRepo(t *testing.T) {
   183  	assert.NoError(t, unittest.PrepareTestDatabase())
   184  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   185  
   186  	// Test that a push to default branch closes issue in another repo
   187  	// If the user also has push permissions to that repo
   188  	pushCommits := []*repository.PushCommit{
   189  		{
   190  			Sha1:           "abcdef1",
   191  			CommitterEmail: "user2@example.com",
   192  			CommitterName:  "User Two",
   193  			AuthorEmail:    "user2@example.com",
   194  			AuthorName:     "User Two",
   195  			Message:        "close user2/repo1#1",
   196  		},
   197  	}
   198  
   199  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
   200  	commentBean := &issues_model.Comment{
   201  		Type:      issues_model.CommentTypeCommitRef,
   202  		CommitSHA: "abcdef1",
   203  		PosterID:  user.ID,
   204  		IssueID:   1,
   205  	}
   206  
   207  	issueBean := &issues_model.Issue{RepoID: 1, Index: 1, ID: 1}
   208  
   209  	unittest.AssertNotExistsBean(t, commentBean)
   210  	unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
   211  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
   212  	unittest.AssertExistsAndLoadBean(t, commentBean)
   213  	unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
   214  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
   215  }
   216  
   217  func TestUpdateIssuesCommit_AnotherRepo_FullAddress(t *testing.T) {
   218  	assert.NoError(t, unittest.PrepareTestDatabase())
   219  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   220  
   221  	// Test that a push to default branch closes issue in another repo
   222  	// If the user also has push permissions to that repo
   223  	pushCommits := []*repository.PushCommit{
   224  		{
   225  			Sha1:           "abcdef1",
   226  			CommitterEmail: "user2@example.com",
   227  			CommitterName:  "User Two",
   228  			AuthorEmail:    "user2@example.com",
   229  			AuthorName:     "User Two",
   230  			Message:        "close " + setting.AppURL + "user2/repo1/issues/1",
   231  		},
   232  	}
   233  
   234  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
   235  	commentBean := &issues_model.Comment{
   236  		Type:      issues_model.CommentTypeCommitRef,
   237  		CommitSHA: "abcdef1",
   238  		PosterID:  user.ID,
   239  		IssueID:   1,
   240  	}
   241  
   242  	issueBean := &issues_model.Issue{RepoID: 1, Index: 1, ID: 1}
   243  
   244  	unittest.AssertNotExistsBean(t, commentBean)
   245  	unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
   246  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
   247  	unittest.AssertExistsAndLoadBean(t, commentBean)
   248  	unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
   249  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
   250  }
   251  
   252  func TestUpdateIssuesCommit_AnotherRepoNoPermission(t *testing.T) {
   253  	assert.NoError(t, unittest.PrepareTestDatabase())
   254  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
   255  
   256  	// Test that a push with close reference *can not* close issue
   257  	// If the committer doesn't have push rights in that repo
   258  	pushCommits := []*repository.PushCommit{
   259  		{
   260  			Sha1:           "abcdef3",
   261  			CommitterEmail: "user10@example.com",
   262  			CommitterName:  "User Ten",
   263  			AuthorEmail:    "user10@example.com",
   264  			AuthorName:     "User Ten",
   265  			Message:        "close org3/repo3#1",
   266  		},
   267  		{
   268  			Sha1:           "abcdef4",
   269  			CommitterEmail: "user10@example.com",
   270  			CommitterName:  "User Ten",
   271  			AuthorEmail:    "user10@example.com",
   272  			AuthorName:     "User Ten",
   273  			Message:        "close " + setting.AppURL + "org3/repo3/issues/1",
   274  		},
   275  	}
   276  
   277  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 6})
   278  	commentBean := &issues_model.Comment{
   279  		Type:      issues_model.CommentTypeCommitRef,
   280  		CommitSHA: "abcdef3",
   281  		PosterID:  user.ID,
   282  		IssueID:   6,
   283  	}
   284  	commentBean2 := &issues_model.Comment{
   285  		Type:      issues_model.CommentTypeCommitRef,
   286  		CommitSHA: "abcdef4",
   287  		PosterID:  user.ID,
   288  		IssueID:   6,
   289  	}
   290  
   291  	issueBean := &issues_model.Issue{RepoID: 3, Index: 1, ID: 6}
   292  
   293  	unittest.AssertNotExistsBean(t, commentBean)
   294  	unittest.AssertNotExistsBean(t, commentBean2)
   295  	unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
   296  	assert.NoError(t, UpdateIssuesCommit(db.DefaultContext, user, repo, pushCommits, repo.DefaultBranch))
   297  	unittest.AssertNotExistsBean(t, commentBean)
   298  	unittest.AssertNotExistsBean(t, commentBean2)
   299  	unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
   300  	unittest.CheckConsistencyFor(t, &activities_model.Action{})
   301  }