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.

issue_label_test.go 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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 models
  5. import (
  6. "html/template"
  7. "testing"
  8. "code.gitea.io/gitea/models/db"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. // TODO TestGetLabelTemplateFile
  12. func TestLabel_CalOpenIssues(t *testing.T) {
  13. assert.NoError(t, db.PrepareTestDatabase())
  14. label := db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  15. label.CalOpenIssues()
  16. assert.EqualValues(t, 2, label.NumOpenIssues)
  17. }
  18. func TestLabel_ForegroundColor(t *testing.T) {
  19. assert.NoError(t, db.PrepareTestDatabase())
  20. label := db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  21. assert.Equal(t, template.CSS("#000"), label.ForegroundColor())
  22. label = db.AssertExistsAndLoadBean(t, &Label{ID: 2}).(*Label)
  23. assert.Equal(t, template.CSS("#fff"), label.ForegroundColor())
  24. }
  25. func TestNewLabels(t *testing.T) {
  26. assert.NoError(t, db.PrepareTestDatabase())
  27. labels := []*Label{
  28. {RepoID: 2, Name: "labelName2", Color: "#123456"},
  29. {RepoID: 3, Name: "labelName3", Color: "#23456F"},
  30. }
  31. assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: ""}))
  32. assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "123456"}))
  33. assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#12345G"}))
  34. for _, label := range labels {
  35. db.AssertNotExistsBean(t, label)
  36. }
  37. assert.NoError(t, NewLabels(labels...))
  38. for _, label := range labels {
  39. db.AssertExistsAndLoadBean(t, label, db.Cond("id = ?", label.ID))
  40. }
  41. CheckConsistencyFor(t, &Label{}, &Repository{})
  42. }
  43. func TestGetLabelByID(t *testing.T) {
  44. assert.NoError(t, db.PrepareTestDatabase())
  45. label, err := GetLabelByID(1)
  46. assert.NoError(t, err)
  47. assert.EqualValues(t, 1, label.ID)
  48. _, err = GetLabelByID(db.NonexistentID)
  49. assert.True(t, IsErrLabelNotExist(err))
  50. }
  51. func TestGetLabelInRepoByName(t *testing.T) {
  52. assert.NoError(t, db.PrepareTestDatabase())
  53. label, err := GetLabelInRepoByName(1, "label1")
  54. assert.NoError(t, err)
  55. assert.EqualValues(t, 1, label.ID)
  56. assert.Equal(t, "label1", label.Name)
  57. _, err = GetLabelInRepoByName(1, "")
  58. assert.True(t, IsErrRepoLabelNotExist(err))
  59. _, err = GetLabelInRepoByName(db.NonexistentID, "nonexistent")
  60. assert.True(t, IsErrRepoLabelNotExist(err))
  61. }
  62. func TestGetLabelInRepoByNames(t *testing.T) {
  63. assert.NoError(t, db.PrepareTestDatabase())
  64. labelIDs, err := GetLabelIDsInRepoByNames(1, []string{"label1", "label2"})
  65. assert.NoError(t, err)
  66. assert.Len(t, labelIDs, 2)
  67. assert.Equal(t, int64(1), labelIDs[0])
  68. assert.Equal(t, int64(2), labelIDs[1])
  69. }
  70. func TestGetLabelInRepoByNamesDiscardsNonExistentLabels(t *testing.T) {
  71. assert.NoError(t, db.PrepareTestDatabase())
  72. // label3 doesn't exists.. See labels.yml
  73. labelIDs, err := GetLabelIDsInRepoByNames(1, []string{"label1", "label2", "label3"})
  74. assert.NoError(t, err)
  75. assert.Len(t, labelIDs, 2)
  76. assert.Equal(t, int64(1), labelIDs[0])
  77. assert.Equal(t, int64(2), labelIDs[1])
  78. assert.NoError(t, err)
  79. }
  80. func TestGetLabelInRepoByID(t *testing.T) {
  81. assert.NoError(t, db.PrepareTestDatabase())
  82. label, err := GetLabelInRepoByID(1, 1)
  83. assert.NoError(t, err)
  84. assert.EqualValues(t, 1, label.ID)
  85. _, err = GetLabelInRepoByID(1, -1)
  86. assert.True(t, IsErrRepoLabelNotExist(err))
  87. _, err = GetLabelInRepoByID(db.NonexistentID, db.NonexistentID)
  88. assert.True(t, IsErrRepoLabelNotExist(err))
  89. }
  90. func TestGetLabelsInRepoByIDs(t *testing.T) {
  91. assert.NoError(t, db.PrepareTestDatabase())
  92. labels, err := GetLabelsInRepoByIDs(1, []int64{1, 2, db.NonexistentID})
  93. assert.NoError(t, err)
  94. if assert.Len(t, labels, 2) {
  95. assert.EqualValues(t, 1, labels[0].ID)
  96. assert.EqualValues(t, 2, labels[1].ID)
  97. }
  98. }
  99. func TestGetLabelsByRepoID(t *testing.T) {
  100. assert.NoError(t, db.PrepareTestDatabase())
  101. testSuccess := func(repoID int64, sortType string, expectedIssueIDs []int64) {
  102. labels, err := GetLabelsByRepoID(repoID, sortType, db.ListOptions{})
  103. assert.NoError(t, err)
  104. assert.Len(t, labels, len(expectedIssueIDs))
  105. for i, label := range labels {
  106. assert.EqualValues(t, expectedIssueIDs[i], label.ID)
  107. }
  108. }
  109. testSuccess(1, "leastissues", []int64{2, 1})
  110. testSuccess(1, "mostissues", []int64{1, 2})
  111. testSuccess(1, "reversealphabetically", []int64{2, 1})
  112. testSuccess(1, "default", []int64{1, 2})
  113. }
  114. // Org versions
  115. func TestGetLabelInOrgByName(t *testing.T) {
  116. assert.NoError(t, db.PrepareTestDatabase())
  117. label, err := GetLabelInOrgByName(3, "orglabel3")
  118. assert.NoError(t, err)
  119. assert.EqualValues(t, 3, label.ID)
  120. assert.Equal(t, "orglabel3", label.Name)
  121. _, err = GetLabelInOrgByName(3, "")
  122. assert.True(t, IsErrOrgLabelNotExist(err))
  123. _, err = GetLabelInOrgByName(0, "orglabel3")
  124. assert.True(t, IsErrOrgLabelNotExist(err))
  125. _, err = GetLabelInOrgByName(-1, "orglabel3")
  126. assert.True(t, IsErrOrgLabelNotExist(err))
  127. _, err = GetLabelInOrgByName(db.NonexistentID, "nonexistent")
  128. assert.True(t, IsErrOrgLabelNotExist(err))
  129. }
  130. func TestGetLabelInOrgByNames(t *testing.T) {
  131. assert.NoError(t, db.PrepareTestDatabase())
  132. labelIDs, err := GetLabelIDsInOrgByNames(3, []string{"orglabel3", "orglabel4"})
  133. assert.NoError(t, err)
  134. assert.Len(t, labelIDs, 2)
  135. assert.Equal(t, int64(3), labelIDs[0])
  136. assert.Equal(t, int64(4), labelIDs[1])
  137. }
  138. func TestGetLabelInOrgByNamesDiscardsNonExistentLabels(t *testing.T) {
  139. assert.NoError(t, db.PrepareTestDatabase())
  140. // orglabel99 doesn't exists.. See labels.yml
  141. labelIDs, err := GetLabelIDsInOrgByNames(3, []string{"orglabel3", "orglabel4", "orglabel99"})
  142. assert.NoError(t, err)
  143. assert.Len(t, labelIDs, 2)
  144. assert.Equal(t, int64(3), labelIDs[0])
  145. assert.Equal(t, int64(4), labelIDs[1])
  146. assert.NoError(t, err)
  147. }
  148. func TestGetLabelInOrgByID(t *testing.T) {
  149. assert.NoError(t, db.PrepareTestDatabase())
  150. label, err := GetLabelInOrgByID(3, 3)
  151. assert.NoError(t, err)
  152. assert.EqualValues(t, 3, label.ID)
  153. _, err = GetLabelInOrgByID(3, -1)
  154. assert.True(t, IsErrOrgLabelNotExist(err))
  155. _, err = GetLabelInOrgByID(0, 3)
  156. assert.True(t, IsErrOrgLabelNotExist(err))
  157. _, err = GetLabelInOrgByID(-1, 3)
  158. assert.True(t, IsErrOrgLabelNotExist(err))
  159. _, err = GetLabelInOrgByID(db.NonexistentID, db.NonexistentID)
  160. assert.True(t, IsErrOrgLabelNotExist(err))
  161. }
  162. func TestGetLabelsInOrgByIDs(t *testing.T) {
  163. assert.NoError(t, db.PrepareTestDatabase())
  164. labels, err := GetLabelsInOrgByIDs(3, []int64{3, 4, db.NonexistentID})
  165. assert.NoError(t, err)
  166. if assert.Len(t, labels, 2) {
  167. assert.EqualValues(t, 3, labels[0].ID)
  168. assert.EqualValues(t, 4, labels[1].ID)
  169. }
  170. }
  171. func TestGetLabelsByOrgID(t *testing.T) {
  172. assert.NoError(t, db.PrepareTestDatabase())
  173. testSuccess := func(orgID int64, sortType string, expectedIssueIDs []int64) {
  174. labels, err := GetLabelsByOrgID(orgID, sortType, db.ListOptions{})
  175. assert.NoError(t, err)
  176. assert.Len(t, labels, len(expectedIssueIDs))
  177. for i, label := range labels {
  178. assert.EqualValues(t, expectedIssueIDs[i], label.ID)
  179. }
  180. }
  181. testSuccess(3, "leastissues", []int64{3, 4})
  182. testSuccess(3, "mostissues", []int64{4, 3})
  183. testSuccess(3, "reversealphabetically", []int64{4, 3})
  184. testSuccess(3, "default", []int64{3, 4})
  185. var err error
  186. _, err = GetLabelsByOrgID(0, "leastissues", db.ListOptions{})
  187. assert.True(t, IsErrOrgLabelNotExist(err))
  188. _, err = GetLabelsByOrgID(-1, "leastissues", db.ListOptions{})
  189. assert.True(t, IsErrOrgLabelNotExist(err))
  190. }
  191. //
  192. func TestGetLabelsByIssueID(t *testing.T) {
  193. assert.NoError(t, db.PrepareTestDatabase())
  194. labels, err := GetLabelsByIssueID(1)
  195. assert.NoError(t, err)
  196. if assert.Len(t, labels, 1) {
  197. assert.EqualValues(t, 1, labels[0].ID)
  198. }
  199. labels, err = GetLabelsByIssueID(db.NonexistentID)
  200. assert.NoError(t, err)
  201. assert.Len(t, labels, 0)
  202. }
  203. func TestUpdateLabel(t *testing.T) {
  204. assert.NoError(t, db.PrepareTestDatabase())
  205. label := db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  206. // make sure update wont overwrite it
  207. update := &Label{
  208. ID: label.ID,
  209. Color: "#ffff00",
  210. Name: "newLabelName",
  211. Description: label.Description,
  212. }
  213. label.Color = update.Color
  214. label.Name = update.Name
  215. assert.NoError(t, UpdateLabel(update))
  216. newLabel := db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  217. assert.EqualValues(t, label.ID, newLabel.ID)
  218. assert.EqualValues(t, label.Color, newLabel.Color)
  219. assert.EqualValues(t, label.Name, newLabel.Name)
  220. assert.EqualValues(t, label.Description, newLabel.Description)
  221. CheckConsistencyFor(t, &Label{}, &Repository{})
  222. }
  223. func TestDeleteLabel(t *testing.T) {
  224. assert.NoError(t, db.PrepareTestDatabase())
  225. label := db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  226. assert.NoError(t, DeleteLabel(label.RepoID, label.ID))
  227. db.AssertNotExistsBean(t, &Label{ID: label.ID, RepoID: label.RepoID})
  228. assert.NoError(t, DeleteLabel(label.RepoID, label.ID))
  229. db.AssertNotExistsBean(t, &Label{ID: label.ID})
  230. assert.NoError(t, DeleteLabel(db.NonexistentID, db.NonexistentID))
  231. CheckConsistencyFor(t, &Label{}, &Repository{})
  232. }
  233. func TestHasIssueLabel(t *testing.T) {
  234. assert.NoError(t, db.PrepareTestDatabase())
  235. assert.True(t, HasIssueLabel(1, 1))
  236. assert.False(t, HasIssueLabel(1, 2))
  237. assert.False(t, HasIssueLabel(db.NonexistentID, db.NonexistentID))
  238. }
  239. func TestNewIssueLabel(t *testing.T) {
  240. assert.NoError(t, db.PrepareTestDatabase())
  241. label := db.AssertExistsAndLoadBean(t, &Label{ID: 2}).(*Label)
  242. issue := db.AssertExistsAndLoadBean(t, &Issue{ID: 1}).(*Issue)
  243. doer := db.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  244. // add new IssueLabel
  245. prevNumIssues := label.NumIssues
  246. assert.NoError(t, NewIssueLabel(issue, label, doer))
  247. db.AssertExistsAndLoadBean(t, &IssueLabel{IssueID: issue.ID, LabelID: label.ID})
  248. db.AssertExistsAndLoadBean(t, &Comment{
  249. Type: CommentTypeLabel,
  250. PosterID: doer.ID,
  251. IssueID: issue.ID,
  252. LabelID: label.ID,
  253. Content: "1",
  254. })
  255. label = db.AssertExistsAndLoadBean(t, &Label{ID: 2}).(*Label)
  256. assert.EqualValues(t, prevNumIssues+1, label.NumIssues)
  257. // re-add existing IssueLabel
  258. assert.NoError(t, NewIssueLabel(issue, label, doer))
  259. CheckConsistencyFor(t, &Issue{}, &Label{})
  260. }
  261. func TestNewIssueLabels(t *testing.T) {
  262. assert.NoError(t, db.PrepareTestDatabase())
  263. label1 := db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  264. label2 := db.AssertExistsAndLoadBean(t, &Label{ID: 2}).(*Label)
  265. issue := db.AssertExistsAndLoadBean(t, &Issue{ID: 5}).(*Issue)
  266. doer := db.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  267. assert.NoError(t, NewIssueLabels(issue, []*Label{label1, label2}, doer))
  268. db.AssertExistsAndLoadBean(t, &IssueLabel{IssueID: issue.ID, LabelID: label1.ID})
  269. db.AssertExistsAndLoadBean(t, &Comment{
  270. Type: CommentTypeLabel,
  271. PosterID: doer.ID,
  272. IssueID: issue.ID,
  273. LabelID: label1.ID,
  274. Content: "1",
  275. })
  276. db.AssertExistsAndLoadBean(t, &IssueLabel{IssueID: issue.ID, LabelID: label1.ID})
  277. label1 = db.AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
  278. assert.EqualValues(t, 3, label1.NumIssues)
  279. assert.EqualValues(t, 1, label1.NumClosedIssues)
  280. label2 = db.AssertExistsAndLoadBean(t, &Label{ID: 2}).(*Label)
  281. assert.EqualValues(t, 1, label2.NumIssues)
  282. assert.EqualValues(t, 1, label2.NumClosedIssues)
  283. // corner case: test empty slice
  284. assert.NoError(t, NewIssueLabels(issue, []*Label{}, doer))
  285. CheckConsistencyFor(t, &Issue{}, &Label{})
  286. }
  287. func TestDeleteIssueLabel(t *testing.T) {
  288. assert.NoError(t, db.PrepareTestDatabase())
  289. testSuccess := func(labelID, issueID, doerID int64) {
  290. label := db.AssertExistsAndLoadBean(t, &Label{ID: labelID}).(*Label)
  291. issue := db.AssertExistsAndLoadBean(t, &Issue{ID: issueID}).(*Issue)
  292. doer := db.AssertExistsAndLoadBean(t, &User{ID: doerID}).(*User)
  293. expectedNumIssues := label.NumIssues
  294. expectedNumClosedIssues := label.NumClosedIssues
  295. if db.BeanExists(t, &IssueLabel{IssueID: issueID, LabelID: labelID}) {
  296. expectedNumIssues--
  297. if issue.IsClosed {
  298. expectedNumClosedIssues--
  299. }
  300. }
  301. assert.NoError(t, DeleteIssueLabel(issue, label, doer))
  302. db.AssertNotExistsBean(t, &IssueLabel{IssueID: issueID, LabelID: labelID})
  303. db.AssertExistsAndLoadBean(t, &Comment{
  304. Type: CommentTypeLabel,
  305. PosterID: doerID,
  306. IssueID: issueID,
  307. LabelID: labelID,
  308. }, `content=""`)
  309. label = db.AssertExistsAndLoadBean(t, &Label{ID: labelID}).(*Label)
  310. assert.EqualValues(t, expectedNumIssues, label.NumIssues)
  311. assert.EqualValues(t, expectedNumClosedIssues, label.NumClosedIssues)
  312. }
  313. testSuccess(1, 1, 2)
  314. testSuccess(2, 5, 2)
  315. testSuccess(1, 1, 2) // delete non-existent IssueLabel
  316. CheckConsistencyFor(t, &Issue{}, &Label{})
  317. }