You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

job_emitter_test.go 4.0KB

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