diff options
Diffstat (limited to 'modules/repofiles/action_test.go')
-rw-r--r-- | modules/repofiles/action_test.go | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/modules/repofiles/action_test.go b/modules/repofiles/action_test.go index 9ae1042e22..5a4c6231f3 100644 --- a/modules/repofiles/action_test.go +++ b/modules/repofiles/action_test.go @@ -124,3 +124,208 @@ func TestCommitRepoAction(t *testing.T) { testCorrectRepoAction(t, s.commitRepoActionOptions, &s.action) } } + +func TestUpdateIssuesCommit(t *testing.T) { + assert.NoError(t, models.PrepareTestDatabase()) + pushCommits := []*models.PushCommit{ + { + Sha1: "abcdef1", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user4@example.com", + AuthorName: "User Four", + Message: "start working on #FST-1, #1", + }, + { + Sha1: "abcdef2", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user2@example.com", + AuthorName: "User Two", + Message: "a plain message", + }, + { + Sha1: "abcdef2", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user2@example.com", + AuthorName: "User Two", + Message: "close #2", + }, + } + + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + repo.Owner = user + + commentBean := &models.Comment{ + Type: models.CommentTypeCommitRef, + CommitSHA: "abcdef1", + PosterID: user.ID, + IssueID: 1, + } + issueBean := &models.Issue{RepoID: repo.ID, Index: 4} + + models.AssertNotExistsBean(t, commentBean) + models.AssertNotExistsBean(t, &models.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1") + assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch)) + models.AssertExistsAndLoadBean(t, commentBean) + models.AssertExistsAndLoadBean(t, issueBean, "is_closed=1") + models.CheckConsistencyFor(t, &models.Action{}) + + // Test that push to a non-default branch closes no issue. + pushCommits = []*models.PushCommit{ + { + Sha1: "abcdef1", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user4@example.com", + AuthorName: "User Four", + Message: "close #1", + }, + } + repo = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) + commentBean = &models.Comment{ + Type: models.CommentTypeCommitRef, + CommitSHA: "abcdef1", + PosterID: user.ID, + IssueID: 6, + } + issueBean = &models.Issue{RepoID: repo.ID, Index: 1} + + models.AssertNotExistsBean(t, commentBean) + models.AssertNotExistsBean(t, &models.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1") + assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, "non-existing-branch")) + models.AssertExistsAndLoadBean(t, commentBean) + models.AssertNotExistsBean(t, issueBean, "is_closed=1") + models.CheckConsistencyFor(t, &models.Action{}) +} + +func TestUpdateIssuesCommit_Colon(t *testing.T) { + assert.NoError(t, models.PrepareTestDatabase()) + pushCommits := []*models.PushCommit{ + { + Sha1: "abcdef2", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user2@example.com", + AuthorName: "User Two", + Message: "close: #2", + }, + } + + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + repo.Owner = user + + issueBean := &models.Issue{RepoID: repo.ID, Index: 4} + + models.AssertNotExistsBean(t, &models.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1") + assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch)) + models.AssertExistsAndLoadBean(t, issueBean, "is_closed=1") + models.CheckConsistencyFor(t, &models.Action{}) +} + +func TestUpdateIssuesCommit_Issue5957(t *testing.T) { + assert.NoError(t, models.PrepareTestDatabase()) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + + // Test that push to a non-default branch closes an issue. + pushCommits := []*models.PushCommit{ + { + Sha1: "abcdef1", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user4@example.com", + AuthorName: "User Four", + Message: "close #2", + }, + } + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 2}).(*models.Repository) + commentBean := &models.Comment{ + Type: models.CommentTypeCommitRef, + CommitSHA: "abcdef1", + PosterID: user.ID, + IssueID: 7, + } + + issueBean := &models.Issue{RepoID: repo.ID, Index: 2, ID: 7} + + models.AssertNotExistsBean(t, commentBean) + models.AssertNotExistsBean(t, issueBean, "is_closed=1") + assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, "non-existing-branch")) + models.AssertExistsAndLoadBean(t, commentBean) + models.AssertExistsAndLoadBean(t, issueBean, "is_closed=1") + models.CheckConsistencyFor(t, &models.Action{}) +} + +func TestUpdateIssuesCommit_AnotherRepo(t *testing.T) { + assert.NoError(t, models.PrepareTestDatabase()) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + + // Test that a push to default branch closes issue in another repo + // If the user also has push permissions to that repo + pushCommits := []*models.PushCommit{ + { + Sha1: "abcdef1", + CommitterEmail: "user2@example.com", + CommitterName: "User Two", + AuthorEmail: "user2@example.com", + AuthorName: "User Two", + Message: "close user2/repo1#1", + }, + } + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 2}).(*models.Repository) + commentBean := &models.Comment{ + Type: models.CommentTypeCommitRef, + CommitSHA: "abcdef1", + PosterID: user.ID, + IssueID: 1, + } + + issueBean := &models.Issue{RepoID: 1, Index: 1, ID: 1} + + models.AssertNotExistsBean(t, commentBean) + models.AssertNotExistsBean(t, issueBean, "is_closed=1") + assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch)) + models.AssertExistsAndLoadBean(t, commentBean) + models.AssertExistsAndLoadBean(t, issueBean, "is_closed=1") + models.CheckConsistencyFor(t, &models.Action{}) +} + +func TestUpdateIssuesCommit_AnotherRepoNoPermission(t *testing.T) { + assert.NoError(t, models.PrepareTestDatabase()) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 10}).(*models.User) + + // Test that a push with close reference *can not* close issue + // If the commiter doesn't have push rights in that repo + pushCommits := []*models.PushCommit{ + { + Sha1: "abcdef3", + CommitterEmail: "user10@example.com", + CommitterName: "User Ten", + AuthorEmail: "user10@example.com", + AuthorName: "User Ten", + Message: "close user3/repo3#1", + }, + } + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 6}).(*models.Repository) + commentBean := &models.Comment{ + Type: models.CommentTypeCommitRef, + CommitSHA: "abcdef3", + PosterID: user.ID, + IssueID: 6, + } + + issueBean := &models.Issue{RepoID: 3, Index: 1, ID: 6} + + models.AssertNotExistsBean(t, commentBean) + models.AssertNotExistsBean(t, issueBean, "is_closed=1") + assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch)) + models.AssertNotExistsBean(t, commentBean) + models.AssertNotExistsBean(t, issueBean, "is_closed=1") + models.CheckConsistencyFor(t, &models.Action{}) +} |