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.

commit_test.go 10KB

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