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.

action_test.go 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package models
  2. import (
  3. "path"
  4. "testing"
  5. "code.gitea.io/gitea/modules/setting"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestAction_GetRepoPath(t *testing.T) {
  9. assert.NoError(t, PrepareTestDatabase())
  10. repo := AssertExistsAndLoadBean(t, &Repository{}).(*Repository)
  11. owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User)
  12. action := &Action{RepoID: repo.ID}
  13. assert.Equal(t, path.Join(owner.Name, repo.Name), action.GetRepoPath())
  14. }
  15. func TestAction_GetRepoLink(t *testing.T) {
  16. assert.NoError(t, PrepareTestDatabase())
  17. repo := AssertExistsAndLoadBean(t, &Repository{}).(*Repository)
  18. owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User)
  19. action := &Action{RepoID: repo.ID}
  20. setting.AppSubURL = "/suburl/"
  21. expected := path.Join(setting.AppSubURL, owner.Name, repo.Name)
  22. assert.Equal(t, expected, action.GetRepoLink())
  23. }
  24. func TestPushCommits_ToAPIPayloadCommits(t *testing.T) {
  25. pushCommits := NewPushCommits()
  26. pushCommits.Commits = []*PushCommit{
  27. {
  28. Sha1: "69554a6",
  29. CommitterEmail: "user2@example.com",
  30. CommitterName: "User2",
  31. AuthorEmail: "user2@example.com",
  32. AuthorName: "User2",
  33. Message: "not signed commit",
  34. },
  35. {
  36. Sha1: "27566bd",
  37. CommitterEmail: "user2@example.com",
  38. CommitterName: "User2",
  39. AuthorEmail: "user2@example.com",
  40. AuthorName: "User2",
  41. Message: "good signed commit (with not yet validated email)",
  42. },
  43. {
  44. Sha1: "5099b81",
  45. CommitterEmail: "user2@example.com",
  46. CommitterName: "User2",
  47. AuthorEmail: "user2@example.com",
  48. AuthorName: "User2",
  49. Message: "good signed commit",
  50. },
  51. }
  52. pushCommits.Len = len(pushCommits.Commits)
  53. repo := AssertExistsAndLoadBean(t, &Repository{ID: 16}).(*Repository)
  54. payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16")
  55. assert.NoError(t, err)
  56. assert.EqualValues(t, 3, len(payloadCommits))
  57. assert.Equal(t, "69554a6", payloadCommits[0].ID)
  58. assert.Equal(t, "not signed commit", payloadCommits[0].Message)
  59. assert.Equal(t, "/user2/repo16/commit/69554a6", payloadCommits[0].URL)
  60. assert.Equal(t, "User2", payloadCommits[0].Committer.Name)
  61. assert.Equal(t, "user2", payloadCommits[0].Committer.UserName)
  62. assert.Equal(t, "User2", payloadCommits[0].Author.Name)
  63. assert.Equal(t, "user2", payloadCommits[0].Author.UserName)
  64. assert.EqualValues(t, []string{}, payloadCommits[0].Added)
  65. assert.EqualValues(t, []string{}, payloadCommits[0].Removed)
  66. assert.EqualValues(t, []string{"readme.md"}, payloadCommits[0].Modified)
  67. assert.Equal(t, "27566bd", payloadCommits[1].ID)
  68. assert.Equal(t, "good signed commit (with not yet validated email)", payloadCommits[1].Message)
  69. assert.Equal(t, "/user2/repo16/commit/27566bd", payloadCommits[1].URL)
  70. assert.Equal(t, "User2", payloadCommits[1].Committer.Name)
  71. assert.Equal(t, "user2", payloadCommits[1].Committer.UserName)
  72. assert.Equal(t, "User2", payloadCommits[1].Author.Name)
  73. assert.Equal(t, "user2", payloadCommits[1].Author.UserName)
  74. assert.EqualValues(t, []string{}, payloadCommits[1].Added)
  75. assert.EqualValues(t, []string{}, payloadCommits[1].Removed)
  76. assert.EqualValues(t, []string{"readme.md"}, payloadCommits[1].Modified)
  77. assert.Equal(t, "5099b81", payloadCommits[2].ID)
  78. assert.Equal(t, "good signed commit", payloadCommits[2].Message)
  79. assert.Equal(t, "/user2/repo16/commit/5099b81", payloadCommits[2].URL)
  80. assert.Equal(t, "User2", payloadCommits[2].Committer.Name)
  81. assert.Equal(t, "user2", payloadCommits[2].Committer.UserName)
  82. assert.Equal(t, "User2", payloadCommits[2].Author.Name)
  83. assert.Equal(t, "user2", payloadCommits[2].Author.UserName)
  84. assert.EqualValues(t, []string{"readme.md"}, payloadCommits[2].Added)
  85. assert.EqualValues(t, []string{}, payloadCommits[2].Removed)
  86. assert.EqualValues(t, []string{}, payloadCommits[2].Modified)
  87. }
  88. func TestPushCommits_AvatarLink(t *testing.T) {
  89. pushCommits := NewPushCommits()
  90. pushCommits.Commits = []*PushCommit{
  91. {
  92. Sha1: "abcdef1",
  93. CommitterEmail: "user2@example.com",
  94. CommitterName: "User Two",
  95. AuthorEmail: "user4@example.com",
  96. AuthorName: "User Four",
  97. Message: "message1",
  98. },
  99. {
  100. Sha1: "abcdef2",
  101. CommitterEmail: "user2@example.com",
  102. CommitterName: "User Two",
  103. AuthorEmail: "user2@example.com",
  104. AuthorName: "User Two",
  105. Message: "message2",
  106. },
  107. }
  108. pushCommits.Len = len(pushCommits.Commits)
  109. assert.Equal(t,
  110. "/suburl/user/avatar/user2/-1",
  111. pushCommits.AvatarLink("user2@example.com"))
  112. assert.Equal(t,
  113. "https://secure.gravatar.com/avatar/19ade630b94e1e0535b3df7387434154?d=identicon",
  114. pushCommits.AvatarLink("nonexistent@example.com"))
  115. }
  116. func TestUpdateIssuesCommit(t *testing.T) {
  117. assert.NoError(t, PrepareTestDatabase())
  118. pushCommits := []*PushCommit{
  119. {
  120. Sha1: "abcdef1",
  121. CommitterEmail: "user2@example.com",
  122. CommitterName: "User Two",
  123. AuthorEmail: "user4@example.com",
  124. AuthorName: "User Four",
  125. Message: "start working on #FST-1, #1",
  126. },
  127. {
  128. Sha1: "abcdef2",
  129. CommitterEmail: "user2@example.com",
  130. CommitterName: "User Two",
  131. AuthorEmail: "user2@example.com",
  132. AuthorName: "User Two",
  133. Message: "a plain message",
  134. },
  135. {
  136. Sha1: "abcdef2",
  137. CommitterEmail: "user2@example.com",
  138. CommitterName: "User Two",
  139. AuthorEmail: "user2@example.com",
  140. AuthorName: "User Two",
  141. Message: "close #2",
  142. },
  143. }
  144. user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  145. repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
  146. repo.Owner = user
  147. commentBean := &Comment{
  148. Type: CommentTypeCommitRef,
  149. CommitSHA: "abcdef1",
  150. PosterID: user.ID,
  151. IssueID: 1,
  152. }
  153. issueBean := &Issue{RepoID: repo.ID, Index: 2}
  154. AssertNotExistsBean(t, commentBean)
  155. AssertNotExistsBean(t, &Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
  156. assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch))
  157. AssertExistsAndLoadBean(t, commentBean)
  158. AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  159. CheckConsistencyFor(t, &Action{})
  160. // Test that push to a non-default branch closes no issue.
  161. pushCommits = []*PushCommit{
  162. {
  163. Sha1: "abcdef1",
  164. CommitterEmail: "user2@example.com",
  165. CommitterName: "User Two",
  166. AuthorEmail: "user4@example.com",
  167. AuthorName: "User Four",
  168. Message: "close #1",
  169. },
  170. }
  171. repo = AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository)
  172. commentBean = &Comment{
  173. Type: CommentTypeCommitRef,
  174. CommitSHA: "abcdef1",
  175. PosterID: user.ID,
  176. IssueID: 6,
  177. }
  178. issueBean = &Issue{RepoID: repo.ID, Index: 1}
  179. AssertNotExistsBean(t, commentBean)
  180. AssertNotExistsBean(t, &Issue{RepoID: repo.ID, Index: 1}, "is_closed=1")
  181. assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, "non-existing-branch"))
  182. AssertExistsAndLoadBean(t, commentBean)
  183. AssertNotExistsBean(t, issueBean, "is_closed=1")
  184. CheckConsistencyFor(t, &Action{})
  185. }
  186. func TestUpdateIssuesCommit_Colon(t *testing.T) {
  187. assert.NoError(t, PrepareTestDatabase())
  188. pushCommits := []*PushCommit{
  189. {
  190. Sha1: "abcdef2",
  191. CommitterEmail: "user2@example.com",
  192. CommitterName: "User Two",
  193. AuthorEmail: "user2@example.com",
  194. AuthorName: "User Two",
  195. Message: "close: #2",
  196. },
  197. }
  198. user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  199. repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
  200. repo.Owner = user
  201. issueBean := &Issue{RepoID: repo.ID, Index: 2}
  202. AssertNotExistsBean(t, &Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
  203. assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch))
  204. AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  205. CheckConsistencyFor(t, &Action{})
  206. }
  207. func TestUpdateIssuesCommit_Issue5957(t *testing.T) {
  208. assert.NoError(t, PrepareTestDatabase())
  209. user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  210. // Test that push to a non-default branch closes an issue.
  211. pushCommits := []*PushCommit{
  212. {
  213. Sha1: "abcdef1",
  214. CommitterEmail: "user2@example.com",
  215. CommitterName: "User Two",
  216. AuthorEmail: "user4@example.com",
  217. AuthorName: "User Four",
  218. Message: "close #2",
  219. },
  220. }
  221. repo := AssertExistsAndLoadBean(t, &Repository{ID: 2}).(*Repository)
  222. commentBean := &Comment{
  223. Type: CommentTypeCommitRef,
  224. CommitSHA: "abcdef1",
  225. PosterID: user.ID,
  226. IssueID: 7,
  227. }
  228. issueBean := &Issue{RepoID: repo.ID, Index: 2, ID: 7}
  229. AssertNotExistsBean(t, commentBean)
  230. AssertNotExistsBean(t, issueBean, "is_closed=1")
  231. assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, "non-existing-branch"))
  232. AssertExistsAndLoadBean(t, commentBean)
  233. AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  234. CheckConsistencyFor(t, &Action{})
  235. }
  236. func TestUpdateIssuesCommit_AnotherRepo(t *testing.T) {
  237. assert.NoError(t, PrepareTestDatabase())
  238. user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  239. // Test that a push to default branch closes issue in another repo
  240. // If the user also has push permissions to that repo
  241. pushCommits := []*PushCommit{
  242. {
  243. Sha1: "abcdef1",
  244. CommitterEmail: "user2@example.com",
  245. CommitterName: "User Two",
  246. AuthorEmail: "user2@example.com",
  247. AuthorName: "User Two",
  248. Message: "close user2/repo1#1",
  249. },
  250. }
  251. repo := AssertExistsAndLoadBean(t, &Repository{ID: 2}).(*Repository)
  252. commentBean := &Comment{
  253. Type: CommentTypeCommitRef,
  254. CommitSHA: "abcdef1",
  255. PosterID: user.ID,
  256. IssueID: 1,
  257. }
  258. issueBean := &Issue{RepoID: 1, Index: 1, ID: 1}
  259. AssertNotExistsBean(t, commentBean)
  260. AssertNotExistsBean(t, issueBean, "is_closed=1")
  261. assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch))
  262. AssertExistsAndLoadBean(t, commentBean)
  263. AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
  264. CheckConsistencyFor(t, &Action{})
  265. }
  266. func TestUpdateIssuesCommit_AnotherRepoNoPermission(t *testing.T) {
  267. assert.NoError(t, PrepareTestDatabase())
  268. user := AssertExistsAndLoadBean(t, &User{ID: 10}).(*User)
  269. // Test that a push with close reference *can not* close issue
  270. // If the commiter doesn't have push rights in that repo
  271. pushCommits := []*PushCommit{
  272. {
  273. Sha1: "abcdef3",
  274. CommitterEmail: "user10@example.com",
  275. CommitterName: "User Ten",
  276. AuthorEmail: "user10@example.com",
  277. AuthorName: "User Ten",
  278. Message: "close user3/repo3#1",
  279. },
  280. }
  281. repo := AssertExistsAndLoadBean(t, &Repository{ID: 6}).(*Repository)
  282. commentBean := &Comment{
  283. Type: CommentTypeCommitRef,
  284. CommitSHA: "abcdef3",
  285. PosterID: user.ID,
  286. IssueID: 6,
  287. }
  288. issueBean := &Issue{RepoID: 3, Index: 1, ID: 6}
  289. AssertNotExistsBean(t, commentBean)
  290. AssertNotExistsBean(t, issueBean, "is_closed=1")
  291. assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch))
  292. AssertNotExistsBean(t, commentBean)
  293. AssertNotExistsBean(t, issueBean, "is_closed=1")
  294. CheckConsistencyFor(t, &Action{})
  295. }
  296. func TestGetFeeds(t *testing.T) {
  297. // test with an individual user
  298. assert.NoError(t, PrepareTestDatabase())
  299. user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  300. actions, err := GetFeeds(GetFeedsOptions{
  301. RequestedUser: user,
  302. RequestingUserID: user.ID,
  303. IncludePrivate: true,
  304. OnlyPerformedBy: false,
  305. IncludeDeleted: true,
  306. })
  307. assert.NoError(t, err)
  308. if assert.Len(t, actions, 1) {
  309. assert.EqualValues(t, 1, actions[0].ID)
  310. assert.EqualValues(t, user.ID, actions[0].UserID)
  311. }
  312. actions, err = GetFeeds(GetFeedsOptions{
  313. RequestedUser: user,
  314. RequestingUserID: user.ID,
  315. IncludePrivate: false,
  316. OnlyPerformedBy: false,
  317. })
  318. assert.NoError(t, err)
  319. assert.Len(t, actions, 0)
  320. }
  321. func TestGetFeeds2(t *testing.T) {
  322. // test with an organization user
  323. assert.NoError(t, PrepareTestDatabase())
  324. org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
  325. const userID = 2 // user2 is an owner of the organization
  326. actions, err := GetFeeds(GetFeedsOptions{
  327. RequestedUser: org,
  328. RequestingUserID: userID,
  329. IncludePrivate: true,
  330. OnlyPerformedBy: false,
  331. IncludeDeleted: true,
  332. })
  333. assert.NoError(t, err)
  334. assert.Len(t, actions, 1)
  335. if assert.Len(t, actions, 1) {
  336. assert.EqualValues(t, 2, actions[0].ID)
  337. assert.EqualValues(t, org.ID, actions[0].UserID)
  338. }
  339. actions, err = GetFeeds(GetFeedsOptions{
  340. RequestedUser: org,
  341. RequestingUserID: userID,
  342. IncludePrivate: false,
  343. OnlyPerformedBy: false,
  344. IncludeDeleted: true,
  345. })
  346. assert.NoError(t, err)
  347. assert.Len(t, actions, 0)
  348. }