gitea源码

issue_label_test.go 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repo
  4. import (
  5. "net/http"
  6. "strconv"
  7. "strings"
  8. "testing"
  9. issues_model "code.gitea.io/gitea/models/issues"
  10. "code.gitea.io/gitea/models/unittest"
  11. "code.gitea.io/gitea/modules/base"
  12. "code.gitea.io/gitea/modules/repository"
  13. "code.gitea.io/gitea/modules/test"
  14. "code.gitea.io/gitea/modules/web"
  15. "code.gitea.io/gitea/services/contexttest"
  16. "code.gitea.io/gitea/services/forms"
  17. "github.com/stretchr/testify/assert"
  18. )
  19. func TestIssueLabel(t *testing.T) {
  20. unittest.PrepareTestEnv(t)
  21. t.Run("RetrieveLabels", testRetrieveLabels)
  22. t.Run("NewLabel", testNewLabel)
  23. t.Run("NewLabelInvalidColor", testNewLabelInvalidColor)
  24. t.Run("UpdateLabel", testUpdateLabel)
  25. t.Run("UpdateLabelInvalidColor", testUpdateLabelInvalidColor)
  26. t.Run("UpdateIssueLabelClear", testUpdateIssueLabelClear)
  27. t.Run("UpdateIssueLabelToggle", testUpdateIssueLabelToggle)
  28. t.Run("InitializeLabels", testInitializeLabels)
  29. t.Run("DeleteLabel", testDeleteLabel)
  30. }
  31. func testInitializeLabels(t *testing.T) {
  32. assert.NoError(t, repository.LoadRepoConfig())
  33. ctx, _ := contexttest.MockContext(t, "user2/repo1/labels/initialize")
  34. contexttest.LoadUser(t, ctx, 2)
  35. contexttest.LoadRepo(t, ctx, 2)
  36. web.SetForm(ctx, &forms.InitializeLabelsForm{TemplateName: "Default"})
  37. InitializeLabels(ctx)
  38. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  39. unittest.AssertExistsAndLoadBean(t, &issues_model.Label{
  40. RepoID: 2,
  41. Name: "enhancement",
  42. Color: "#84b6eb",
  43. })
  44. assert.Equal(t, "/user2/repo2/labels", test.RedirectURL(ctx.Resp))
  45. }
  46. func testRetrieveLabels(t *testing.T) {
  47. for _, testCase := range []struct {
  48. RepoID int64
  49. Sort string
  50. ExpectedLabelIDs []int64
  51. }{
  52. {1, "", []int64{1, 2}},
  53. {1, "leastissues", []int64{2, 1}},
  54. {2, "", []int64{}},
  55. } {
  56. ctx, _ := contexttest.MockContext(t, "user/repo/issues")
  57. contexttest.LoadUser(t, ctx, 2)
  58. contexttest.LoadRepo(t, ctx, testCase.RepoID)
  59. ctx.Req.Form.Set("sort", testCase.Sort)
  60. RetrieveLabelsForList(ctx)
  61. assert.False(t, ctx.Written())
  62. labels, ok := ctx.Data["Labels"].([]*issues_model.Label)
  63. assert.True(t, ok)
  64. if assert.Len(t, labels, len(testCase.ExpectedLabelIDs)) {
  65. for i, label := range labels {
  66. assert.Equal(t, testCase.ExpectedLabelIDs[i], label.ID)
  67. }
  68. }
  69. }
  70. }
  71. func testNewLabel(t *testing.T) {
  72. ctx, respWriter := contexttest.MockContext(t, "user2/repo1/labels/edit")
  73. contexttest.LoadUser(t, ctx, 2)
  74. contexttest.LoadRepo(t, ctx, 1)
  75. web.SetForm(ctx, &forms.CreateLabelForm{
  76. Title: "newlabel",
  77. Color: "#abcdef",
  78. })
  79. NewLabel(ctx)
  80. assert.Equal(t, http.StatusOK, ctx.Resp.WrittenStatus())
  81. unittest.AssertExistsAndLoadBean(t, &issues_model.Label{
  82. Name: "newlabel",
  83. Color: "#abcdef",
  84. })
  85. assert.Equal(t, "/user2/repo1/labels", test.RedirectURL(respWriter))
  86. }
  87. func testNewLabelInvalidColor(t *testing.T) {
  88. ctx, respWriter := contexttest.MockContext(t, "user2/repo1/labels/edit")
  89. contexttest.LoadUser(t, ctx, 2)
  90. contexttest.LoadRepo(t, ctx, 1)
  91. web.SetForm(ctx, &forms.CreateLabelForm{
  92. Title: "newlabel-x",
  93. Color: "bad-label-code",
  94. })
  95. NewLabel(ctx)
  96. assert.Equal(t, http.StatusBadRequest, ctx.Resp.WrittenStatus())
  97. assert.Equal(t, "repo.issues.label_color_invalid", test.ParseJSONError(respWriter.Body.Bytes()).ErrorMessage)
  98. unittest.AssertNotExistsBean(t, &issues_model.Label{
  99. Name: "newlabel-x",
  100. })
  101. }
  102. func testUpdateLabel(t *testing.T) {
  103. ctx, respWriter := contexttest.MockContext(t, "user2/repo1/labels/edit")
  104. contexttest.LoadUser(t, ctx, 2)
  105. contexttest.LoadRepo(t, ctx, 1)
  106. web.SetForm(ctx, &forms.CreateLabelForm{
  107. ID: 2,
  108. Title: "newnameforlabel",
  109. Color: "#abcdef",
  110. IsArchived: true,
  111. })
  112. UpdateLabel(ctx)
  113. assert.Equal(t, http.StatusOK, ctx.Resp.WrittenStatus())
  114. unittest.AssertExistsAndLoadBean(t, &issues_model.Label{
  115. ID: 2,
  116. Name: "newnameforlabel",
  117. Color: "#abcdef",
  118. })
  119. assert.Equal(t, "/user2/repo1/labels", test.RedirectURL(respWriter))
  120. }
  121. func testUpdateLabelInvalidColor(t *testing.T) {
  122. ctx, respWriter := contexttest.MockContext(t, "user2/repo1/labels/edit")
  123. contexttest.LoadUser(t, ctx, 2)
  124. contexttest.LoadRepo(t, ctx, 1)
  125. web.SetForm(ctx, &forms.CreateLabelForm{
  126. ID: 1,
  127. Title: "label1",
  128. Color: "bad-label-code",
  129. })
  130. UpdateLabel(ctx)
  131. assert.Equal(t, http.StatusBadRequest, ctx.Resp.WrittenStatus())
  132. assert.Equal(t, "repo.issues.label_color_invalid", test.ParseJSONError(respWriter.Body.Bytes()).ErrorMessage)
  133. unittest.AssertExistsAndLoadBean(t, &issues_model.Label{
  134. ID: 1,
  135. Name: "label1",
  136. Color: "#abcdef",
  137. })
  138. }
  139. func testDeleteLabel(t *testing.T) {
  140. ctx, _ := contexttest.MockContext(t, "user2/repo1/labels/delete")
  141. contexttest.LoadUser(t, ctx, 2)
  142. contexttest.LoadRepo(t, ctx, 1)
  143. ctx.Req.Form.Set("id", "2")
  144. DeleteLabel(ctx)
  145. assert.Equal(t, http.StatusOK, ctx.Resp.WrittenStatus())
  146. unittest.AssertNotExistsBean(t, &issues_model.Label{ID: 2})
  147. unittest.AssertNotExistsBean(t, &issues_model.IssueLabel{LabelID: 2})
  148. assert.EqualValues(t, ctx.Tr("repo.issues.label_deletion_success"), ctx.Flash.SuccessMsg)
  149. }
  150. func testUpdateIssueLabelClear(t *testing.T) {
  151. ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
  152. contexttest.LoadUser(t, ctx, 2)
  153. contexttest.LoadRepo(t, ctx, 1)
  154. ctx.Req.Form.Set("issue_ids", "1,3")
  155. ctx.Req.Form.Set("action", "clear")
  156. UpdateIssueLabel(ctx)
  157. assert.Equal(t, http.StatusOK, ctx.Resp.WrittenStatus())
  158. unittest.AssertNotExistsBean(t, &issues_model.IssueLabel{IssueID: 1})
  159. unittest.AssertNotExistsBean(t, &issues_model.IssueLabel{IssueID: 3})
  160. unittest.CheckConsistencyFor(t, &issues_model.Label{})
  161. }
  162. func testUpdateIssueLabelToggle(t *testing.T) {
  163. for _, testCase := range []struct {
  164. Action string
  165. IssueIDs []int64
  166. LabelID int64
  167. ExpectedAdd bool // whether we expect the label to be added to the issues
  168. }{
  169. {"attach", []int64{1, 3}, 1, true},
  170. {"detach", []int64{1, 3}, 1, false},
  171. {"toggle", []int64{1, 3}, 1, false},
  172. {"toggle", []int64{1, 2}, 2, true},
  173. } {
  174. unittest.PrepareTestEnv(t)
  175. ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
  176. contexttest.LoadUser(t, ctx, 2)
  177. contexttest.LoadRepo(t, ctx, 1)
  178. ctx.Req.Form.Set("issue_ids", strings.Join(base.Int64sToStrings(testCase.IssueIDs), ","))
  179. ctx.Req.Form.Set("action", testCase.Action)
  180. ctx.Req.Form.Set("id", strconv.Itoa(int(testCase.LabelID)))
  181. UpdateIssueLabel(ctx)
  182. assert.Equal(t, http.StatusOK, ctx.Resp.WrittenStatus())
  183. for _, issueID := range testCase.IssueIDs {
  184. if testCase.ExpectedAdd {
  185. unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issueID, LabelID: testCase.LabelID})
  186. } else {
  187. unittest.AssertNotExistsBean(t, &issues_model.IssueLabel{IssueID: issueID, LabelID: testCase.LabelID})
  188. }
  189. }
  190. unittest.CheckConsistencyFor(t, &issues_model.Label{})
  191. }
  192. }