@@ -11,10 +11,13 @@ import (
1111 "net/url"
1212 "strings"
1313 "testing"
14+ "time"
1415
16+ runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
1517 auth_model "code.gitea.io/gitea/models/auth"
1618 "code.gitea.io/gitea/models/repo"
1719 "code.gitea.io/gitea/models/unittest"
20+ user_model "code.gitea.io/gitea/models/user"
1821 "code.gitea.io/gitea/models/webhook"
1922 "code.gitea.io/gitea/modules/gitrepo"
2023 "code.gitea.io/gitea/modules/json"
@@ -600,3 +603,140 @@ func Test_WebhookStatus_NoWrongTrigger(t *testing.T) {
600603 assert .EqualValues (t , "push" , trigger )
601604 })
602605}
606+
607+ func Test_WebhookWorkflowJob (t * testing.T ) {
608+ var payloads []api.WorkflowJobPayload
609+ var triggeredEvent string
610+ provider := newMockWebhookProvider (func (r * http.Request ) {
611+ assert .Contains (t , r .Header ["X-Github-Event-Type" ], "workflow_job" , "X-GitHub-Event-Type should contain workflow_job" )
612+ assert .Contains (t , r .Header ["X-Gitea-Event-Type" ], "workflow_job" , "X-Gitea-Event-Type should contain workflow_job" )
613+ assert .Contains (t , r .Header ["X-Gogs-Event-Type" ], "workflow_job" , "X-Gogs-Event-Type should contain workflow_job" )
614+ content , _ := io .ReadAll (r .Body )
615+ var payload api.WorkflowJobPayload
616+ err := json .Unmarshal (content , & payload )
617+ assert .NoError (t , err )
618+ payloads = append (payloads , payload )
619+ triggeredEvent = "workflow_job"
620+ }, http .StatusOK )
621+ defer provider .Close ()
622+
623+ onGiteaRun (t , func (t * testing.T , giteaURL * url.URL ) {
624+ // 1. create a new webhook with special webhook for repo1
625+ user2 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 2 })
626+ session := loginUser (t , "user2" )
627+ token := getTokenForLoggedInUser (t , session , auth_model .AccessTokenScopeWriteRepository , auth_model .AccessTokenScopeWriteUser )
628+
629+ testAPICreateWebhookForRepo (t , session , "user2" , "repo1" , provider .URL (), "workflow_job" )
630+
631+ repo1 := unittest .AssertExistsAndLoadBean (t , & repo.Repository {ID : 1 })
632+
633+ gitRepo1 , err := gitrepo .OpenRepository (t .Context (), repo1 )
634+ assert .NoError (t , err )
635+
636+ runner := newMockRunner ()
637+ runner .registerAsRepoRunner (t , "user2" , "repo1" , "mock-runner" , []string {"ubuntu-latest" })
638+
639+ // 2. trigger the webhooks
640+
641+ // add workflow file to the repo
642+ // init the workflow
643+ wfTreePath := ".gitea/workflows/push.yml"
644+ wfFileContent := `name: Push
645+ on: push
646+ jobs:
647+ wf1-job:
648+ runs-on: ubuntu-latest
649+ steps:
650+ - run: echo 'test the webhook'
651+ wf2-job:
652+ runs-on: ubuntu-latest
653+ needs: wf1-job
654+ steps:
655+ - run: echo 'cmd 1'
656+ - run: echo 'cmd 2'
657+ `
658+ opts := getWorkflowCreateFileOptions (user2 , repo1 .DefaultBranch , fmt .Sprintf ("create %s" , wfTreePath ), wfFileContent )
659+ createWorkflowFile (t , token , "user2" , "repo1" , wfTreePath , opts )
660+
661+ commitID , err := gitRepo1 .GetBranchCommitID (repo1 .DefaultBranch )
662+ assert .NoError (t , err )
663+
664+ // 3. validate the webhook is triggered
665+ assert .EqualValues (t , "workflow_job" , triggeredEvent )
666+ assert .Len (t , payloads , 2 )
667+ assert .EqualValues (t , "queued" , payloads [0 ].Action )
668+ assert .EqualValues (t , "queued" , payloads [0 ].WorkflowJob .Status )
669+ assert .EqualValues (t , []string {"ubuntu-latest" }, payloads [0 ].WorkflowJob .Labels )
670+ assert .EqualValues (t , commitID , payloads [0 ].WorkflowJob .HeadSha )
671+ assert .EqualValues (t , "repo1" , payloads [0 ].Repository .Name )
672+ assert .EqualValues (t , "user2/repo1" , payloads [0 ].Repository .FullName )
673+
674+ assert .EqualValues (t , "waiting" , payloads [1 ].Action )
675+ assert .EqualValues (t , "waiting" , payloads [1 ].WorkflowJob .Status )
676+ assert .EqualValues (t , commitID , payloads [1 ].WorkflowJob .HeadSha )
677+ assert .EqualValues (t , "repo1" , payloads [1 ].Repository .Name )
678+ assert .EqualValues (t , "user2/repo1" , payloads [1 ].Repository .FullName )
679+
680+ // 4. Execute a single Job
681+ task := runner .fetchTask (t )
682+ outcome := & mockTaskOutcome {
683+ result : runnerv1 .Result_RESULT_SUCCESS ,
684+ execTime : time .Millisecond ,
685+ }
686+ runner .execTask (t , task , outcome )
687+
688+ // 5. validate the webhook is triggered
689+ assert .EqualValues (t , "workflow_job" , triggeredEvent )
690+ assert .Len (t , payloads , 5 )
691+ assert .EqualValues (t , "in_progress" , payloads [2 ].Action )
692+ assert .EqualValues (t , "in_progress" , payloads [2 ].WorkflowJob .Status )
693+ assert .EqualValues (t , "mock-runner" , payloads [2 ].WorkflowJob .RunnerName )
694+ assert .EqualValues (t , commitID , payloads [2 ].WorkflowJob .HeadSha )
695+ assert .EqualValues (t , "repo1" , payloads [2 ].Repository .Name )
696+ assert .EqualValues (t , "user2/repo1" , payloads [2 ].Repository .FullName )
697+
698+ assert .EqualValues (t , "completed" , payloads [3 ].Action )
699+ assert .EqualValues (t , "completed" , payloads [3 ].WorkflowJob .Status )
700+ assert .EqualValues (t , "mock-runner" , payloads [3 ].WorkflowJob .RunnerName )
701+ assert .EqualValues (t , "success" , payloads [3 ].WorkflowJob .Conclusion )
702+ assert .EqualValues (t , commitID , payloads [3 ].WorkflowJob .HeadSha )
703+ assert .EqualValues (t , "repo1" , payloads [3 ].Repository .Name )
704+ assert .EqualValues (t , "user2/repo1" , payloads [3 ].Repository .FullName )
705+ assert .Len (t , payloads [3 ].WorkflowJob .Steps , 1 )
706+
707+ assert .EqualValues (t , "queued" , payloads [4 ].Action )
708+ assert .EqualValues (t , "queued" , payloads [4 ].WorkflowJob .Status )
709+ assert .EqualValues (t , []string {"ubuntu-latest" }, payloads [4 ].WorkflowJob .Labels )
710+ assert .EqualValues (t , commitID , payloads [4 ].WorkflowJob .HeadSha )
711+ assert .EqualValues (t , "repo1" , payloads [4 ].Repository .Name )
712+ assert .EqualValues (t , "user2/repo1" , payloads [4 ].Repository .FullName )
713+
714+ // 6. Execute a single Job
715+ task = runner .fetchTask (t )
716+ outcome = & mockTaskOutcome {
717+ result : runnerv1 .Result_RESULT_FAILURE ,
718+ execTime : time .Millisecond ,
719+ }
720+ runner .execTask (t , task , outcome )
721+
722+ // 7. validate the webhook is triggered
723+ assert .EqualValues (t , "workflow_job" , triggeredEvent )
724+ assert .Len (t , payloads , 7 )
725+ assert .EqualValues (t , "in_progress" , payloads [5 ].Action )
726+ assert .EqualValues (t , "in_progress" , payloads [5 ].WorkflowJob .Status )
727+ assert .EqualValues (t , "mock-runner" , payloads [5 ].WorkflowJob .RunnerName )
728+
729+ assert .EqualValues (t , commitID , payloads [5 ].WorkflowJob .HeadSha )
730+ assert .EqualValues (t , "repo1" , payloads [5 ].Repository .Name )
731+ assert .EqualValues (t , "user2/repo1" , payloads [5 ].Repository .FullName )
732+
733+ assert .EqualValues (t , "completed" , payloads [6 ].Action )
734+ assert .EqualValues (t , "completed" , payloads [6 ].WorkflowJob .Status )
735+ assert .EqualValues (t , "failure" , payloads [6 ].WorkflowJob .Conclusion )
736+ assert .EqualValues (t , "mock-runner" , payloads [6 ].WorkflowJob .RunnerName )
737+ assert .EqualValues (t , commitID , payloads [6 ].WorkflowJob .HeadSha )
738+ assert .EqualValues (t , "repo1" , payloads [6 ].Repository .Name )
739+ assert .EqualValues (t , "user2/repo1" , payloads [6 ].Repository .FullName )
740+ assert .Len (t , payloads [6 ].WorkflowJob .Steps , 2 )
741+ })
742+ }
0 commit comments