summaryrefslogtreecommitdiffstats
path: root/tests/integration/forgejo_git_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'tests/integration/forgejo_git_test.go')
-rw-r--r--tests/integration/forgejo_git_test.go137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/integration/forgejo_git_test.go b/tests/integration/forgejo_git_test.go
new file mode 100644
index 0000000..ebad074
--- /dev/null
+++ b/tests/integration/forgejo_git_test.go
@@ -0,0 +1,137 @@
+// 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/require"
+)
+
+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)
+ require.NoError(t, err)
+
+ err = git.AddChanges(dstPath, true)
+ require.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",
+ })
+ require.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})
+ require.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)
+ require.NoError(t, err)
+ })
+ doerCtx.ExpectedCode = http.StatusCreated
+ t.Run("AutoMergePR", doAPIAutoMergePullRequest(doerCtx, ctx.Username, ctx.Reponame, pr.Index))
+ // Ensure the PR page works
+ t.Run("EnsureCanSeePull", doEnsureCanSeePull(ctx, pr, true))
+ }
+}