code.gitea.io/gitea@v1.22.3/services/actions/job_emitter_test.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package actions 5 6 import ( 7 "testing" 8 9 actions_model "code.gitea.io/gitea/models/actions" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func Test_jobStatusResolver_Resolve(t *testing.T) { 15 tests := []struct { 16 name string 17 jobs actions_model.ActionJobList 18 want map[int64]actions_model.Status 19 }{ 20 { 21 name: "no blocked", 22 jobs: actions_model.ActionJobList{ 23 {ID: 1, JobID: "1", Status: actions_model.StatusWaiting, Needs: []string{}}, 24 {ID: 2, JobID: "2", Status: actions_model.StatusWaiting, Needs: []string{}}, 25 {ID: 3, JobID: "3", Status: actions_model.StatusWaiting, Needs: []string{}}, 26 }, 27 want: map[int64]actions_model.Status{}, 28 }, 29 { 30 name: "single blocked", 31 jobs: actions_model.ActionJobList{ 32 {ID: 1, JobID: "1", Status: actions_model.StatusSuccess, Needs: []string{}}, 33 {ID: 2, JobID: "2", Status: actions_model.StatusBlocked, Needs: []string{"1"}}, 34 {ID: 3, JobID: "3", Status: actions_model.StatusWaiting, Needs: []string{}}, 35 }, 36 want: map[int64]actions_model.Status{ 37 2: actions_model.StatusWaiting, 38 }, 39 }, 40 { 41 name: "multiple blocked", 42 jobs: actions_model.ActionJobList{ 43 {ID: 1, JobID: "1", Status: actions_model.StatusSuccess, Needs: []string{}}, 44 {ID: 2, JobID: "2", Status: actions_model.StatusBlocked, Needs: []string{"1"}}, 45 {ID: 3, JobID: "3", Status: actions_model.StatusBlocked, Needs: []string{"1"}}, 46 }, 47 want: map[int64]actions_model.Status{ 48 2: actions_model.StatusWaiting, 49 3: actions_model.StatusWaiting, 50 }, 51 }, 52 { 53 name: "chain blocked", 54 jobs: actions_model.ActionJobList{ 55 {ID: 1, JobID: "1", Status: actions_model.StatusFailure, Needs: []string{}}, 56 {ID: 2, JobID: "2", Status: actions_model.StatusBlocked, Needs: []string{"1"}}, 57 {ID: 3, JobID: "3", Status: actions_model.StatusBlocked, Needs: []string{"2"}}, 58 }, 59 want: map[int64]actions_model.Status{ 60 2: actions_model.StatusSkipped, 61 3: actions_model.StatusSkipped, 62 }, 63 }, 64 { 65 name: "loop need", 66 jobs: actions_model.ActionJobList{ 67 {ID: 1, JobID: "1", Status: actions_model.StatusBlocked, Needs: []string{"3"}}, 68 {ID: 2, JobID: "2", Status: actions_model.StatusBlocked, Needs: []string{"1"}}, 69 {ID: 3, JobID: "3", Status: actions_model.StatusBlocked, Needs: []string{"2"}}, 70 }, 71 want: map[int64]actions_model.Status{}, 72 }, 73 { 74 name: "with ${{ always() }} condition", 75 jobs: actions_model.ActionJobList{ 76 {ID: 1, JobID: "job1", Status: actions_model.StatusFailure, Needs: []string{}}, 77 {ID: 2, JobID: "job2", Status: actions_model.StatusBlocked, Needs: []string{"job1"}, WorkflowPayload: []byte( 78 ` 79 name: test 80 on: push 81 jobs: 82 job2: 83 runs-on: ubuntu-latest 84 needs: job1 85 if: ${{ always() }} 86 steps: 87 - run: echo "always run" 88 `)}, 89 }, 90 want: map[int64]actions_model.Status{2: actions_model.StatusWaiting}, 91 }, 92 { 93 name: "with always() condition", 94 jobs: actions_model.ActionJobList{ 95 {ID: 1, JobID: "job1", Status: actions_model.StatusFailure, Needs: []string{}}, 96 {ID: 2, JobID: "job2", Status: actions_model.StatusBlocked, Needs: []string{"job1"}, WorkflowPayload: []byte( 97 ` 98 name: test 99 on: push 100 jobs: 101 job2: 102 runs-on: ubuntu-latest 103 needs: job1 104 if: always() 105 steps: 106 - run: echo "always run" 107 `)}, 108 }, 109 want: map[int64]actions_model.Status{2: actions_model.StatusWaiting}, 110 }, 111 { 112 name: "without always() condition", 113 jobs: actions_model.ActionJobList{ 114 {ID: 1, JobID: "job1", Status: actions_model.StatusFailure, Needs: []string{}}, 115 {ID: 2, JobID: "job2", Status: actions_model.StatusBlocked, Needs: []string{"job1"}, WorkflowPayload: []byte( 116 ` 117 name: test 118 on: push 119 jobs: 120 job2: 121 runs-on: ubuntu-latest 122 needs: job1 123 steps: 124 - run: echo "not always run" 125 `)}, 126 }, 127 want: map[int64]actions_model.Status{2: actions_model.StatusSkipped}, 128 }, 129 } 130 for _, tt := range tests { 131 t.Run(tt.name, func(t *testing.T) { 132 r := newJobStatusResolver(tt.jobs) 133 assert.Equal(t, tt.want, r.Resolve()) 134 }) 135 } 136 }