2023-12-09 16:52:30 +03:00
// Copyright Earl Warren <contact@earl-warren.org>
// SPDX-License-Identifier: MIT
package integration
import (
"net/http"
"net/url"
"os"
"path"
"testing"
"time"
actions_model "code.gitea.io/gitea/models/actions"
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
)
func TestActionsUserGit ( t * testing . T ) {
onGiteaRun ( t , testActionsUserGit )
}
func NewActionsUserTestContext ( t * testing . T , username , reponame string ) APITestContext {
t . Helper ( )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { Name : reponame } )
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { Name : username } )
task := unittest . AssertExistsAndLoadBean ( t , & actions_model . ActionTask { ID : 47 } )
task . RepoID = repo . ID
task . OwnerID = repoOwner . ID
task . GenerateToken ( )
actions_model . UpdateTask ( db . DefaultContext , task )
return APITestContext {
Session : emptyTestSession ( t ) ,
Token : task . Token ,
Username : username ,
Reponame : reponame ,
}
}
func testActionsUserGit ( t * testing . T , u * url . URL ) {
username := "user2"
reponame := "repo1"
httpContext := NewAPITestContext ( t , username , reponame , auth_model . AccessTokenScopeWriteRepository , auth_model . AccessTokenScopeWriteUser )
for _ , testCase := range [ ] struct {
name string
head string
ctx APITestContext
} {
{
name : "UserTypeIndividual" ,
head : "individualhead" ,
ctx : httpContext ,
} ,
{
name : "ActionsUser" ,
head : "actionsuserhead" ,
ctx : NewActionsUserTestContext ( t , username , reponame ) ,
} ,
} {
t . Run ( "CreatePR " + testCase . name , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
dstPath := t . TempDir ( )
u . Path = httpContext . GitPath ( )
u . User = url . UserPassword ( httpContext . Username , userPassword )
t . Run ( "Clone" , doGitClone ( dstPath , u ) )
t . Run ( "PopulateBranch" , doActionsUserPopulateBranch ( dstPath , & httpContext , "master" , testCase . head ) )
t . Run ( "CreatePR" , doActionsUserPR ( httpContext , testCase . ctx , "master" , testCase . head ) )
} )
}
}
func doActionsUserPopulateBranch ( dstPath string , ctx * APITestContext , baseBranch , headBranch string ) func ( t * testing . T ) {
return func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
t . Run ( "CreateHeadBranch" , doGitCreateBranch ( dstPath , headBranch ) )
t . Run ( "AddCommit" , func ( t * testing . T ) {
err := os . WriteFile ( path . Join ( dstPath , "test_file" ) , [ ] byte ( "## test content" ) , 0 o666 )
if ! assert . NoError ( t , err ) {
return
}
err = git . AddChanges ( dstPath , true )
assert . NoError ( t , err )
err = git . CommitChanges ( dstPath , git . CommitChangesOptions {
Committer : & git . Signature {
Email : "user2@example.com" ,
Name : "user2" ,
When : time . Now ( ) ,
} ,
Author : & git . Signature {
Email : "user2@example.com" ,
Name : "user2" ,
When : time . Now ( ) ,
} ,
Message : "Testing commit 1" ,
} )
assert . NoError ( t , err )
} )
t . Run ( "Push" , func ( t * testing . T ) {
err := git . NewCommand ( git . DefaultContext , "push" , "origin" ) . AddDynamicArguments ( "HEAD:refs/heads/" + headBranch ) . Run ( & git . RunOpts { Dir : dstPath } )
assert . NoError ( t , err )
} )
}
}
func doActionsUserPR ( ctx , doerCtx APITestContext , baseBranch , headBranch string ) func ( t * testing . T ) {
return func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
var pr api . PullRequest
var err error
// Create a test pullrequest
t . Run ( "CreatePullRequest" , func ( t * testing . T ) {
pr , err = doAPICreatePullRequest ( doerCtx , ctx . Username , ctx . Reponame , baseBranch , headBranch ) ( t )
assert . NoError ( t , err )
} )
doerCtx . ExpectedCode = http . StatusCreated
t . Run ( "AutoMergePR" , doAPIAutoMergePullRequest ( doerCtx , ctx . Username , ctx . Reponame , pr . Index ) )
// Ensure the PR page works
2023-12-20 00:18:07 +03:00
t . Run ( "EnsureCanSeePull" , doEnsureCanSeePull ( ctx , pr , true ) )
2023-12-09 16:52:30 +03:00
}
}