123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- // Copyright 2023 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package integration
-
- import (
- "net/url"
- "strings"
- "testing"
- "time"
-
- actions_model "code.gitea.io/gitea/models/actions"
- "code.gitea.io/gitea/models/db"
- issues_model "code.gitea.io/gitea/models/issues"
- repo_model "code.gitea.io/gitea/models/repo"
- unit_model "code.gitea.io/gitea/models/unit"
- "code.gitea.io/gitea/models/unittest"
- user_model "code.gitea.io/gitea/models/user"
- actions_module "code.gitea.io/gitea/modules/actions"
- "code.gitea.io/gitea/modules/git"
- pull_service "code.gitea.io/gitea/services/pull"
- repo_service "code.gitea.io/gitea/services/repository"
- files_service "code.gitea.io/gitea/services/repository/files"
-
- "github.com/stretchr/testify/assert"
- )
-
- func TestPullRequestTargetEvent(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the base repo
- org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the forked repo
-
- // create the base repo
- baseRepo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
- Name: "repo-pull-request-target",
- Description: "test pull-request-target event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, baseRepo)
-
- // enable actions
- err = repo_service.UpdateRepositoryUnits(db.DefaultContext, baseRepo, []repo_model.RepoUnit{{
- RepoID: baseRepo.ID,
- Type: unit_model.TypeActions,
- }}, nil)
- assert.NoError(t, err)
-
- // create the forked repo
- forkedRepo, err := repo_service.ForkRepository(git.DefaultContext, user2, org3, repo_service.ForkRepoOptions{
- BaseRepo: baseRepo,
- Name: "forked-repo-pull-request-target",
- Description: "test pull-request-target event",
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, forkedRepo)
-
- // add workflow file to the base repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/pr.yml",
- ContentReader: strings.NewReader("name: test\non:\n pull_request_target:\n paths:\n - 'file_*.txt'\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- Name: user2.Name,
- Email: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- Name: user2.Name,
- Email: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // add a new file to the forked repo
- addFileToForkedResp, err := files_service.ChangeRepoFiles(git.DefaultContext, forkedRepo, org3, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: "file_1.txt",
- ContentReader: strings.NewReader("file1"),
- },
- },
- Message: "add file1",
- OldBranch: "main",
- NewBranch: "fork-branch-1",
- Author: &files_service.IdentityOptions{
- Name: org3.Name,
- Email: org3.Email,
- },
- Committer: &files_service.IdentityOptions{
- Name: org3.Name,
- Email: org3.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addFileToForkedResp)
-
- // create Pull
- pullIssue := &issues_model.Issue{
- RepoID: baseRepo.ID,
- Title: "Test pull-request-target-event",
- PosterID: org3.ID,
- Poster: org3,
- IsPull: true,
- }
- pullRequest := &issues_model.PullRequest{
- HeadRepoID: forkedRepo.ID,
- BaseRepoID: baseRepo.ID,
- HeadBranch: "fork-branch-1",
- BaseBranch: "main",
- HeadRepo: forkedRepo,
- BaseRepo: baseRepo,
- Type: issues_model.PullRequestGitea,
- }
- err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
- assert.NoError(t, err)
-
- // load and compare ActionRun
- assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: baseRepo.ID}))
- actionRun := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{RepoID: baseRepo.ID})
- assert.Equal(t, addFileToForkedResp.Commit.SHA, actionRun.CommitSHA)
- assert.Equal(t, actions_module.GithubEventPullRequestTarget, actionRun.TriggerEvent)
-
- // add another file whose name cannot match the specified path
- addFileToForkedResp, err = files_service.ChangeRepoFiles(git.DefaultContext, forkedRepo, org3, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: "foo.txt",
- ContentReader: strings.NewReader("foo"),
- },
- },
- Message: "add foo.txt",
- OldBranch: "main",
- NewBranch: "fork-branch-2",
- Author: &files_service.IdentityOptions{
- Name: org3.Name,
- Email: org3.Email,
- },
- Committer: &files_service.IdentityOptions{
- Name: org3.Name,
- Email: org3.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addFileToForkedResp)
-
- // create Pull
- pullIssue = &issues_model.Issue{
- RepoID: baseRepo.ID,
- Title: "A mismatched path cannot trigger pull-request-target-event",
- PosterID: org3.ID,
- Poster: org3,
- IsPull: true,
- }
- pullRequest = &issues_model.PullRequest{
- HeadRepoID: forkedRepo.ID,
- BaseRepoID: baseRepo.ID,
- HeadBranch: "fork-branch-2",
- BaseBranch: "main",
- HeadRepo: forkedRepo,
- BaseRepo: baseRepo,
- Type: issues_model.PullRequestGitea,
- }
- err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
- assert.NoError(t, err)
-
- // the new pull request cannot trigger actions, so there is still only 1 record
- assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: baseRepo.ID}))
- })
- }
|