2023-12-09 14:52:30 +01: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"), 0o666)
|
|
|
|
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-19 22:18:07 +01:00
|
|
|
t.Run("EnsureCanSeePull", doEnsureCanSeePull(ctx, pr, true))
|
2023-12-09 14:52:30 +01:00
|
|
|
}
|
|
|
|
}
|