@@ -5,6 +5,7 @@ package integration
55
66import (
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\n on:\n workflow_dispatch\n jobs:\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\n on:\n workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }\n jobs:\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\n on:\n workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }\n jobs:\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\n on:\n workflow_dispatch: { inputs: { myinput: { default: def }, myinput2: { default: def2 }, myinput3: { type: boolean, default: false } } }\n jobs:\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