gitea源码

api_issue_label_test.go 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "testing"
  9. auth_model "code.gitea.io/gitea/models/auth"
  10. issues_model "code.gitea.io/gitea/models/issues"
  11. repo_model "code.gitea.io/gitea/models/repo"
  12. "code.gitea.io/gitea/models/unittest"
  13. user_model "code.gitea.io/gitea/models/user"
  14. api "code.gitea.io/gitea/modules/structs"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func TestAPIModifyLabels(t *testing.T) {
  18. assert.NoError(t, unittest.LoadFixtures())
  19. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  20. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  21. session := loginUser(t, owner.Name)
  22. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  23. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/labels", owner.Name, repo.Name)
  24. // CreateLabel
  25. req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  26. Name: "TestL 1",
  27. Color: "abcdef",
  28. Description: "test label",
  29. }).AddTokenAuth(token)
  30. resp := MakeRequest(t, req, http.StatusCreated)
  31. apiLabel := new(api.Label)
  32. DecodeJSON(t, resp, &apiLabel)
  33. dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, RepoID: repo.ID})
  34. assert.Equal(t, dbLabel.Name, apiLabel.Name)
  35. assert.Equal(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
  36. req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  37. Name: "TestL 2",
  38. Color: "#123456",
  39. Description: "jet another test label",
  40. }).AddTokenAuth(token)
  41. MakeRequest(t, req, http.StatusCreated)
  42. req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  43. Name: "WrongTestL",
  44. Color: "#12345g",
  45. }).AddTokenAuth(token)
  46. MakeRequest(t, req, http.StatusUnprocessableEntity)
  47. // ListLabels
  48. req = NewRequest(t, "GET", urlStr).
  49. AddTokenAuth(token)
  50. resp = MakeRequest(t, req, http.StatusOK)
  51. var apiLabels []*api.Label
  52. DecodeJSON(t, resp, &apiLabels)
  53. assert.Len(t, apiLabels, 2)
  54. // GetLabel
  55. singleURLStr := fmt.Sprintf("/api/v1/repos/%s/%s/labels/%d", owner.Name, repo.Name, dbLabel.ID)
  56. req = NewRequest(t, "GET", singleURLStr).
  57. AddTokenAuth(token)
  58. resp = MakeRequest(t, req, http.StatusOK)
  59. DecodeJSON(t, resp, &apiLabel)
  60. assert.Equal(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
  61. // EditLabel
  62. newName := "LabelNewName"
  63. newColor := "09876a"
  64. newColorWrong := "09g76a"
  65. req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
  66. Name: &newName,
  67. Color: &newColor,
  68. }).AddTokenAuth(token)
  69. resp = MakeRequest(t, req, http.StatusOK)
  70. DecodeJSON(t, resp, &apiLabel)
  71. assert.Equal(t, newColor, apiLabel.Color)
  72. req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
  73. Color: &newColorWrong,
  74. }).AddTokenAuth(token)
  75. MakeRequest(t, req, http.StatusUnprocessableEntity)
  76. // DeleteLabel
  77. req = NewRequest(t, "DELETE", singleURLStr).
  78. AddTokenAuth(token)
  79. MakeRequest(t, req, http.StatusNoContent)
  80. }
  81. func TestAPIAddIssueLabels(t *testing.T) {
  82. assert.NoError(t, unittest.LoadFixtures())
  83. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  84. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
  85. _ = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID, ID: 2})
  86. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  87. session := loginUser(t, owner.Name)
  88. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  89. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
  90. repo.OwnerName, repo.Name, issue.Index)
  91. req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
  92. Labels: []any{1, 2},
  93. }).AddTokenAuth(token)
  94. resp := MakeRequest(t, req, http.StatusOK)
  95. var apiLabels []*api.Label
  96. DecodeJSON(t, resp, &apiLabels)
  97. assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID}))
  98. unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: 2})
  99. }
  100. func TestAPIAddIssueLabelsWithLabelNames(t *testing.T) {
  101. assert.NoError(t, unittest.LoadFixtures())
  102. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  103. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 6, RepoID: repo.ID})
  104. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  105. repoLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 10, RepoID: repo.ID})
  106. orgLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4, OrgID: owner.ID})
  107. user1Session := loginUser(t, "user1")
  108. token := getTokenForLoggedInUser(t, user1Session, auth_model.AccessTokenScopeWriteIssue)
  109. // add the org label and the repo label to the issue
  110. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", owner.Name, repo.Name, issue.Index)
  111. req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
  112. Labels: []any{repoLabel.Name, orgLabel.Name},
  113. }).AddTokenAuth(token)
  114. resp := MakeRequest(t, req, http.StatusOK)
  115. var apiLabels []*api.Label
  116. DecodeJSON(t, resp, &apiLabels)
  117. assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID}))
  118. var apiLabelNames []string
  119. for _, label := range apiLabels {
  120. apiLabelNames = append(apiLabelNames, label.Name)
  121. }
  122. assert.ElementsMatch(t, apiLabelNames, []string{repoLabel.Name, orgLabel.Name})
  123. // delete labels
  124. req = NewRequest(t, "DELETE", urlStr).AddTokenAuth(token)
  125. MakeRequest(t, req, http.StatusNoContent)
  126. }
  127. func TestAPIReplaceIssueLabels(t *testing.T) {
  128. assert.NoError(t, unittest.LoadFixtures())
  129. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  130. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
  131. label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID})
  132. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  133. session := loginUser(t, owner.Name)
  134. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  135. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
  136. owner.Name, repo.Name, issue.Index)
  137. req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
  138. Labels: []any{label.ID},
  139. }).AddTokenAuth(token)
  140. resp := MakeRequest(t, req, http.StatusOK)
  141. var apiLabels []*api.Label
  142. DecodeJSON(t, resp, &apiLabels)
  143. if assert.Len(t, apiLabels, 1) {
  144. assert.Equal(t, label.ID, apiLabels[0].ID)
  145. }
  146. unittest.AssertCount(t, &issues_model.IssueLabel{IssueID: issue.ID}, 1)
  147. unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID})
  148. }
  149. func TestAPIReplaceIssueLabelsWithLabelNames(t *testing.T) {
  150. assert.NoError(t, unittest.LoadFixtures())
  151. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  152. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
  153. label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID})
  154. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  155. session := loginUser(t, owner.Name)
  156. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  157. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
  158. owner.Name, repo.Name, issue.Index)
  159. req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
  160. Labels: []any{label.Name},
  161. }).AddTokenAuth(token)
  162. resp := MakeRequest(t, req, http.StatusOK)
  163. var apiLabels []*api.Label
  164. DecodeJSON(t, resp, &apiLabels)
  165. if assert.Len(t, apiLabels, 1) {
  166. assert.Equal(t, label.Name, apiLabels[0].Name)
  167. }
  168. }
  169. func TestAPIModifyOrgLabels(t *testing.T) {
  170. assert.NoError(t, unittest.LoadFixtures())
  171. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  172. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  173. user := "user1"
  174. session := loginUser(t, user)
  175. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
  176. urlStr := fmt.Sprintf("/api/v1/orgs/%s/labels", owner.Name)
  177. // CreateLabel
  178. req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  179. Name: "TestL 1",
  180. Color: "abcdef",
  181. Description: "test label",
  182. }).AddTokenAuth(token)
  183. resp := MakeRequest(t, req, http.StatusCreated)
  184. apiLabel := new(api.Label)
  185. DecodeJSON(t, resp, &apiLabel)
  186. dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, OrgID: owner.ID})
  187. assert.Equal(t, dbLabel.Name, apiLabel.Name)
  188. assert.Equal(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
  189. req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  190. Name: "TestL 2",
  191. Color: "#123456",
  192. Description: "jet another test label",
  193. }).AddTokenAuth(token)
  194. MakeRequest(t, req, http.StatusCreated)
  195. req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  196. Name: "WrongTestL",
  197. Color: "#12345g",
  198. }).AddTokenAuth(token)
  199. MakeRequest(t, req, http.StatusUnprocessableEntity)
  200. // ListLabels
  201. req = NewRequest(t, "GET", urlStr).
  202. AddTokenAuth(token)
  203. resp = MakeRequest(t, req, http.StatusOK)
  204. var apiLabels []*api.Label
  205. DecodeJSON(t, resp, &apiLabels)
  206. assert.Len(t, apiLabels, 4)
  207. // GetLabel
  208. singleURLStr := fmt.Sprintf("/api/v1/orgs/%s/labels/%d", owner.Name, dbLabel.ID)
  209. req = NewRequest(t, "GET", singleURLStr).
  210. AddTokenAuth(token)
  211. resp = MakeRequest(t, req, http.StatusOK)
  212. DecodeJSON(t, resp, &apiLabel)
  213. assert.Equal(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
  214. // EditLabel
  215. newName := "LabelNewName"
  216. newColor := "09876a"
  217. newColorWrong := "09g76a"
  218. req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
  219. Name: &newName,
  220. Color: &newColor,
  221. }).AddTokenAuth(token)
  222. resp = MakeRequest(t, req, http.StatusOK)
  223. DecodeJSON(t, resp, &apiLabel)
  224. assert.Equal(t, newColor, apiLabel.Color)
  225. req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
  226. Color: &newColorWrong,
  227. }).AddTokenAuth(token)
  228. MakeRequest(t, req, http.StatusUnprocessableEntity)
  229. // DeleteLabel
  230. req = NewRequest(t, "DELETE", singleURLStr).
  231. AddTokenAuth(token)
  232. MakeRequest(t, req, http.StatusNoContent)
  233. }