Skip to content

Commit cb9d0ba

Browse files
committed
add tests fix form inputs bug
1 parent abbc3bc commit cb9d0ba

File tree

3 files changed

+336
-6
lines changed

3 files changed

+336
-6
lines changed

routers/api/v1/repo/action.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -636,12 +636,20 @@ func DispatchWorkflow(ctx *context.APIContext) {
636636
Repo: ctx.Repo,
637637
}, workflowID, ref, func(workflowDispatch *model.WorkflowDispatch, inputs *map[string]any) error {
638638
if workflowDispatch != nil {
639-
for name, config := range workflowDispatch.Inputs {
640-
value, ok := opt.Inputs[name]
641-
if ok {
639+
// TODO figure out why the inputs map is empty for url form encoding workaround
640+
if opt.Inputs == nil {
641+
for name, config := range workflowDispatch.Inputs {
642+
value := ctx.FormString("inputs["+name+"]", config.Default)
642643
(*inputs)[name] = value
643-
} else {
644-
(*inputs)[name] = config.Default
644+
}
645+
} else {
646+
for name, config := range workflowDispatch.Inputs {
647+
value, ok := opt.Inputs[name]
648+
if ok {
649+
(*inputs)[name] = value
650+
} else {
651+
(*inputs)[name] = config.Default
652+
}
645653
}
646654
}
647655
}

services/actions/dispatch.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func DispatchWorkflow(ctx *context.Context, workflowID, ref string, processInput
6868
} else if refName.IsBranch() {
6969
runTargetCommit, err = ctx.Repo.GitRepo.GetBranchCommit(refName.BranchName())
7070
} else {
71+
refName = git.RefNameFromBranch(ref)
7172
runTargetCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ref)
7273
}
7374
if err != nil {
@@ -139,7 +140,7 @@ func DispatchWorkflow(ctx *context.Context, workflowID, ref string, processInput
139140
OwnerID: ctx.Repo.Repository.OwnerID,
140141
WorkflowID: workflowID,
141142
TriggerUserID: ctx.Doer.ID,
142-
Ref: ref,
143+
Ref: string(refName),
143144
CommitSHA: runTargetCommit.ID.String(),
144145
IsForkPullRequest: false,
145146
Event: "workflow_dispatch",

tests/integration/actions_trigger_test.go

Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package integration
55

66
import (
77
"fmt"
8+
"net/http"
89
"net/url"
910
"strings"
1011
"testing"
@@ -22,6 +23,7 @@ import (
2223
actions_module "code.gitea.io/gitea/modules/actions"
2324
"code.gitea.io/gitea/modules/git"
2425
"code.gitea.io/gitea/modules/gitrepo"
26+
"code.gitea.io/gitea/modules/json"
2527
"code.gitea.io/gitea/modules/setting"
2628
api "code.gitea.io/gitea/modules/structs"
2729
"code.gitea.io/gitea/modules/test"
@@ -651,3 +653,322 @@ func insertFakeStatus(t *testing.T, repo *repo_model.Repository, sha, targetURL,
651653
})
652654
assert.NoError(t, err)
653655
}
656+
657+
func TestWorkflowDispatchPublicApi(t *testing.T) {
658+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
659+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
660+
session := loginUser(t, user2.Name)
661+
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
662+
663+
// create the repo
664+
repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
665+
Name: "workflow-dispatch-event",
666+
Description: "test workflow-dispatch ci event",
667+
AutoInit: true,
668+
Gitignores: "Go",
669+
License: "MIT",
670+
Readme: "Default",
671+
DefaultBranch: "main",
672+
IsPrivate: false,
673+
})
674+
assert.NoError(t, err)
675+
assert.NotEmpty(t, repo)
676+
677+
// add workflow file to the repo
678+
addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{
679+
Files: []*files_service.ChangeRepoFile{
680+
{
681+
Operation: "create",
682+
TreePath: ".gitea/workflows/dispatch.yml",
683+
ContentReader: strings.NewReader("name: test\non:\n workflow_dispatch\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
684+
},
685+
},
686+
Message: "add workflow",
687+
OldBranch: "main",
688+
NewBranch: "main",
689+
Author: &files_service.IdentityOptions{
690+
GitUserName: user2.Name,
691+
GitUserEmail: user2.Email,
692+
},
693+
Committer: &files_service.IdentityOptions{
694+
GitUserName: user2.Name,
695+
GitUserEmail: user2.Email,
696+
},
697+
Dates: &files_service.CommitDateOptions{
698+
Author: time.Now(),
699+
Committer: time.Now(),
700+
},
701+
})
702+
assert.NoError(t, err)
703+
assert.NotEmpty(t, addWorkflowToBaseResp)
704+
705+
// Get the commit ID of the default branch
706+
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
707+
assert.NoError(t, err)
708+
defer gitRepo.Close()
709+
branch, err := git_model.GetBranch(db.DefaultContext, repo.ID, repo.DefaultBranch)
710+
assert.NoError(t, err)
711+
values := url.Values{}
712+
values.Set("ref", "main")
713+
req := NewRequestWithURLValues(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), values).
714+
AddTokenAuth(token)
715+
_ = MakeRequest(t, req, http.StatusNoContent)
716+
717+
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
718+
Title: "add workflow",
719+
RepoID: repo.ID,
720+
Event: "workflow_dispatch",
721+
Ref: "refs/heads/main",
722+
WorkflowID: "dispatch.yml",
723+
CommitSHA: branch.CommitID,
724+
})
725+
assert.NotNil(t, run)
726+
})
727+
}
728+
729+
func TestWorkflowDispatchPublicApiWithInputs(t *testing.T) {
730+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
731+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
732+
session := loginUser(t, user2.Name)
733+
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
734+
735+
// create the repo
736+
repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
737+
Name: "workflow-dispatch-event",
738+
Description: "test workflow-dispatch ci event",
739+
AutoInit: true,
740+
Gitignores: "Go",
741+
License: "MIT",
742+
Readme: "Default",
743+
DefaultBranch: "main",
744+
IsPrivate: false,
745+
})
746+
assert.NoError(t, err)
747+
assert.NotEmpty(t, repo)
748+
749+
// add workflow file to the repo
750+
addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{
751+
Files: []*files_service.ChangeRepoFile{
752+
{
753+
Operation: "create",
754+
TreePath: ".gitea/workflows/dispatch.yml",
755+
ContentReader: strings.NewReader("name: test\non:\n workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
756+
},
757+
},
758+
Message: "add workflow",
759+
OldBranch: "main",
760+
NewBranch: "main",
761+
Author: &files_service.IdentityOptions{
762+
GitUserName: user2.Name,
763+
GitUserEmail: user2.Email,
764+
},
765+
Committer: &files_service.IdentityOptions{
766+
GitUserName: user2.Name,
767+
GitUserEmail: user2.Email,
768+
},
769+
Dates: &files_service.CommitDateOptions{
770+
Author: time.Now(),
771+
Committer: time.Now(),
772+
},
773+
})
774+
assert.NoError(t, err)
775+
assert.NotEmpty(t, addWorkflowToBaseResp)
776+
777+
// Get the commit ID of the default branch
778+
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
779+
assert.NoError(t, err)
780+
defer gitRepo.Close()
781+
branch, err := git_model.GetBranch(db.DefaultContext, repo.ID, repo.DefaultBranch)
782+
assert.NoError(t, err)
783+
values := url.Values{}
784+
values.Set("ref", "main")
785+
values.Set("inputs[myinput]", "val0")
786+
values.Set("inputs[myinput3]", "true")
787+
req := NewRequestWithURLValues(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), values).
788+
AddTokenAuth(token)
789+
_ = MakeRequest(t, req, http.StatusNoContent)
790+
791+
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
792+
Title: "add workflow",
793+
RepoID: repo.ID,
794+
Event: "workflow_dispatch",
795+
Ref: "refs/heads/main",
796+
WorkflowID: "dispatch.yml",
797+
CommitSHA: branch.CommitID,
798+
})
799+
assert.NotNil(t, run)
800+
dispatchPayload := &api.WorkflowDispatchPayload{}
801+
err = json.Unmarshal([]byte(run.EventPayload), dispatchPayload)
802+
assert.NoError(t, err)
803+
assert.Contains(t, dispatchPayload.Inputs, "myinput")
804+
assert.Contains(t, dispatchPayload.Inputs, "myinput2")
805+
assert.Contains(t, dispatchPayload.Inputs, "myinput3")
806+
assert.Equal(t, "val0", dispatchPayload.Inputs["myinput"])
807+
assert.Equal(t, "def2", dispatchPayload.Inputs["myinput2"])
808+
assert.Equal(t, "true", dispatchPayload.Inputs["myinput3"])
809+
})
810+
}
811+
812+
func TestWorkflowDispatchPublicApiJSON(t *testing.T) {
813+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
814+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
815+
session := loginUser(t, user2.Name)
816+
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
817+
818+
// create the repo
819+
repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
820+
Name: "workflow-dispatch-event",
821+
Description: "test workflow-dispatch ci event",
822+
AutoInit: true,
823+
Gitignores: "Go",
824+
License: "MIT",
825+
Readme: "Default",
826+
DefaultBranch: "main",
827+
IsPrivate: false,
828+
})
829+
assert.NoError(t, err)
830+
assert.NotEmpty(t, repo)
831+
832+
// add workflow file to the repo
833+
addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{
834+
Files: []*files_service.ChangeRepoFile{
835+
{
836+
Operation: "create",
837+
TreePath: ".gitea/workflows/dispatch.yml",
838+
ContentReader: strings.NewReader("name: test\non:\n workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
839+
},
840+
},
841+
Message: "add workflow",
842+
OldBranch: "main",
843+
NewBranch: "main",
844+
Author: &files_service.IdentityOptions{
845+
GitUserName: user2.Name,
846+
GitUserEmail: user2.Email,
847+
},
848+
Committer: &files_service.IdentityOptions{
849+
GitUserName: user2.Name,
850+
GitUserEmail: user2.Email,
851+
},
852+
Dates: &files_service.CommitDateOptions{
853+
Author: time.Now(),
854+
Committer: time.Now(),
855+
},
856+
})
857+
assert.NoError(t, err)
858+
assert.NotEmpty(t, addWorkflowToBaseResp)
859+
860+
// Get the commit ID of the default branch
861+
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
862+
assert.NoError(t, err)
863+
defer gitRepo.Close()
864+
branch, err := git_model.GetBranch(db.DefaultContext, repo.ID, repo.DefaultBranch)
865+
assert.NoError(t, err)
866+
inputs := &api.ActionWorkflowDispatchOption{
867+
Ref: "main",
868+
Inputs: map[string]string{
869+
"myinput": "val0",
870+
"myinput3": "true",
871+
},
872+
}
873+
874+
req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
875+
AddTokenAuth(token)
876+
_ = MakeRequest(t, req, http.StatusNoContent)
877+
878+
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
879+
Title: "add workflow",
880+
RepoID: repo.ID,
881+
Event: "workflow_dispatch",
882+
Ref: "refs/heads/main",
883+
WorkflowID: "dispatch.yml",
884+
CommitSHA: branch.CommitID,
885+
})
886+
assert.NotNil(t, run)
887+
})
888+
}
889+
890+
func TestWorkflowDispatchPublicApiWithInputsJSON(t *testing.T) {
891+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
892+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
893+
session := loginUser(t, user2.Name)
894+
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
895+
896+
// create the repo
897+
repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
898+
Name: "workflow-dispatch-event",
899+
Description: "test workflow-dispatch ci event",
900+
AutoInit: true,
901+
Gitignores: "Go",
902+
License: "MIT",
903+
Readme: "Default",
904+
DefaultBranch: "main",
905+
IsPrivate: false,
906+
})
907+
assert.NoError(t, err)
908+
assert.NotEmpty(t, repo)
909+
910+
// add workflow file to the repo
911+
addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{
912+
Files: []*files_service.ChangeRepoFile{
913+
{
914+
Operation: "create",
915+
TreePath: ".gitea/workflows/dispatch.yml",
916+
ContentReader: strings.NewReader("name: test\non:\n workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
917+
},
918+
},
919+
Message: "add workflow",
920+
OldBranch: "main",
921+
NewBranch: "main",
922+
Author: &files_service.IdentityOptions{
923+
GitUserName: user2.Name,
924+
GitUserEmail: user2.Email,
925+
},
926+
Committer: &files_service.IdentityOptions{
927+
GitUserName: user2.Name,
928+
GitUserEmail: user2.Email,
929+
},
930+
Dates: &files_service.CommitDateOptions{
931+
Author: time.Now(),
932+
Committer: time.Now(),
933+
},
934+
})
935+
assert.NoError(t, err)
936+
assert.NotEmpty(t, addWorkflowToBaseResp)
937+
938+
// Get the commit ID of the default branch
939+
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
940+
assert.NoError(t, err)
941+
defer gitRepo.Close()
942+
branch, err := git_model.GetBranch(db.DefaultContext, repo.ID, repo.DefaultBranch)
943+
assert.NoError(t, err)
944+
inputs := &api.ActionWorkflowDispatchOption{
945+
Ref: "main",
946+
Inputs: map[string]string{
947+
"myinput": "val0",
948+
"myinput3": "true",
949+
},
950+
}
951+
req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/actions/workflows/dispatch.yml/dispatches", repo.FullName()), inputs).
952+
AddTokenAuth(token)
953+
_ = MakeRequest(t, req, http.StatusNoContent)
954+
955+
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
956+
Title: "add workflow",
957+
RepoID: repo.ID,
958+
Event: "workflow_dispatch",
959+
Ref: "refs/heads/main",
960+
WorkflowID: "dispatch.yml",
961+
CommitSHA: branch.CommitID,
962+
})
963+
assert.NotNil(t, run)
964+
dispatchPayload := &api.WorkflowDispatchPayload{}
965+
err = json.Unmarshal([]byte(run.EventPayload), dispatchPayload)
966+
assert.NoError(t, err)
967+
assert.Contains(t, dispatchPayload.Inputs, "myinput")
968+
assert.Contains(t, dispatchPayload.Inputs, "myinput2")
969+
assert.Contains(t, dispatchPayload.Inputs, "myinput3")
970+
assert.Equal(t, "val0", dispatchPayload.Inputs["myinput"])
971+
assert.Equal(t, "def2", dispatchPayload.Inputs["myinput2"])
972+
assert.Equal(t, "true", dispatchPayload.Inputs["myinput3"])
973+
})
974+
}

0 commit comments

Comments
 (0)