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.

api_issue_test.go 8.8KB

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