gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. // Copyright 2017 Gitea. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package git_test
  4. import (
  5. "fmt"
  6. "testing"
  7. "time"
  8. actions_model "code.gitea.io/gitea/models/actions"
  9. "code.gitea.io/gitea/models/db"
  10. git_model "code.gitea.io/gitea/models/git"
  11. repo_model "code.gitea.io/gitea/models/repo"
  12. "code.gitea.io/gitea/models/unittest"
  13. user_model "code.gitea.io/gitea/models/user"
  14. "code.gitea.io/gitea/modules/commitstatus"
  15. "code.gitea.io/gitea/modules/gitrepo"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func TestGetCommitStatuses(t *testing.T) {
  19. assert.NoError(t, unittest.PrepareTestDatabase())
  20. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  21. sha1 := "1234123412341234123412341234123412341234" // the mocked commit ID in test fixtures
  22. statuses, maxResults, err := db.FindAndCount[git_model.CommitStatus](t.Context(), &git_model.CommitStatusOptions{
  23. ListOptions: db.ListOptions{Page: 1, PageSize: 50},
  24. RepoID: repo1.ID,
  25. SHA: sha1,
  26. })
  27. assert.NoError(t, err)
  28. assert.Equal(t, 5, int(maxResults))
  29. assert.Len(t, statuses, 5)
  30. assert.Equal(t, "ci/awesomeness", statuses[0].Context)
  31. assert.Equal(t, commitstatus.CommitStatusPending, statuses[0].State)
  32. assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL(t.Context()))
  33. assert.Equal(t, "cov/awesomeness", statuses[1].Context)
  34. assert.Equal(t, commitstatus.CommitStatusWarning, statuses[1].State)
  35. assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL(t.Context()))
  36. assert.Equal(t, "cov/awesomeness", statuses[2].Context)
  37. assert.Equal(t, commitstatus.CommitStatusSuccess, statuses[2].State)
  38. assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL(t.Context()))
  39. assert.Equal(t, "ci/awesomeness", statuses[3].Context)
  40. assert.Equal(t, commitstatus.CommitStatusFailure, statuses[3].State)
  41. assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL(t.Context()))
  42. assert.Equal(t, "deploy/awesomeness", statuses[4].Context)
  43. assert.Equal(t, commitstatus.CommitStatusError, statuses[4].State)
  44. assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL(t.Context()))
  45. statuses, maxResults, err = db.FindAndCount[git_model.CommitStatus](t.Context(), &git_model.CommitStatusOptions{
  46. ListOptions: db.ListOptions{Page: 2, PageSize: 50},
  47. RepoID: repo1.ID,
  48. SHA: sha1,
  49. })
  50. assert.NoError(t, err)
  51. assert.Equal(t, 5, int(maxResults))
  52. assert.Empty(t, statuses)
  53. }
  54. func Test_CalcCommitStatus(t *testing.T) {
  55. kases := []struct {
  56. statuses []*git_model.CommitStatus
  57. expected *git_model.CommitStatus
  58. }{
  59. {
  60. statuses: []*git_model.CommitStatus{
  61. {
  62. State: commitstatus.CommitStatusPending,
  63. },
  64. },
  65. expected: &git_model.CommitStatus{
  66. State: commitstatus.CommitStatusPending,
  67. },
  68. },
  69. {
  70. statuses: []*git_model.CommitStatus{
  71. {
  72. State: commitstatus.CommitStatusSuccess,
  73. },
  74. {
  75. State: commitstatus.CommitStatusPending,
  76. },
  77. },
  78. expected: &git_model.CommitStatus{
  79. State: commitstatus.CommitStatusPending,
  80. },
  81. },
  82. {
  83. statuses: []*git_model.CommitStatus{
  84. {
  85. State: commitstatus.CommitStatusSuccess,
  86. },
  87. {
  88. State: commitstatus.CommitStatusPending,
  89. },
  90. {
  91. State: commitstatus.CommitStatusSuccess,
  92. },
  93. },
  94. expected: &git_model.CommitStatus{
  95. State: commitstatus.CommitStatusPending,
  96. },
  97. },
  98. {
  99. statuses: []*git_model.CommitStatus{
  100. {
  101. State: commitstatus.CommitStatusError,
  102. },
  103. {
  104. State: commitstatus.CommitStatusPending,
  105. },
  106. {
  107. State: commitstatus.CommitStatusSuccess,
  108. },
  109. },
  110. expected: &git_model.CommitStatus{
  111. State: commitstatus.CommitStatusFailure,
  112. },
  113. },
  114. {
  115. statuses: []*git_model.CommitStatus{
  116. {
  117. State: commitstatus.CommitStatusWarning,
  118. },
  119. {
  120. State: commitstatus.CommitStatusPending,
  121. },
  122. {
  123. State: commitstatus.CommitStatusSuccess,
  124. },
  125. },
  126. expected: &git_model.CommitStatus{
  127. State: commitstatus.CommitStatusPending,
  128. },
  129. },
  130. {
  131. statuses: []*git_model.CommitStatus{
  132. {
  133. State: commitstatus.CommitStatusSuccess,
  134. },
  135. {
  136. State: commitstatus.CommitStatusSuccess,
  137. },
  138. {
  139. State: commitstatus.CommitStatusSuccess,
  140. },
  141. },
  142. expected: &git_model.CommitStatus{
  143. State: commitstatus.CommitStatusSuccess,
  144. },
  145. },
  146. {
  147. statuses: []*git_model.CommitStatus{
  148. {
  149. State: commitstatus.CommitStatusFailure,
  150. },
  151. {
  152. State: commitstatus.CommitStatusError,
  153. },
  154. {
  155. State: commitstatus.CommitStatusWarning,
  156. },
  157. },
  158. expected: &git_model.CommitStatus{
  159. State: commitstatus.CommitStatusFailure,
  160. },
  161. },
  162. }
  163. for _, kase := range kases {
  164. assert.Equal(t, kase.expected, git_model.CalcCommitStatus(kase.statuses), "statuses: %v", kase.statuses)
  165. }
  166. }
  167. func TestFindRepoRecentCommitStatusContexts(t *testing.T) {
  168. assert.NoError(t, unittest.PrepareTestDatabase())
  169. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  170. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  171. gitRepo, err := gitrepo.OpenRepository(t.Context(), repo2)
  172. assert.NoError(t, err)
  173. defer gitRepo.Close()
  174. commit, err := gitRepo.GetBranchCommit(repo2.DefaultBranch)
  175. assert.NoError(t, err)
  176. defer func() {
  177. _, err := db.DeleteByBean(t.Context(), &git_model.CommitStatus{
  178. RepoID: repo2.ID,
  179. CreatorID: user2.ID,
  180. SHA: commit.ID.String(),
  181. })
  182. assert.NoError(t, err)
  183. }()
  184. err = git_model.NewCommitStatus(t.Context(), git_model.NewCommitStatusOptions{
  185. Repo: repo2,
  186. Creator: user2,
  187. SHA: commit.ID,
  188. CommitStatus: &git_model.CommitStatus{
  189. State: commitstatus.CommitStatusFailure,
  190. TargetURL: "https://example.com/tests/",
  191. Context: "compliance/lint-backend",
  192. },
  193. })
  194. assert.NoError(t, err)
  195. err = git_model.NewCommitStatus(t.Context(), git_model.NewCommitStatusOptions{
  196. Repo: repo2,
  197. Creator: user2,
  198. SHA: commit.ID,
  199. CommitStatus: &git_model.CommitStatus{
  200. State: commitstatus.CommitStatusSuccess,
  201. TargetURL: "https://example.com/tests/",
  202. Context: "compliance/lint-backend",
  203. },
  204. })
  205. assert.NoError(t, err)
  206. contexts, err := git_model.FindRepoRecentCommitStatusContexts(t.Context(), repo2.ID, time.Hour)
  207. assert.NoError(t, err)
  208. if assert.Len(t, contexts, 1) {
  209. assert.Equal(t, "compliance/lint-backend", contexts[0])
  210. }
  211. }
  212. func TestCommitStatusesHideActionsURL(t *testing.T) {
  213. assert.NoError(t, unittest.PrepareTestDatabase())
  214. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
  215. run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: 791, RepoID: repo.ID})
  216. assert.NoError(t, run.LoadAttributes(t.Context()))
  217. statuses := []*git_model.CommitStatus{
  218. {
  219. RepoID: repo.ID,
  220. TargetURL: fmt.Sprintf("%s/jobs/%d", run.Link(), run.Index),
  221. },
  222. {
  223. RepoID: repo.ID,
  224. TargetURL: "https://mycicd.org/1",
  225. },
  226. }
  227. git_model.CommitStatusesHideActionsURL(t.Context(), statuses)
  228. assert.Empty(t, statuses[0].TargetURL)
  229. assert.Equal(t, "https://mycicd.org/1", statuses[1].TargetURL)
  230. }
  231. func TestGetCountLatestCommitStatus(t *testing.T) {
  232. assert.NoError(t, unittest.PrepareTestDatabase())
  233. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  234. sha1 := "1234123412341234123412341234123412341234" // the mocked commit ID in test fixtures
  235. commitStatuses, err := git_model.GetLatestCommitStatus(t.Context(), repo1.ID, sha1, db.ListOptions{
  236. Page: 1,
  237. PageSize: 2,
  238. })
  239. assert.NoError(t, err)
  240. assert.Len(t, commitStatuses, 2)
  241. assert.Equal(t, commitstatus.CommitStatusFailure, commitStatuses[0].State)
  242. assert.Equal(t, "ci/awesomeness", commitStatuses[0].Context)
  243. assert.Equal(t, commitstatus.CommitStatusError, commitStatuses[1].State)
  244. assert.Equal(t, "deploy/awesomeness", commitStatuses[1].Context)
  245. count, err := git_model.CountLatestCommitStatus(t.Context(), repo1.ID, sha1)
  246. assert.NoError(t, err)
  247. assert.EqualValues(t, 3, count)
  248. }