Skip to content

Commit 05f8423

Browse files
committed
add initial test
1 parent f3fc2f3 commit 05f8423

File tree

2 files changed

+145
-3
lines changed

2 files changed

+145
-3
lines changed

routers/api/actions/runner/runner.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,16 @@ func (s *Service) UpdateTask(
220220
actions_service.CreateCommitStatus(ctx, task.Job)
221221
}
222222

223+
if task.Status.IsDone() {
224+
notifier.CreateWorkflowJob(ctx, task.Job.Run.Repo, task.Job.Run.TriggerUser, task.Job, task)
225+
}
226+
223227
if req.Msg.State.Result != runnerv1.Result_RESULT_UNSPECIFIED {
224228
if err := actions_service.EmitJobsIfReady(task.Job.RunID); err != nil {
225229
log.Error("Emit ready jobs of run %d: %v", task.Job.RunID, err)
226230
}
227231
}
228-
if task.Status.IsDone() {
229-
notifier.CreateWorkflowJob(ctx, task.Job.Run.Repo, task.Job.Run.TriggerUser, task.Job, task)
230-
}
232+
231233
return connect.NewResponse(&runnerv1.UpdateTaskResponse{
232234
State: &runnerv1.TaskState{
233235
Id: req.Msg.State.Id,

tests/integration/repo_webhook_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)