@@ -749,3 +749,204 @@ jobs:
749749 assert .Len (t , payloads [6 ].WorkflowJob .Steps , 2 )
750750 })
751751}
752+
753+ type workflowRunWebhook struct {
754+ URL string
755+ payloads []api.WorkflowRunPayload
756+ triggeredEvent string
757+ }
758+
759+ func Test_WebhookWorkflowRun (t * testing.T ) {
760+ webhookData := & workflowRunWebhook {}
761+ provider := newMockWebhookProvider (func (r * http.Request ) {
762+ assert .Contains (t , r .Header ["X-Github-Event-Type" ], "workflow_run" , "X-GitHub-Event-Type should contain workflow_run" )
763+ assert .Contains (t , r .Header ["X-Gitea-Event-Type" ], "workflow_run" , "X-Gitea-Event-Type should contain workflow_run" )
764+ assert .Contains (t , r .Header ["X-Gogs-Event-Type" ], "workflow_run" , "X-Gogs-Event-Type should contain workflow_run" )
765+ content , _ := io .ReadAll (r .Body )
766+ var payload api.WorkflowRunPayload
767+ err := json .Unmarshal (content , & payload )
768+ assert .NoError (t , err )
769+ webhookData .payloads = append (webhookData .payloads , payload )
770+ webhookData .triggeredEvent = "workflow_run"
771+ }, http .StatusOK )
772+ defer provider .Close ()
773+ webhookData .URL = provider .URL ()
774+
775+ tests := []struct {
776+ name string
777+ callback func (t * testing.T , webhookData * workflowRunWebhook )
778+ }{
779+ {
780+ name : "WorkflowRun" ,
781+ callback : testWebhookWorkflowRun ,
782+ },
783+ {
784+ name : "WorkflowRunDepthLimit" ,
785+ callback : testWebhookWorkflowRunDepthLimit ,
786+ },
787+ }
788+ for _ , test := range tests {
789+ t .Run (test .name , func (t * testing.T ) {
790+ webhookData .payloads = nil
791+ webhookData .triggeredEvent = ""
792+ onGiteaRun (t , func (t * testing.T , giteaURL * url.URL ) {
793+ test .callback (t , webhookData )
794+ })
795+ })
796+ }
797+ }
798+
799+ func testWebhookWorkflowRun (t * testing.T , webhookData * workflowRunWebhook ) {
800+ // 1. create a new webhook with special webhook for repo1
801+ user2 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 2 })
802+ session := loginUser (t , "user2" )
803+ token := getTokenForLoggedInUser (t , session , auth_model .AccessTokenScopeWriteRepository , auth_model .AccessTokenScopeWriteUser )
804+
805+ testAPICreateWebhookForRepo (t , session , "user2" , "repo1" , webhookData .URL , "workflow_run" )
806+
807+ repo1 := unittest .AssertExistsAndLoadBean (t , & repo.Repository {ID : 1 })
808+
809+ gitRepo1 , err := gitrepo .OpenRepository (t .Context (), repo1 )
810+ assert .NoError (t , err )
811+
812+ runner := newMockRunner ()
813+ runner .registerAsRepoRunner (t , "user2" , "repo1" , "mock-runner" , []string {"ubuntu-latest" }, false )
814+
815+ // 2.1 add workflow_run workflow file to the repo
816+
817+ opts := getWorkflowCreateFileOptions (user2 , repo1 .DefaultBranch , "create " + "dispatch.yml" , `
818+ on:
819+ workflow_run:
820+ workflows: ["Push"]
821+ types:
822+ - completed
823+ jobs:
824+ dispatch:
825+ runs-on: ubuntu-latest
826+ steps:
827+ - run: echo 'test the webhook'
828+ ` )
829+ createWorkflowFile (t , token , "user2" , "repo1" , ".gitea/workflows/dispatch.yml" , opts )
830+
831+ // 2.2 trigger the webhooks
832+
833+ // add workflow file to the repo
834+ // init the workflow
835+ wfTreePath := ".gitea/workflows/push.yml"
836+ wfFileContent := `name: Push
837+ on: push
838+ jobs:
839+ wf1-job:
840+ runs-on: ubuntu-latest
841+ steps:
842+ - run: echo 'test the webhook'
843+ wf2-job:
844+ runs-on: ubuntu-latest
845+ needs: wf1-job
846+ steps:
847+ - run: echo 'cmd 1'
848+ - run: echo 'cmd 2'
849+ `
850+ opts = getWorkflowCreateFileOptions (user2 , repo1 .DefaultBranch , "create " + wfTreePath , wfFileContent )
851+ createWorkflowFile (t , token , "user2" , "repo1" , wfTreePath , opts )
852+
853+ commitID , err := gitRepo1 .GetBranchCommitID (repo1 .DefaultBranch )
854+ assert .NoError (t , err )
855+
856+ // 3. validate the webhook is triggered
857+ assert .Equal (t , "workflow_run" , webhookData .triggeredEvent )
858+ assert .Len (t , webhookData .payloads , 1 )
859+ assert .Equal (t , "requested" , webhookData .payloads [0 ].Action )
860+ assert .Equal (t , "queued" , webhookData .payloads [0 ].WorkflowRun .Status )
861+ assert .Equal (t , repo1 .DefaultBranch , webhookData .payloads [0 ].WorkflowRun .HeadBranch )
862+ assert .Equal (t , commitID , webhookData .payloads [0 ].WorkflowRun .HeadSha )
863+ assert .Equal (t , "repo1" , webhookData .payloads [0 ].Repo .Name )
864+ assert .Equal (t , "user2/repo1" , webhookData .payloads [0 ].Repo .FullName )
865+
866+ // 4. Execute two Jobs
867+ task := runner .fetchTask (t )
868+ outcome := & mockTaskOutcome {
869+ result : runnerv1 .Result_RESULT_SUCCESS ,
870+ execTime : time .Millisecond ,
871+ }
872+ runner .execTask (t , task , outcome )
873+
874+ task = runner .fetchTask (t )
875+ outcome = & mockTaskOutcome {
876+ result : runnerv1 .Result_RESULT_FAILURE ,
877+ execTime : time .Millisecond ,
878+ }
879+ runner .execTask (t , task , outcome )
880+
881+ // 7. validate the webhook is triggered
882+ assert .Equal (t , "workflow_run" , webhookData .triggeredEvent )
883+ assert .Len (t , webhookData .payloads , 3 )
884+ assert .Equal (t , "completed" , webhookData .payloads [1 ].Action )
885+ assert .Equal (t , "push" , webhookData .payloads [1 ].WorkflowRun .Event )
886+
887+ // 3. validate the webhook is triggered
888+ assert .Equal (t , "workflow_run" , webhookData .triggeredEvent )
889+ assert .Len (t , webhookData .payloads , 3 )
890+ assert .Equal (t , "requested" , webhookData .payloads [2 ].Action )
891+ assert .Equal (t , "queued" , webhookData .payloads [2 ].WorkflowRun .Status )
892+ assert .Equal (t , "workflow_run" , webhookData .payloads [2 ].WorkflowRun .Event )
893+ assert .Equal (t , repo1 .DefaultBranch , webhookData .payloads [2 ].WorkflowRun .HeadBranch )
894+ assert .Equal (t , commitID , webhookData .payloads [2 ].WorkflowRun .HeadSha )
895+ assert .Equal (t , "repo1" , webhookData .payloads [2 ].Repo .Name )
896+ assert .Equal (t , "user2/repo1" , webhookData .payloads [2 ].Repo .FullName )
897+ }
898+
899+ func testWebhookWorkflowRunDepthLimit (t * testing.T , webhookData * workflowRunWebhook ) {
900+ // 1. create a new webhook with special webhook for repo1
901+ user2 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 2 })
902+ session := loginUser (t , "user2" )
903+ token := getTokenForLoggedInUser (t , session , auth_model .AccessTokenScopeWriteRepository , auth_model .AccessTokenScopeWriteUser )
904+
905+ testAPICreateWebhookForRepo (t , session , "user2" , "repo1" , webhookData .URL , "workflow_run" )
906+
907+ repo1 := unittest .AssertExistsAndLoadBean (t , & repo.Repository {ID : 1 })
908+
909+ gitRepo1 , err := gitrepo .OpenRepository (t .Context (), repo1 )
910+ assert .NoError (t , err )
911+
912+ // 2. trigger the webhooks
913+
914+ // add workflow file to the repo
915+ // init the workflow
916+ wfTreePath := ".gitea/workflows/push.yml"
917+ wfFileContent := `name: Endless Loop
918+ on:
919+ push:
920+ workflow_run:
921+ types:
922+ - requested
923+ jobs:
924+ dispatch:
925+ runs-on: ubuntu-latest
926+ steps:
927+ - run: echo 'test the webhook'
928+ `
929+ opts := getWorkflowCreateFileOptions (user2 , repo1 .DefaultBranch , "create " + wfTreePath , wfFileContent )
930+ createWorkflowFile (t , token , "user2" , "repo1" , wfTreePath , opts )
931+
932+ commitID , err := gitRepo1 .GetBranchCommitID (repo1 .DefaultBranch )
933+ assert .NoError (t , err )
934+
935+ // 3. validate the webhook is triggered
936+ assert .Equal (t , "workflow_run" , webhookData .triggeredEvent )
937+ // 1x push + 5x workflow_run requested chain
938+ assert .Len (t , webhookData .payloads , 6 )
939+ for i := 0 ; i < 6 ; i ++ {
940+ assert .Equal (t , "requested" , webhookData .payloads [i ].Action )
941+ assert .Equal (t , "queued" , webhookData .payloads [i ].WorkflowRun .Status )
942+ assert .Equal (t , repo1 .DefaultBranch , webhookData .payloads [i ].WorkflowRun .HeadBranch )
943+ assert .Equal (t , commitID , webhookData .payloads [i ].WorkflowRun .HeadSha )
944+ if i == 0 {
945+ assert .Equal (t , "push" , webhookData .payloads [i ].WorkflowRun .Event )
946+ } else {
947+ assert .Equal (t , "workflow_run" , webhookData .payloads [i ].WorkflowRun .Event )
948+ }
949+ assert .Equal (t , "repo1" , webhookData .payloads [i ].Repo .Name )
950+ assert .Equal (t , "user2/repo1" , webhookData .payloads [i ].Repo .FullName )
951+ }
952+ }
0 commit comments