2019-07-30 04:59:10 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-07-30 04:59:10 +03:00
2021-11-21 12:11:48 +03:00
package issue
2019-07-30 04:59:10 +03:00
import (
"testing"
2022-08-25 05:31:57 +03:00
activities_model "code.gitea.io/gitea/models/activities"
2023-07-22 17:14:27 +03:00
"code.gitea.io/gitea/models/db"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-01-10 12:34:21 +03:00
"code.gitea.io/gitea/modules/repository"
2020-08-06 22:20:05 +03:00
"code.gitea.io/gitea/modules/setting"
2019-07-30 04:59:10 +03:00
"github.com/stretchr/testify/assert"
)
2019-12-07 18:52:36 +03:00
func TestUpdateIssuesCommit ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2020-01-10 12:34:21 +03:00
pushCommits := [ ] * repository . PushCommit {
2019-12-07 18:52:36 +03:00
{
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" ,
} ,
}
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2019-12-07 18:52:36 +03:00
repo . Owner = user
2022-06-13 12:37:59 +03:00
commentBean := & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2019-12-07 18:52:36 +03:00
CommitSHA : "abcdef1" ,
PosterID : user . ID ,
IssueID : 1 ,
}
2022-06-13 12:37:59 +03:00
issueBean := & issues_model . Issue { RepoID : repo . ID , Index : 4 }
2019-12-07 18:52:36 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
2022-06-13 12:37:59 +03:00
unittest . AssertNotExistsBean ( t , & issues_model . Issue { RepoID : repo . ID , Index : 2 } , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , repo . DefaultBranch ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , commentBean )
unittest . AssertExistsAndLoadBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2019-12-07 18:52:36 +03:00
// Test that push to a non-default branch closes no issue.
2020-01-10 12:34:21 +03:00
pushCommits = [ ] * repository . PushCommit {
2019-12-07 18:52:36 +03:00
{
Sha1 : "abcdef1" ,
CommitterEmail : "user2@example.com" ,
CommitterName : "User Two" ,
AuthorEmail : "user4@example.com" ,
AuthorName : "User Four" ,
Message : "close #1" ,
} ,
}
2022-08-16 05:22:25 +03:00
repo = unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 3 } )
2022-06-13 12:37:59 +03:00
commentBean = & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2019-12-07 18:52:36 +03:00
CommitSHA : "abcdef1" ,
PosterID : user . ID ,
IssueID : 6 ,
}
2022-06-13 12:37:59 +03:00
issueBean = & issues_model . Issue { RepoID : repo . ID , Index : 1 }
2019-12-07 18:52:36 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
2022-06-13 12:37:59 +03:00
unittest . AssertNotExistsBean ( t , & issues_model . Issue { RepoID : repo . ID , Index : 1 } , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , "non-existing-branch" ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , commentBean )
unittest . AssertNotExistsBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2020-08-06 22:20:05 +03:00
pushCommits = [ ] * repository . PushCommit {
{
Sha1 : "abcdef3" ,
CommitterEmail : "user2@example.com" ,
CommitterName : "User Two" ,
AuthorEmail : "user2@example.com" ,
AuthorName : "User Two" ,
Message : "close " + setting . AppURL + repo . FullName ( ) + "/pulls/1" ,
} ,
}
2022-08-16 05:22:25 +03:00
repo = unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 3 } )
2022-06-13 12:37:59 +03:00
commentBean = & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2020-08-06 22:20:05 +03:00
CommitSHA : "abcdef3" ,
PosterID : user . ID ,
IssueID : 6 ,
}
2022-06-13 12:37:59 +03:00
issueBean = & issues_model . Issue { RepoID : repo . ID , Index : 1 }
2020-08-06 22:20:05 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
2022-06-13 12:37:59 +03:00
unittest . AssertNotExistsBean ( t , & issues_model . Issue { RepoID : repo . ID , Index : 1 } , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , repo . DefaultBranch ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , commentBean )
unittest . AssertExistsAndLoadBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2019-12-07 18:52:36 +03:00
}
func TestUpdateIssuesCommit_Colon ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2020-01-10 12:34:21 +03:00
pushCommits := [ ] * repository . PushCommit {
2019-12-07 18:52:36 +03:00
{
Sha1 : "abcdef2" ,
CommitterEmail : "user2@example.com" ,
CommitterName : "User Two" ,
AuthorEmail : "user2@example.com" ,
AuthorName : "User Two" ,
Message : "close: #2" ,
} ,
}
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2019-12-07 18:52:36 +03:00
repo . Owner = user
2022-06-13 12:37:59 +03:00
issueBean := & issues_model . Issue { RepoID : repo . ID , Index : 4 }
2019-12-07 18:52:36 +03:00
2022-06-13 12:37:59 +03:00
unittest . AssertNotExistsBean ( t , & issues_model . Issue { RepoID : repo . ID , Index : 2 } , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , repo . DefaultBranch ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2019-12-07 18:52:36 +03:00
}
func TestUpdateIssuesCommit_Issue5957 ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2019-12-07 18:52:36 +03:00
// Test that push to a non-default branch closes an issue.
2020-01-10 12:34:21 +03:00
pushCommits := [ ] * repository . PushCommit {
2019-12-07 18:52:36 +03:00
{
Sha1 : "abcdef1" ,
CommitterEmail : "user2@example.com" ,
CommitterName : "User Two" ,
AuthorEmail : "user4@example.com" ,
AuthorName : "User Four" ,
Message : "close #2" ,
} ,
}
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 2 } )
2022-06-13 12:37:59 +03:00
commentBean := & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2019-12-07 18:52:36 +03:00
CommitSHA : "abcdef1" ,
PosterID : user . ID ,
IssueID : 7 ,
}
2022-06-13 12:37:59 +03:00
issueBean := & issues_model . Issue { RepoID : repo . ID , Index : 2 , ID : 7 }
2019-12-07 18:52:36 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
unittest . AssertNotExistsBean ( t , issueBean , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , "non-existing-branch" ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , commentBean )
unittest . AssertExistsAndLoadBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2019-12-07 18:52:36 +03:00
}
func TestUpdateIssuesCommit_AnotherRepo ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2019-12-07 18:52:36 +03:00
// Test that a push to default branch closes issue in another repo
// If the user also has push permissions to that repo
2020-01-10 12:34:21 +03:00
pushCommits := [ ] * repository . PushCommit {
2019-12-07 18:52:36 +03:00
{
Sha1 : "abcdef1" ,
CommitterEmail : "user2@example.com" ,
CommitterName : "User Two" ,
AuthorEmail : "user2@example.com" ,
AuthorName : "User Two" ,
Message : "close user2/repo1#1" ,
} ,
}
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 2 } )
2022-06-13 12:37:59 +03:00
commentBean := & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2019-12-07 18:52:36 +03:00
CommitSHA : "abcdef1" ,
PosterID : user . ID ,
IssueID : 1 ,
}
2022-06-13 12:37:59 +03:00
issueBean := & issues_model . Issue { RepoID : 1 , Index : 1 , ID : 1 }
2019-12-07 18:52:36 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
unittest . AssertNotExistsBean ( t , issueBean , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , repo . DefaultBranch ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , commentBean )
unittest . AssertExistsAndLoadBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2019-12-07 18:52:36 +03:00
}
2020-08-06 22:20:05 +03:00
func TestUpdateIssuesCommit_AnotherRepo_FullAddress ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2020-08-06 22:20:05 +03:00
// Test that a push to default branch closes issue in another repo
// If the user also has push permissions to that repo
pushCommits := [ ] * repository . PushCommit {
{
Sha1 : "abcdef1" ,
CommitterEmail : "user2@example.com" ,
CommitterName : "User Two" ,
AuthorEmail : "user2@example.com" ,
AuthorName : "User Two" ,
Message : "close " + setting . AppURL + "user2/repo1/issues/1" ,
} ,
}
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 2 } )
2022-06-13 12:37:59 +03:00
commentBean := & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2020-08-06 22:20:05 +03:00
CommitSHA : "abcdef1" ,
PosterID : user . ID ,
IssueID : 1 ,
}
2022-06-13 12:37:59 +03:00
issueBean := & issues_model . Issue { RepoID : 1 , Index : 1 , ID : 1 }
2020-08-06 22:20:05 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
unittest . AssertNotExistsBean ( t , issueBean , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , repo . DefaultBranch ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , commentBean )
unittest . AssertExistsAndLoadBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2020-08-06 22:20:05 +03:00
}
2019-12-07 18:52:36 +03:00
func TestUpdateIssuesCommit_AnotherRepoNoPermission ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 10 } )
2019-12-07 18:52:36 +03:00
// Test that a push with close reference *can not* close issue
2021-07-08 14:38:13 +03:00
// If the committer doesn't have push rights in that repo
2020-01-10 12:34:21 +03:00
pushCommits := [ ] * repository . PushCommit {
2019-12-07 18:52:36 +03:00
{
Sha1 : "abcdef3" ,
CommitterEmail : "user10@example.com" ,
CommitterName : "User Ten" ,
AuthorEmail : "user10@example.com" ,
AuthorName : "User Ten" ,
2023-09-14 05:59:53 +03:00
Message : "close org3/repo3#1" ,
2019-12-07 18:52:36 +03:00
} ,
2020-08-06 22:20:05 +03:00
{
Sha1 : "abcdef4" ,
CommitterEmail : "user10@example.com" ,
CommitterName : "User Ten" ,
AuthorEmail : "user10@example.com" ,
AuthorName : "User Ten" ,
2023-09-14 05:59:53 +03:00
Message : "close " + setting . AppURL + "org3/repo3/issues/1" ,
2020-08-06 22:20:05 +03:00
} ,
2019-12-07 18:52:36 +03:00
}
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 6 } )
2022-06-13 12:37:59 +03:00
commentBean := & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2019-12-07 18:52:36 +03:00
CommitSHA : "abcdef3" ,
PosterID : user . ID ,
IssueID : 6 ,
}
2022-06-13 12:37:59 +03:00
commentBean2 := & issues_model . Comment {
Type : issues_model . CommentTypeCommitRef ,
2020-08-06 22:20:05 +03:00
CommitSHA : "abcdef4" ,
PosterID : user . ID ,
IssueID : 6 ,
}
2019-12-07 18:52:36 +03:00
2022-06-13 12:37:59 +03:00
issueBean := & issues_model . Issue { RepoID : 3 , Index : 1 , ID : 6 }
2019-12-07 18:52:36 +03:00
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
unittest . AssertNotExistsBean ( t , commentBean2 )
unittest . AssertNotExistsBean ( t , issueBean , "is_closed=1" )
2023-07-22 17:14:27 +03:00
assert . NoError ( t , UpdateIssuesCommit ( db . DefaultContext , user , repo , pushCommits , repo . DefaultBranch ) )
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , commentBean )
unittest . AssertNotExistsBean ( t , commentBean2 )
unittest . AssertNotExistsBean ( t , issueBean , "is_closed=1" )
2022-08-25 05:31:57 +03:00
unittest . CheckConsistencyFor ( t , & activities_model . Action { } )
2019-12-07 18:52:36 +03:00
}