Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

api_issue_test.go 11KB

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