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  }