| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607 |
- // Copyright 2023 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package integration
-
- import (
- "encoding/base64"
- "fmt"
- "net/http"
- "net/url"
- "strings"
- "testing"
- "time"
-
- actions_model "code.gitea.io/gitea/models/actions"
- auth_model "code.gitea.io/gitea/models/auth"
- "code.gitea.io/gitea/models/db"
- git_model "code.gitea.io/gitea/models/git"
- issues_model "code.gitea.io/gitea/models/issues"
- "code.gitea.io/gitea/models/perm"
- repo_model "code.gitea.io/gitea/models/repo"
- "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/commitstatus"
- "code.gitea.io/gitea/modules/git"
- "code.gitea.io/gitea/modules/gitrepo"
- "code.gitea.io/gitea/modules/json"
- "code.gitea.io/gitea/modules/setting"
- api "code.gitea.io/gitea/modules/structs"
- "code.gitea.io/gitea/modules/test"
- "code.gitea.io/gitea/modules/timeutil"
- "code.gitea.io/gitea/modules/util"
- issue_service "code.gitea.io/gitea/services/issue"
- pull_service "code.gitea.io/gitea/services/pull"
- release_service "code.gitea.io/gitea/services/release"
- repo_service "code.gitea.io/gitea/services/repository"
- commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus"
- 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
- user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // owner of the forked repo
-
- // create the base repo
- baseRepo, err := repo_service.CreateRepository(t.Context(), 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)
-
- // add user4 as the collaborator
- ctx := NewAPITestContext(t, baseRepo.OwnerName, baseRepo.Name, auth_model.AccessTokenScopeWriteRepository)
- t.Run("AddUser4AsCollaboratorWithReadAccess", doAPIAddCollaborator(ctx, "user4", perm.AccessModeRead))
-
- // create the forked repo
- forkedRepo, err := repo_service.ForkRepository(t.Context(), user2, user4, 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(t.Context(), baseRepo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/pr.yml",
- ContentReader: strings.NewReader(`name: test
- on:
- pull_request_target:
- paths:
- - 'file_*.txt'
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: 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(t.Context(), forkedRepo, user4, &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{
- GitUserName: user4.Name,
- GitUserEmail: user4.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user4.Name,
- GitUserEmail: user4.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: user4.ID,
- Poster: user4,
- 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,
- }
- prOpts := &pull_service.NewPullRequestOptions{Repo: baseRepo, Issue: pullIssue, PullRequest: pullRequest}
- err = pull_service.NewPullRequest(t.Context(), prOpts)
- 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(t.Context(), forkedRepo, user4, &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{
- GitUserName: user4.Name,
- GitUserEmail: user4.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user4.Name,
- GitUserEmail: user4.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: user4.ID,
- Poster: user4,
- 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,
- }
- prOpts = &pull_service.NewPullRequestOptions{Repo: baseRepo, Issue: pullIssue, PullRequest: pullRequest}
- err = pull_service.NewPullRequest(t.Context(), prOpts)
- 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}))
- })
- }
-
- func TestSkipCI(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- session := loginUser(t, "user2")
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "skip-ci",
- Description: "test skip ci functionality",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "master",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/pr.yml",
- ContentReader: strings.NewReader(`name: test
- on:
- push:
- branches: [master]
- pull_request:
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "master",
- NewBranch: "master",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // a run has been created
- assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID}))
-
- // add a file with a configured skip-ci string in commit message
- addFileResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: "bar.txt",
- ContentReader: strings.NewReader("bar"),
- },
- },
- Message: setting.Actions.SkipWorkflowStrings[0] + " add bar",
- OldBranch: "master",
- NewBranch: "master",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addFileResp)
-
- // the commit message contains a configured skip-ci string, so there is still only 1 record
- assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID}))
-
- // add file to new branch
- addFileToBranchResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: "test-skip-ci",
- ContentReader: strings.NewReader("test-skip-ci"),
- },
- },
- Message: "add test file",
- OldBranch: "master",
- NewBranch: "test-skip-ci",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addFileToBranchResp)
-
- resp := testPullCreate(t, session, "user2", "skip-ci", true, "master", "test-skip-ci", "[skip ci] test-skip-ci")
-
- // check the redirected URL
- url := test.RedirectURL(resp)
- assert.Regexp(t, "^/user2/skip-ci/pulls/[0-9]*$", url)
-
- // the pr title contains a configured skip-ci string, so there is still only 1 record
- assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID}))
- })
- }
-
- func TestCreateDeleteRefEvent(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "create-delete-ref-event",
- Description: "test create delete ref ci event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/createdelete.yml",
- ContentReader: strings.NewReader(`name: test
- on:
- [create,delete]
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
-
- // create a branch
- err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, gitRepo, branch.CommitID, "test-create-branch")
- assert.NoError(t, err)
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "create",
- Ref: "refs/heads/test-create-branch",
- WorkflowID: "createdelete.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
-
- // create a tag
- err = release_service.CreateNewTag(t.Context(), user2, repo, branch.CommitID, "test-create-tag", "test create tag event")
- assert.NoError(t, err)
- run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "create",
- Ref: "refs/tags/test-create-tag",
- WorkflowID: "createdelete.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
-
- // delete the branch
- err = repo_service.DeleteBranch(t.Context(), user2, repo, gitRepo, "test-create-branch", nil)
- assert.NoError(t, err)
- run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "delete",
- Ref: "refs/heads/main",
- WorkflowID: "createdelete.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
-
- // delete the tag
- tag, err := repo_model.GetRelease(t.Context(), repo.ID, "test-create-tag")
- assert.NoError(t, err)
- err = release_service.DeleteReleaseByID(t.Context(), repo, tag, user2, true)
- assert.NoError(t, err)
- run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "delete",
- Ref: "refs/heads/main",
- WorkflowID: "createdelete.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- })
- }
-
- func TestPullRequestCommitStatusEvent(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo
- user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // contributor of the repo
-
- // create a repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "repo-pull-request",
- Description: "test pull-request event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add user4 as the collaborator
- ctx := NewAPITestContext(t, repo.OwnerName, repo.Name, auth_model.AccessTokenScopeWriteRepository)
- t.Run("AddUser4AsCollaboratorWithReadAccess", doAPIAddCollaborator(ctx, "user4", perm.AccessModeRead))
-
- // add the workflow file to the repo
- addWorkflow, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/pr.yml",
- ContentReader: strings.NewReader(`name: test
- on:
- pull_request:
- types: [assigned, unassigned, labeled, unlabeled, opened, edited, closed, reopened, synchronize, milestoned, demilestoned, review_requested, review_request_removed]
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflow)
- sha := addWorkflow.Commit.SHA
-
- // create a new branch
- testBranch := "test-branch"
- gitRepo, err := git.OpenRepository(t.Context(), ".")
- assert.NoError(t, err)
- err = repo_service.CreateNewBranch(t.Context(), user2, repo, gitRepo, "main", testBranch)
- assert.NoError(t, err)
-
- // create Pull
- pullIssue := &issues_model.Issue{
- RepoID: repo.ID,
- Title: "A test PR",
- PosterID: user2.ID,
- Poster: user2,
- IsPull: true,
- }
- pullRequest := &issues_model.PullRequest{
- HeadRepoID: repo.ID,
- BaseRepoID: repo.ID,
- HeadBranch: testBranch,
- BaseBranch: "main",
- HeadRepo: repo,
- BaseRepo: repo,
- Type: issues_model.PullRequestGitea,
- }
- prOpts := &pull_service.NewPullRequestOptions{Repo: repo, Issue: pullIssue, PullRequest: pullRequest}
- err = pull_service.NewPullRequest(t.Context(), prOpts)
- assert.NoError(t, err)
-
- // opened
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // edited
- err = issue_service.ChangeContent(t.Context(), pullIssue, user2, "test", 0)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // closed
- err = issue_service.CloseIssue(t.Context(), pullIssue, user2, "")
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // reopened
- err = issue_service.ReopenIssue(t.Context(), pullIssue, user2, "")
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // assign
- removed, _, err := issue_service.ToggleAssigneeWithNotify(t.Context(), pullIssue, user2, user4.ID)
- assert.False(t, removed)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // unassign
- removed, _, err = issue_service.ToggleAssigneeWithNotify(t.Context(), pullIssue, user2, user4.ID)
- assert.True(t, removed)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // labeled
- label := &issues_model.Label{
- RepoID: repo.ID,
- Name: "test",
- Exclusive: false,
- Description: "test",
- Color: "#e11d21",
- }
- err = issues_model.NewLabel(t.Context(), label)
- assert.NoError(t, err)
- err = issue_service.AddLabel(t.Context(), pullIssue, user2, label)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // unlabeled
- err = issue_service.RemoveLabel(t.Context(), pullIssue, user2, label)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // synchronize
- addFileResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: "test.txt",
- ContentReader: strings.NewReader("test"),
- },
- },
- Message: "add file",
- OldBranch: testBranch,
- NewBranch: testBranch,
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addFileResp)
- sha = addFileResp.Commit.SHA
- assert.Eventually(t, func() bool {
- latestCommitStatuses, err := git_model.GetLatestCommitStatus(t.Context(), repo.ID, sha, db.ListOptionsAll)
- assert.NoError(t, err)
- if len(latestCommitStatuses) == 0 {
- return false
- }
- if latestCommitStatuses[0].State == commitstatus.CommitStatusPending {
- insertFakeStatus(t, repo, sha, latestCommitStatuses[0].TargetURL, latestCommitStatuses[0].Context)
- return true
- }
- return false
- }, 1*time.Second, 100*time.Millisecond)
-
- // milestoned
- milestone := &issues_model.Milestone{
- RepoID: repo.ID,
- Name: "test",
- Content: "test",
- DeadlineUnix: timeutil.TimeStampNow(),
- }
- err = issues_model.NewMilestone(t.Context(), milestone)
- assert.NoError(t, err)
- err = issue_service.ChangeMilestoneAssign(t.Context(), pullIssue, user2, milestone.ID)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // demilestoned
- err = issue_service.ChangeMilestoneAssign(t.Context(), pullIssue, user2, milestone.ID)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // review_requested
- _, err = issue_service.ReviewRequest(t.Context(), pullIssue, user2, nil, user4, true)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
-
- // review_request_removed
- _, err = issue_service.ReviewRequest(t.Context(), pullIssue, user2, nil, user4, false)
- assert.NoError(t, err)
- checkCommitStatusAndInsertFakeStatus(t, repo, sha)
- })
- }
-
- func checkCommitStatusAndInsertFakeStatus(t *testing.T, repo *repo_model.Repository, sha string) {
- latestCommitStatuses, err := git_model.GetLatestCommitStatus(t.Context(), repo.ID, sha, db.ListOptionsAll)
- assert.NoError(t, err)
- assert.Len(t, latestCommitStatuses, 1)
- assert.Equal(t, commitstatus.CommitStatusPending, latestCommitStatuses[0].State)
-
- insertFakeStatus(t, repo, sha, latestCommitStatuses[0].TargetURL, latestCommitStatuses[0].Context)
- }
-
- func insertFakeStatus(t *testing.T, repo *repo_model.Repository, sha, targetURL, context string) {
- err := commitstatus_service.CreateCommitStatus(t.Context(), repo, user_model.NewActionsUser(), sha, &git_model.CommitStatus{
- State: commitstatus.CommitStatusSuccess,
- TargetURL: targetURL,
- Context: context,
- })
- assert.NoError(t, err)
- }
-
- func TestWorkflowDispatchPublicApi(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- session := loginUser(t, user2.Name)
- token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "workflow-dispatch-event",
- Description: "test workflow-dispatch ci event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
- values := url.Values{}
- values.Set("ref", "main")
- req := NewRequestWithURLValues(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), values).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "workflow_dispatch",
- Ref: "refs/heads/main",
- WorkflowID: "dispatch.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- })
- }
-
- func TestWorkflowDispatchPublicApiWithInputs(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- session := loginUser(t, user2.Name)
- token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "workflow-dispatch-event",
- Description: "test workflow-dispatch ci event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
- values := url.Values{}
- values.Set("ref", "main")
- values.Set("inputs[myinput]", "val0")
- values.Set("inputs[myinput3]", "true")
- req := NewRequestWithURLValues(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), values).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "workflow_dispatch",
- Ref: "refs/heads/main",
- WorkflowID: "dispatch.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- dispatchPayload := &api.WorkflowDispatchPayload{}
- err = json.Unmarshal([]byte(run.EventPayload), dispatchPayload)
- assert.NoError(t, err)
- assert.Contains(t, dispatchPayload.Inputs, "myinput")
- assert.Contains(t, dispatchPayload.Inputs, "myinput2")
- assert.Contains(t, dispatchPayload.Inputs, "myinput3")
- assert.Equal(t, "val0", dispatchPayload.Inputs["myinput"])
- assert.Equal(t, "def2", dispatchPayload.Inputs["myinput2"])
- assert.Equal(t, "true", dispatchPayload.Inputs["myinput3"])
- })
- }
-
- func TestWorkflowDispatchPublicApiJSON(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- session := loginUser(t, user2.Name)
- token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "workflow-dispatch-event",
- Description: "test workflow-dispatch ci event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
- inputs := &api.CreateActionWorkflowDispatch{
- Ref: "main",
- Inputs: map[string]string{
- "myinput": "val0",
- "myinput3": "true",
- },
- }
-
- req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "workflow_dispatch",
- Ref: "refs/heads/main",
- WorkflowID: "dispatch.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- })
- }
-
- func TestWorkflowDispatchPublicApiWithInputsJSON(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- session := loginUser(t, user2.Name)
- token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "workflow-dispatch-event",
- Description: "test workflow-dispatch ci event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
- inputs := &api.CreateActionWorkflowDispatch{
- Ref: "main",
- Inputs: map[string]string{
- "myinput": "val0",
- "myinput3": "true",
- },
- }
- req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "workflow_dispatch",
- Ref: "refs/heads/main",
- WorkflowID: "dispatch.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- dispatchPayload := &api.WorkflowDispatchPayload{}
- err = json.Unmarshal([]byte(run.EventPayload), dispatchPayload)
- assert.NoError(t, err)
- assert.Contains(t, dispatchPayload.Inputs, "myinput")
- assert.Contains(t, dispatchPayload.Inputs, "myinput2")
- assert.Contains(t, dispatchPayload.Inputs, "myinput3")
- assert.Equal(t, "val0", dispatchPayload.Inputs["myinput"])
- assert.Equal(t, "def2", dispatchPayload.Inputs["myinput2"])
- assert.Equal(t, "true", dispatchPayload.Inputs["myinput3"])
- })
- }
-
- func TestWorkflowDispatchPublicApiWithInputsNonDefaultBranchJSON(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- session := loginUser(t, user2.Name)
- token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "workflow-dispatch-event",
- Description: "test workflow-dispatch ci event",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err = files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "update",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "dispatch",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the dispatch branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- commit, err := gitRepo.GetBranchCommit("dispatch")
- assert.NoError(t, err)
- inputs := &api.CreateActionWorkflowDispatch{
- Ref: "refs/heads/dispatch",
- Inputs: map[string]string{
- "myinput": "val0",
- "myinput3": "true",
- },
- }
- req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Repo: repo,
- Event: "workflow_dispatch",
- Ref: "refs/heads/dispatch",
- WorkflowID: "dispatch.yml",
- CommitSHA: commit.ID.String(),
- })
- assert.NotNil(t, run)
- dispatchPayload := &api.WorkflowDispatchPayload{}
- err = json.Unmarshal([]byte(run.EventPayload), dispatchPayload)
- assert.NoError(t, err)
- assert.Contains(t, dispatchPayload.Inputs, "myinput")
- assert.Contains(t, dispatchPayload.Inputs, "myinput2")
- assert.Contains(t, dispatchPayload.Inputs, "myinput3")
- assert.Equal(t, "val0", dispatchPayload.Inputs["myinput"])
- assert.Equal(t, "def2", dispatchPayload.Inputs["myinput2"])
- assert.Equal(t, "true", dispatchPayload.Inputs["myinput3"])
- })
- }
-
- func TestWorkflowApi(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- session := loginUser(t, user2.Name)
- token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "workflow-api",
- Description: "test workflow apis",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/actions/workflows", repo.FullName())).
- AddTokenAuth(token)
- resp := MakeRequest(t, req, http.StatusOK)
- workflows := &api.ActionWorkflowResponse{}
- json.NewDecoder(resp.Body).Decode(workflows)
- assert.Empty(t, workflows.Workflows)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/dispatch.yml",
- ContentReader: strings.NewReader(`
- on:
- workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/actions/workflows", repo.FullName())).
- AddTokenAuth(token)
- resp = MakeRequest(t, req, http.StatusOK)
- json.NewDecoder(resp.Body).Decode(workflows)
- assert.Len(t, workflows.Workflows, 1)
- assert.Equal(t, "dispatch.yml", workflows.Workflows[0].Name)
- assert.Equal(t, ".gitea/workflows/dispatch.yml", workflows.Workflows[0].Path)
- assert.Equal(t, ".gitea/workflows/dispatch.yml", workflows.Workflows[0].Path)
- assert.Equal(t, "active", workflows.Workflows[0].State)
-
- // Use a hardcoded api path
- req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/%s", repo.FullName(), workflows.Workflows[0].ID)).
- AddTokenAuth(token)
- resp = MakeRequest(t, req, http.StatusOK)
- workflow := &api.ActionWorkflow{}
- json.NewDecoder(resp.Body).Decode(workflow)
- assert.Equal(t, workflows.Workflows[0].ID, workflow.ID)
- assert.Equal(t, workflows.Workflows[0].Path, workflow.Path)
- assert.Equal(t, workflows.Workflows[0].URL, workflow.URL)
- assert.Equal(t, workflows.Workflows[0].HTMLURL, workflow.HTMLURL)
- assert.Equal(t, workflows.Workflows[0].Name, workflow.Name)
- assert.Equal(t, workflows.Workflows[0].State, workflow.State)
-
- // Use the provided url instead of the hardcoded one
- req = NewRequest(t, "GET", workflows.Workflows[0].URL).
- AddTokenAuth(token)
- resp = MakeRequest(t, req, http.StatusOK)
- workflow = &api.ActionWorkflow{}
- json.NewDecoder(resp.Body).Decode(workflow)
- assert.Equal(t, workflows.Workflows[0].ID, workflow.ID)
- assert.Equal(t, workflows.Workflows[0].Path, workflow.Path)
- assert.Equal(t, workflows.Workflows[0].URL, workflow.URL)
- assert.Equal(t, workflows.Workflows[0].HTMLURL, workflow.HTMLURL)
- assert.Equal(t, workflows.Workflows[0].Name, workflow.Name)
- assert.Equal(t, workflows.Workflows[0].State, workflow.State)
-
- // Disable the workflow
- req = NewRequest(t, "PUT", workflows.Workflows[0].URL+"/disable").
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- // Use the provided url instead of the hardcoded one
- req = NewRequest(t, "GET", workflows.Workflows[0].URL).
- AddTokenAuth(token)
- resp = MakeRequest(t, req, http.StatusOK)
- workflow = &api.ActionWorkflow{}
- json.NewDecoder(resp.Body).Decode(workflow)
- assert.Equal(t, workflows.Workflows[0].ID, workflow.ID)
- assert.Equal(t, workflows.Workflows[0].Path, workflow.Path)
- assert.Equal(t, workflows.Workflows[0].URL, workflow.URL)
- assert.Equal(t, workflows.Workflows[0].HTMLURL, workflow.HTMLURL)
- assert.Equal(t, workflows.Workflows[0].Name, workflow.Name)
- assert.Equal(t, "disabled_manually", workflow.State)
-
- inputs := &api.CreateActionWorkflowDispatch{
- Ref: "main",
- Inputs: map[string]string{
- "myinput": "val0",
- "myinput3": "true",
- },
- }
- // Since the workflow is disabled, so the response code is 403 forbidden
- req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusForbidden)
-
- // Enable the workflow again
- req = NewRequest(t, "PUT", workflows.Workflows[0].URL+"/enable").
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- // Use the provided url instead of the hardcoded one
- req = NewRequest(t, "GET", workflows.Workflows[0].URL).
- AddTokenAuth(token)
- resp = MakeRequest(t, req, http.StatusOK)
- workflow = &api.ActionWorkflow{}
- json.NewDecoder(resp.Body).Decode(workflow)
- assert.Equal(t, workflows.Workflows[0].ID, workflow.ID)
- assert.Equal(t, workflows.Workflows[0].Path, workflow.Path)
- assert.Equal(t, workflows.Workflows[0].URL, workflow.URL)
- assert.Equal(t, workflows.Workflows[0].HTMLURL, workflow.HTMLURL)
- assert.Equal(t, workflows.Workflows[0].Name, workflow.Name)
- assert.Equal(t, workflows.Workflows[0].State, workflow.State)
-
- req = NewRequest(t, "GET", workflows.Workflows[0].URL).
- AddTokenAuth(token)
- resp = MakeRequest(t, req, http.StatusOK)
- workflow = &api.ActionWorkflow{}
- json.NewDecoder(resp.Body).Decode(workflow)
- assert.Equal(t, workflows.Workflows[0].ID, workflow.ID)
- assert.Equal(t, workflows.Workflows[0].Path, workflow.Path)
- assert.Equal(t, workflows.Workflows[0].URL, workflow.URL)
- assert.Equal(t, workflows.Workflows[0].HTMLURL, workflow.HTMLURL)
- assert.Equal(t, workflows.Workflows[0].Name, workflow.Name)
- assert.Equal(t, workflows.Workflows[0].State, workflow.State)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
- inputs = &api.CreateActionWorkflowDispatch{
- Ref: "main",
- Inputs: map[string]string{
- "myinput": "val0",
- "myinput3": "true",
- },
- }
- req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
- AddTokenAuth(token)
- _ = MakeRequest(t, req, http.StatusNoContent)
-
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "add workflow",
- RepoID: repo.ID,
- Event: "workflow_dispatch",
- Ref: "refs/heads/main",
- WorkflowID: "dispatch.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- dispatchPayload := &api.WorkflowDispatchPayload{}
- err = json.Unmarshal([]byte(run.EventPayload), dispatchPayload)
- assert.NoError(t, err)
- assert.Contains(t, dispatchPayload.Inputs, "myinput")
- assert.Contains(t, dispatchPayload.Inputs, "myinput2")
- assert.Contains(t, dispatchPayload.Inputs, "myinput3")
- assert.Equal(t, "val0", dispatchPayload.Inputs["myinput"])
- assert.Equal(t, "def2", dispatchPayload.Inputs["myinput2"])
- assert.Equal(t, "true", dispatchPayload.Inputs["myinput3"])
- })
- }
-
- func TestClosePullRequestWithPath(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- // user2 is the owner of the base repo
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- user2Token := getTokenForLoggedInUser(t, loginUser(t, user2.Name), auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
- // user4 is the owner of the fork repo
- user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
- user4Token := getTokenForLoggedInUser(t, loginUser(t, user4.Name), auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
-
- // create the base repo
- apiBaseRepo := createActionsTestRepo(t, user2Token, "close-pull-request-with-path", false)
- baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: apiBaseRepo.ID})
- user2APICtx := NewAPITestContext(t, baseRepo.OwnerName, baseRepo.Name, auth_model.AccessTokenScopeWriteRepository)
-
- // init the workflow
- wfTreePath := ".gitea/workflows/pull.yml"
- wfFileContent := `name: Pull Request
- on:
- pull_request:
- types:
- - closed
- paths:
- - 'app/**'
- jobs:
- echo:
- runs-on: ubuntu-latest
- steps:
- - run: echo 'Hello World'
- `
- opts1 := getWorkflowCreateFileOptions(user2, baseRepo.DefaultBranch, "create "+wfTreePath, wfFileContent)
- createWorkflowFile(t, user2Token, baseRepo.OwnerName, baseRepo.Name, wfTreePath, opts1)
-
- // user4 forks the repo
- req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/forks", baseRepo.OwnerName, baseRepo.Name),
- &api.CreateForkOption{
- Name: util.ToPointer("close-pull-request-with-path-fork"),
- }).AddTokenAuth(user4Token)
- resp := MakeRequest(t, req, http.StatusAccepted)
- var apiForkRepo api.Repository
- DecodeJSON(t, resp, &apiForkRepo)
- forkRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: apiForkRepo.ID})
- user4APICtx := NewAPITestContext(t, user4.Name, forkRepo.Name, auth_model.AccessTokenScopeWriteRepository)
-
- // user4 creates a pull request to add file "app/main.go"
- doAPICreateFile(user4APICtx, "app/main.go", &api.CreateFileOptions{
- FileOptions: api.FileOptions{
- NewBranchName: "user4/add-main",
- Message: "create main.go",
- Author: api.Identity{
- Name: user4.Name,
- Email: user4.Email,
- },
- Committer: api.Identity{
- Name: user4.Name,
- Email: user4.Email,
- },
- Dates: api.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- },
- ContentBase64: base64.StdEncoding.EncodeToString([]byte("// main.go")),
- })(t)
- apiPull, err := doAPICreatePullRequest(user4APICtx, baseRepo.OwnerName, baseRepo.Name, baseRepo.DefaultBranch, user4.Name+":user4/add-main")(t)
- assert.NoError(t, err)
-
- doAPIMergePullRequest(user2APICtx, baseRepo.OwnerName, baseRepo.Name, apiPull.Index)(t)
-
- pullRequest := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: apiPull.ID})
-
- // 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, actions_module.GithubEventPullRequest, actionRun.TriggerEvent)
- assert.Equal(t, pullRequest.MergedCommitID, actionRun.CommitSHA)
- })
- }
-
- func TestActionRunNameWithContextVariables(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "action-run-name-with-variables",
- Description: "test action run name",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/runname.yml",
- ContentReader: strings.NewReader(`name: test
- on:
- [create,delete]
- run-name: ${{ gitea.actor }} is running this workflow
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow with run-name",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
-
- // create a branch
- err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, gitRepo, branch.CommitID, "test-action-run-name-with-variables")
- assert.NoError(t, err)
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: user2.LoginName + " is running this workflow",
- RepoID: repo.ID,
- Event: "create",
- Ref: "refs/heads/test-action-run-name-with-variables",
- WorkflowID: "runname.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- })
- }
-
- func TestActionRunName(t *testing.T) {
- onGiteaRun(t, func(t *testing.T, u *url.URL) {
- user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
-
- // create the repo
- repo, err := repo_service.CreateRepository(t.Context(), user2, user2, repo_service.CreateRepoOptions{
- Name: "action-run-name",
- Description: "test action run-name",
- AutoInit: true,
- Gitignores: "Go",
- License: "MIT",
- Readme: "Default",
- DefaultBranch: "main",
- IsPrivate: false,
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, repo)
-
- // add workflow file to the repo
- addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{
- Files: []*files_service.ChangeRepoFile{
- {
- Operation: "create",
- TreePath: ".gitea/workflows/runname.yml",
- ContentReader: strings.NewReader(`name: test
- on:
- [create,delete]
- run-name: run name without variables
- jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - run: echo helloworld
- `),
- },
- },
- Message: "add workflow with run name",
- OldBranch: "main",
- NewBranch: "main",
- Author: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Committer: &files_service.IdentityOptions{
- GitUserName: user2.Name,
- GitUserEmail: user2.Email,
- },
- Dates: &files_service.CommitDateOptions{
- Author: time.Now(),
- Committer: time.Now(),
- },
- })
- assert.NoError(t, err)
- assert.NotEmpty(t, addWorkflowToBaseResp)
-
- // Get the commit ID of the default branch
- gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
- assert.NoError(t, err)
- defer gitRepo.Close()
- branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch)
- assert.NoError(t, err)
-
- // create a branch
- err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, gitRepo, branch.CommitID, "test-action-run-name")
- assert.NoError(t, err)
- run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
- Title: "run name without variables",
- RepoID: repo.ID,
- Event: "create",
- Ref: "refs/heads/test-action-run-name",
- WorkflowID: "runname.yml",
- CommitSHA: branch.CommitID,
- })
- assert.NotNil(t, run)
- })
- }
|