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_label_test.go 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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.EqualValues(t, dbLabel.Name, apiLabel.Name)
  35. assert.EqualValues(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.EqualValues(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.EqualValues(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: []int64{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 TestAPIReplaceIssueLabels(t *testing.T) {
  101. assert.NoError(t, unittest.LoadFixtures())
  102. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  103. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
  104. label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID})
  105. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  106. session := loginUser(t, owner.Name)
  107. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  108. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
  109. owner.Name, repo.Name, issue.Index)
  110. req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
  111. Labels: []int64{label.ID},
  112. }).AddTokenAuth(token)
  113. resp := MakeRequest(t, req, http.StatusOK)
  114. var apiLabels []*api.Label
  115. DecodeJSON(t, resp, &apiLabels)
  116. if assert.Len(t, apiLabels, 1) {
  117. assert.EqualValues(t, label.ID, apiLabels[0].ID)
  118. }
  119. unittest.AssertCount(t, &issues_model.IssueLabel{IssueID: issue.ID}, 1)
  120. unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID})
  121. }
  122. func TestAPIModifyOrgLabels(t *testing.T) {
  123. assert.NoError(t, unittest.LoadFixtures())
  124. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  125. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  126. user := "user1"
  127. session := loginUser(t, user)
  128. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
  129. urlStr := fmt.Sprintf("/api/v1/orgs/%s/labels", owner.Name)
  130. // CreateLabel
  131. req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  132. Name: "TestL 1",
  133. Color: "abcdef",
  134. Description: "test label",
  135. }).AddTokenAuth(token)
  136. resp := MakeRequest(t, req, http.StatusCreated)
  137. apiLabel := new(api.Label)
  138. DecodeJSON(t, resp, &apiLabel)
  139. dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, OrgID: owner.ID})
  140. assert.EqualValues(t, dbLabel.Name, apiLabel.Name)
  141. assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
  142. req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  143. Name: "TestL 2",
  144. Color: "#123456",
  145. Description: "jet another test label",
  146. }).AddTokenAuth(token)
  147. MakeRequest(t, req, http.StatusCreated)
  148. req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
  149. Name: "WrongTestL",
  150. Color: "#12345g",
  151. }).AddTokenAuth(token)
  152. MakeRequest(t, req, http.StatusUnprocessableEntity)
  153. // ListLabels
  154. req = NewRequest(t, "GET", urlStr).
  155. AddTokenAuth(token)
  156. resp = MakeRequest(t, req, http.StatusOK)
  157. var apiLabels []*api.Label
  158. DecodeJSON(t, resp, &apiLabels)
  159. assert.Len(t, apiLabels, 4)
  160. // GetLabel
  161. singleURLStr := fmt.Sprintf("/api/v1/orgs/%s/labels/%d", owner.Name, dbLabel.ID)
  162. req = NewRequest(t, "GET", singleURLStr).
  163. AddTokenAuth(token)
  164. resp = MakeRequest(t, req, http.StatusOK)
  165. DecodeJSON(t, resp, &apiLabel)
  166. assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
  167. // EditLabel
  168. newName := "LabelNewName"
  169. newColor := "09876a"
  170. newColorWrong := "09g76a"
  171. req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
  172. Name: &newName,
  173. Color: &newColor,
  174. }).AddTokenAuth(token)
  175. resp = MakeRequest(t, req, http.StatusOK)
  176. DecodeJSON(t, resp, &apiLabel)
  177. assert.EqualValues(t, newColor, apiLabel.Color)
  178. req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
  179. Color: &newColorWrong,
  180. }).AddTokenAuth(token)
  181. MakeRequest(t, req, http.StatusUnprocessableEntity)
  182. // DeleteLabel
  183. req = NewRequest(t, "DELETE", singleURLStr).
  184. AddTokenAuth(token)
  185. MakeRequest(t, req, http.StatusNoContent)
  186. }