gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package issue
  4. import (
  5. "testing"
  6. activities_model "code.gitea.io/gitea/models/activities"
  7. issues_model "code.gitea.io/gitea/models/issues"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/models/unittest"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/repository"
  12. "code.gitea.io/gitea/modules/setting"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func TestUpdateIssuesCommit(t *testing.T) {
  16. assert.NoError(t, unittest.PrepareTestDatabase())
  17. pushCommits := []*repository.PushCommit{
  18. {
  19. Sha1: "abcdef1",
  20. CommitterEmail: "user2@example.com",
  21. CommitterName: "User Two",
  22. AuthorEmail: "user4@example.com",
  23. AuthorName: "User Four",
  24. Message: "start working on #FST-1, #1",
  25. },
  26. {
  27. Sha1: "abcdef2",
  28. CommitterEmail: "user2@example.com",
  29. CommitterName: "User Two",
  30. AuthorEmail: "user2@example.com",
  31. AuthorName: "User Two",
  32. Message: "a plain message",
  33. },
  34. {
  35. Sha1: "abcdef2",
  36. CommitterEmail: "user2@example.com",
  37. CommitterName: "User Two",
  38. AuthorEmail: "user2@example.com",
  39. AuthorName: "User Two",
  40. Message: "close #2",
  41. },
  42. }
  43. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  44. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  45. repo.Owner = user
  46. commentBean := &issues_model.Comment{
  47. Type: issues_model.CommentTypeCommitRef,
  48. CommitSHA: "abcdef1",
  49. PosterID: user.ID,
  50. IssueID: 1,
  51. }
  52. issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 4}
  53. unittest.AssertNotExistsBean(t, commentBean)
  54. unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
  55. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, repo.DefaultBranch))
  56. unittest.AssertExistsAndLoadBean(t, commentBean)
  57. unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  58. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  59. // Test that push to a non-default branch closes no issue.
  60. pushCommits = []*repository.PushCommit{
  61. {
  62. Sha1: "abcdef1",
  63. CommitterEmail: "user2@example.com",
  64. CommitterName: "User Two",
  65. AuthorEmail: "user4@example.com",
  66. AuthorName: "User Four",
  67. Message: "close #1",
  68. },
  69. }
  70. repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  71. commentBean = &issues_model.Comment{
  72. Type: issues_model.CommentTypeCommitRef,
  73. CommitSHA: "abcdef1",
  74. PosterID: user.ID,
  75. IssueID: 6,
  76. }
  77. issueBean = &issues_model.Issue{RepoID: repo.ID, Index: 1}
  78. unittest.AssertNotExistsBean(t, commentBean)
  79. unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
  80. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, "non-existing-branch"))
  81. unittest.AssertExistsAndLoadBean(t, commentBean)
  82. unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
  83. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  84. pushCommits = []*repository.PushCommit{
  85. {
  86. Sha1: "abcdef3",
  87. CommitterEmail: "user2@example.com",
  88. CommitterName: "User Two",
  89. AuthorEmail: "user2@example.com",
  90. AuthorName: "User Two",
  91. Message: "close " + setting.AppURL + repo.FullName() + "/pulls/1",
  92. },
  93. }
  94. repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  95. commentBean = &issues_model.Comment{
  96. Type: issues_model.CommentTypeCommitRef,
  97. CommitSHA: "abcdef3",
  98. PosterID: user.ID,
  99. IssueID: 6,
  100. }
  101. issueBean = &issues_model.Issue{RepoID: repo.ID, Index: 1}
  102. unittest.AssertNotExistsBean(t, commentBean)
  103. unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
  104. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, repo.DefaultBranch))
  105. unittest.AssertExistsAndLoadBean(t, commentBean)
  106. unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  107. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  108. }
  109. func TestUpdateIssuesCommit_Colon(t *testing.T) {
  110. assert.NoError(t, unittest.PrepareTestDatabase())
  111. pushCommits := []*repository.PushCommit{
  112. {
  113. Sha1: "abcdef2",
  114. CommitterEmail: "user2@example.com",
  115. CommitterName: "User Two",
  116. AuthorEmail: "user2@example.com",
  117. AuthorName: "User Two",
  118. Message: "close: #2",
  119. },
  120. }
  121. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  122. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  123. repo.Owner = user
  124. issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 4}
  125. unittest.AssertNotExistsBean(t, &issues_model.Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
  126. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, repo.DefaultBranch))
  127. unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  128. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  129. }
  130. func TestUpdateIssuesCommit_Issue5957(t *testing.T) {
  131. assert.NoError(t, unittest.PrepareTestDatabase())
  132. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  133. // Test that push to a non-default branch closes an issue.
  134. pushCommits := []*repository.PushCommit{
  135. {
  136. Sha1: "abcdef1",
  137. CommitterEmail: "user2@example.com",
  138. CommitterName: "User Two",
  139. AuthorEmail: "user4@example.com",
  140. AuthorName: "User Four",
  141. Message: "close #2",
  142. },
  143. }
  144. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  145. commentBean := &issues_model.Comment{
  146. Type: issues_model.CommentTypeCommitRef,
  147. CommitSHA: "abcdef1",
  148. PosterID: user.ID,
  149. IssueID: 7,
  150. }
  151. issueBean := &issues_model.Issue{RepoID: repo.ID, Index: 2, ID: 7}
  152. unittest.AssertNotExistsBean(t, commentBean)
  153. unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
  154. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, "non-existing-branch"))
  155. unittest.AssertExistsAndLoadBean(t, commentBean)
  156. unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  157. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  158. }
  159. func TestUpdateIssuesCommit_AnotherRepo(t *testing.T) {
  160. assert.NoError(t, unittest.PrepareTestDatabase())
  161. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  162. // Test that a push to default branch closes issue in another repo
  163. // If the user also has push permissions to that repo
  164. pushCommits := []*repository.PushCommit{
  165. {
  166. Sha1: "abcdef1",
  167. CommitterEmail: "user2@example.com",
  168. CommitterName: "User Two",
  169. AuthorEmail: "user2@example.com",
  170. AuthorName: "User Two",
  171. Message: "close user2/repo1#1",
  172. },
  173. }
  174. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  175. commentBean := &issues_model.Comment{
  176. Type: issues_model.CommentTypeCommitRef,
  177. CommitSHA: "abcdef1",
  178. PosterID: user.ID,
  179. IssueID: 1,
  180. }
  181. issueBean := &issues_model.Issue{RepoID: 1, Index: 1, ID: 1}
  182. unittest.AssertNotExistsBean(t, commentBean)
  183. unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
  184. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, repo.DefaultBranch))
  185. unittest.AssertExistsAndLoadBean(t, commentBean)
  186. unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  187. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  188. }
  189. func TestUpdateIssuesCommit_AnotherRepo_FullAddress(t *testing.T) {
  190. assert.NoError(t, unittest.PrepareTestDatabase())
  191. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  192. // Test that a push to default branch closes issue in another repo
  193. // If the user also has push permissions to that repo
  194. pushCommits := []*repository.PushCommit{
  195. {
  196. Sha1: "abcdef1",
  197. CommitterEmail: "user2@example.com",
  198. CommitterName: "User Two",
  199. AuthorEmail: "user2@example.com",
  200. AuthorName: "User Two",
  201. Message: "close " + setting.AppURL + "user2/repo1/issues/1",
  202. },
  203. }
  204. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  205. commentBean := &issues_model.Comment{
  206. Type: issues_model.CommentTypeCommitRef,
  207. CommitSHA: "abcdef1",
  208. PosterID: user.ID,
  209. IssueID: 1,
  210. }
  211. issueBean := &issues_model.Issue{RepoID: 1, Index: 1, ID: 1}
  212. unittest.AssertNotExistsBean(t, commentBean)
  213. unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
  214. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, repo.DefaultBranch))
  215. unittest.AssertExistsAndLoadBean(t, commentBean)
  216. unittest.AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  217. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  218. }
  219. func TestUpdateIssuesCommit_AnotherRepoNoPermission(t *testing.T) {
  220. assert.NoError(t, unittest.PrepareTestDatabase())
  221. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
  222. // Test that a push with close reference *can not* close issue
  223. // If the committer doesn't have push rights in that repo
  224. pushCommits := []*repository.PushCommit{
  225. {
  226. Sha1: "abcdef3",
  227. CommitterEmail: "user10@example.com",
  228. CommitterName: "User Ten",
  229. AuthorEmail: "user10@example.com",
  230. AuthorName: "User Ten",
  231. Message: "close org3/repo3#1",
  232. },
  233. {
  234. Sha1: "abcdef4",
  235. CommitterEmail: "user10@example.com",
  236. CommitterName: "User Ten",
  237. AuthorEmail: "user10@example.com",
  238. AuthorName: "User Ten",
  239. Message: "close " + setting.AppURL + "org3/repo3/issues/1",
  240. },
  241. }
  242. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 6})
  243. commentBean := &issues_model.Comment{
  244. Type: issues_model.CommentTypeCommitRef,
  245. CommitSHA: "abcdef3",
  246. PosterID: user.ID,
  247. IssueID: 6,
  248. }
  249. commentBean2 := &issues_model.Comment{
  250. Type: issues_model.CommentTypeCommitRef,
  251. CommitSHA: "abcdef4",
  252. PosterID: user.ID,
  253. IssueID: 6,
  254. }
  255. issueBean := &issues_model.Issue{RepoID: 3, Index: 1, ID: 6}
  256. unittest.AssertNotExistsBean(t, commentBean)
  257. unittest.AssertNotExistsBean(t, commentBean2)
  258. unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
  259. assert.NoError(t, UpdateIssuesCommit(t.Context(), user, repo, pushCommits, repo.DefaultBranch))
  260. unittest.AssertNotExistsBean(t, commentBean)
  261. unittest.AssertNotExistsBean(t, commentBean2)
  262. unittest.AssertNotExistsBean(t, issueBean, "is_closed=1")
  263. unittest.CheckConsistencyFor(t, &activities_model.Action{})
  264. }