Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package integrations
  5. import (
  6. "fmt"
  7. "net/http"
  8. "net/url"
  9. "testing"
  10. "code.gitea.io/gitea/models"
  11. api "code.gitea.io/gitea/modules/structs"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func TestAPIListIssues(t *testing.T) {
  15. defer prepareTestEnv(t)()
  16. repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  17. owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
  18. session := loginUser(t, owner.Name)
  19. token := getTokenForLoggedInUser(t, session)
  20. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues?state=all&token=%s",
  21. owner.Name, repo.Name, token)
  22. resp := session.MakeRequest(t, req, http.StatusOK)
  23. var apiIssues []*api.Issue
  24. DecodeJSON(t, resp, &apiIssues)
  25. assert.Len(t, apiIssues, models.GetCount(t, &models.Issue{RepoID: repo.ID}))
  26. for _, apiIssue := range apiIssues {
  27. models.AssertExistsAndLoadBean(t, &models.Issue{ID: apiIssue.ID, RepoID: repo.ID})
  28. }
  29. // test milestone filter
  30. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues?state=all&type=all&milestones=ignore,milestone1,3,4&token=%s",
  31. owner.Name, repo.Name, token)
  32. resp = session.MakeRequest(t, req, http.StatusOK)
  33. DecodeJSON(t, resp, &apiIssues)
  34. if assert.Len(t, apiIssues, 2) {
  35. assert.EqualValues(t, 3, apiIssues[0].Milestone.ID)
  36. assert.EqualValues(t, 1, apiIssues[1].Milestone.ID)
  37. }
  38. }
  39. func TestAPICreateIssue(t *testing.T) {
  40. defer prepareTestEnv(t)()
  41. const body, title = "apiTestBody", "apiTestTitle"
  42. repoBefore := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  43. owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repoBefore.OwnerID}).(*models.User)
  44. session := loginUser(t, owner.Name)
  45. token := getTokenForLoggedInUser(t, session)
  46. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues?state=all&token=%s", owner.Name, repoBefore.Name, token)
  47. req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateIssueOption{
  48. Body: body,
  49. Title: title,
  50. Assignee: owner.Name,
  51. })
  52. resp := session.MakeRequest(t, req, http.StatusCreated)
  53. var apiIssue api.Issue
  54. DecodeJSON(t, resp, &apiIssue)
  55. assert.Equal(t, apiIssue.Body, body)
  56. assert.Equal(t, apiIssue.Title, title)
  57. models.AssertExistsAndLoadBean(t, &models.Issue{
  58. RepoID: repoBefore.ID,
  59. AssigneeID: owner.ID,
  60. Content: body,
  61. Title: title,
  62. })
  63. repoAfter := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  64. assert.Equal(t, repoBefore.NumIssues+1, repoAfter.NumIssues)
  65. assert.Equal(t, repoBefore.NumClosedIssues, repoAfter.NumClosedIssues)
  66. }
  67. func TestAPIEditIssue(t *testing.T) {
  68. defer prepareTestEnv(t)()
  69. issueBefore := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 10}).(*models.Issue)
  70. repoBefore := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issueBefore.RepoID}).(*models.Repository)
  71. owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repoBefore.OwnerID}).(*models.User)
  72. assert.NoError(t, issueBefore.LoadAttributes())
  73. assert.Equal(t, int64(1019307200), int64(issueBefore.DeadlineUnix))
  74. assert.Equal(t, api.StateOpen, issueBefore.State())
  75. session := loginUser(t, owner.Name)
  76. token := getTokenForLoggedInUser(t, session)
  77. // update values of issue
  78. issueState := "closed"
  79. removeDeadline := true
  80. milestone := int64(4)
  81. body := "new content!"
  82. title := "new title from api set"
  83. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d?token=%s", owner.Name, repoBefore.Name, issueBefore.Index, token)
  84. req := NewRequestWithJSON(t, "PATCH", urlStr, api.EditIssueOption{
  85. State: &issueState,
  86. RemoveDeadline: &removeDeadline,
  87. Milestone: &milestone,
  88. Body: &body,
  89. Title: title,
  90. // ToDo change more
  91. })
  92. resp := session.MakeRequest(t, req, http.StatusCreated)
  93. var apiIssue api.Issue
  94. DecodeJSON(t, resp, &apiIssue)
  95. issueAfter := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 10}).(*models.Issue)
  96. repoAfter := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issueBefore.RepoID}).(*models.Repository)
  97. // check deleted user
  98. assert.Equal(t, int64(500), issueAfter.PosterID)
  99. assert.NoError(t, issueAfter.LoadAttributes())
  100. assert.Equal(t, int64(-1), issueAfter.PosterID)
  101. assert.Equal(t, int64(-1), issueBefore.PosterID)
  102. assert.Equal(t, int64(-1), apiIssue.Poster.ID)
  103. // check repo change
  104. assert.Equal(t, repoBefore.NumClosedIssues+1, repoAfter.NumClosedIssues)
  105. // API response
  106. assert.Equal(t, api.StateClosed, apiIssue.State)
  107. assert.Equal(t, milestone, apiIssue.Milestone.ID)
  108. assert.Equal(t, body, apiIssue.Body)
  109. assert.True(t, apiIssue.Deadline == nil)
  110. assert.Equal(t, title, apiIssue.Title)
  111. // in database
  112. assert.Equal(t, api.StateClosed, issueAfter.State())
  113. assert.Equal(t, milestone, issueAfter.MilestoneID)
  114. assert.Equal(t, int64(0), int64(issueAfter.DeadlineUnix))
  115. assert.Equal(t, body, issueAfter.Content)
  116. assert.Equal(t, title, issueAfter.Title)
  117. }
  118. func TestAPISearchIssues(t *testing.T) {
  119. defer prepareTestEnv(t)()
  120. session := loginUser(t, "user2")
  121. token := getTokenForLoggedInUser(t, session)
  122. link, _ := url.Parse("/api/v1/repos/issues/search")
  123. req := NewRequest(t, "GET", link.String())
  124. resp := session.MakeRequest(t, req, http.StatusOK)
  125. var apiIssues []*api.Issue
  126. DecodeJSON(t, resp, &apiIssues)
  127. assert.Len(t, apiIssues, 9)
  128. query := url.Values{}
  129. query.Add("token", token)
  130. link.RawQuery = query.Encode()
  131. req = NewRequest(t, "GET", link.String())
  132. resp = session.MakeRequest(t, req, http.StatusOK)
  133. DecodeJSON(t, resp, &apiIssues)
  134. assert.Len(t, apiIssues, 9)
  135. query.Add("state", "closed")
  136. link.RawQuery = query.Encode()
  137. req = NewRequest(t, "GET", link.String())
  138. resp = session.MakeRequest(t, req, http.StatusOK)
  139. DecodeJSON(t, resp, &apiIssues)
  140. assert.Len(t, apiIssues, 2)
  141. query.Set("state", "all")
  142. link.RawQuery = query.Encode()
  143. req = NewRequest(t, "GET", link.String())
  144. resp = session.MakeRequest(t, req, http.StatusOK)
  145. DecodeJSON(t, resp, &apiIssues)
  146. assert.Len(t, apiIssues, 10) //there are more but 10 is page item limit
  147. query.Add("page", "2")
  148. link.RawQuery = query.Encode()
  149. req = NewRequest(t, "GET", link.String())
  150. resp = session.MakeRequest(t, req, http.StatusOK)
  151. DecodeJSON(t, resp, &apiIssues)
  152. assert.Len(t, apiIssues, 1)
  153. }
  154. func TestAPISearchIssuesWithLabels(t *testing.T) {
  155. defer prepareTestEnv(t)()
  156. session := loginUser(t, "user1")
  157. token := getTokenForLoggedInUser(t, session)
  158. link, _ := url.Parse("/api/v1/repos/issues/search")
  159. req := NewRequest(t, "GET", link.String())
  160. resp := session.MakeRequest(t, req, http.StatusOK)
  161. var apiIssues []*api.Issue
  162. DecodeJSON(t, resp, &apiIssues)
  163. assert.Len(t, apiIssues, 9)
  164. query := url.Values{}
  165. query.Add("token", token)
  166. link.RawQuery = query.Encode()
  167. req = NewRequest(t, "GET", link.String())
  168. resp = session.MakeRequest(t, req, http.StatusOK)
  169. DecodeJSON(t, resp, &apiIssues)
  170. assert.Len(t, apiIssues, 9)
  171. query.Add("labels", "label1")
  172. link.RawQuery = query.Encode()
  173. req = NewRequest(t, "GET", link.String())
  174. resp = session.MakeRequest(t, req, http.StatusOK)
  175. DecodeJSON(t, resp, &apiIssues)
  176. assert.Len(t, apiIssues, 2)
  177. // multiple labels
  178. query.Set("labels", "label1,label2")
  179. link.RawQuery = query.Encode()
  180. req = NewRequest(t, "GET", link.String())
  181. resp = session.MakeRequest(t, req, http.StatusOK)
  182. DecodeJSON(t, resp, &apiIssues)
  183. assert.Len(t, apiIssues, 2)
  184. // an org label
  185. query.Set("labels", "orglabel4")
  186. link.RawQuery = query.Encode()
  187. req = NewRequest(t, "GET", link.String())
  188. resp = session.MakeRequest(t, req, http.StatusOK)
  189. DecodeJSON(t, resp, &apiIssues)
  190. assert.Len(t, apiIssues, 1)
  191. // org and repo label
  192. query.Set("labels", "label2,orglabel4")
  193. query.Add("state", "all")
  194. link.RawQuery = query.Encode()
  195. req = NewRequest(t, "GET", link.String())
  196. resp = session.MakeRequest(t, req, http.StatusOK)
  197. DecodeJSON(t, resp, &apiIssues)
  198. assert.Len(t, apiIssues, 2)
  199. // org and repo label which share the same issue
  200. query.Set("labels", "label1,orglabel4")
  201. link.RawQuery = query.Encode()
  202. req = NewRequest(t, "GET", link.String())
  203. resp = session.MakeRequest(t, req, http.StatusOK)
  204. DecodeJSON(t, resp, &apiIssues)
  205. assert.Len(t, apiIssues, 2)
  206. }