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.

milestone_test.go 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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 issues
  5. import (
  6. "sort"
  7. "testing"
  8. "code.gitea.io/gitea/models/db"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. "code.gitea.io/gitea/models/unittest"
  11. "code.gitea.io/gitea/modules/setting"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "github.com/stretchr/testify/assert"
  14. "xorm.io/builder"
  15. )
  16. func TestMilestone_State(t *testing.T) {
  17. assert.Equal(t, api.StateOpen, (&Milestone{IsClosed: false}).State())
  18. assert.Equal(t, api.StateClosed, (&Milestone{IsClosed: true}).State())
  19. }
  20. func TestGetMilestoneByRepoID(t *testing.T) {
  21. assert.NoError(t, unittest.PrepareTestDatabase())
  22. milestone, err := GetMilestoneByRepoID(db.DefaultContext, 1, 1)
  23. assert.NoError(t, err)
  24. assert.EqualValues(t, 1, milestone.ID)
  25. assert.EqualValues(t, 1, milestone.RepoID)
  26. _, err = GetMilestoneByRepoID(db.DefaultContext, unittest.NonexistentID, unittest.NonexistentID)
  27. assert.True(t, IsErrMilestoneNotExist(err))
  28. }
  29. func TestGetMilestonesByRepoID(t *testing.T) {
  30. assert.NoError(t, unittest.PrepareTestDatabase())
  31. test := func(repoID int64, state api.StateType) {
  32. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  33. milestones, _, err := GetMilestones(GetMilestonesOption{
  34. RepoID: repo.ID,
  35. State: state,
  36. })
  37. assert.NoError(t, err)
  38. var n int
  39. switch state {
  40. case api.StateClosed:
  41. n = repo.NumClosedMilestones
  42. case api.StateAll:
  43. n = repo.NumMilestones
  44. case api.StateOpen:
  45. fallthrough
  46. default:
  47. n = repo.NumOpenMilestones
  48. }
  49. assert.Len(t, milestones, n)
  50. for _, milestone := range milestones {
  51. assert.EqualValues(t, repoID, milestone.RepoID)
  52. }
  53. }
  54. test(1, api.StateOpen)
  55. test(1, api.StateAll)
  56. test(1, api.StateClosed)
  57. test(2, api.StateOpen)
  58. test(2, api.StateAll)
  59. test(2, api.StateClosed)
  60. test(3, api.StateOpen)
  61. test(3, api.StateClosed)
  62. test(3, api.StateAll)
  63. milestones, _, err := GetMilestones(GetMilestonesOption{
  64. RepoID: unittest.NonexistentID,
  65. State: api.StateOpen,
  66. })
  67. assert.NoError(t, err)
  68. assert.Len(t, milestones, 0)
  69. }
  70. func TestGetMilestones(t *testing.T) {
  71. assert.NoError(t, unittest.PrepareTestDatabase())
  72. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  73. test := func(sortType string, sortCond func(*Milestone) int) {
  74. for _, page := range []int{0, 1} {
  75. milestones, _, err := GetMilestones(GetMilestonesOption{
  76. ListOptions: db.ListOptions{
  77. Page: page,
  78. PageSize: setting.UI.IssuePagingNum,
  79. },
  80. RepoID: repo.ID,
  81. State: api.StateOpen,
  82. SortType: sortType,
  83. })
  84. assert.NoError(t, err)
  85. assert.Len(t, milestones, repo.NumMilestones-repo.NumClosedMilestones)
  86. values := make([]int, len(milestones))
  87. for i, milestone := range milestones {
  88. values[i] = sortCond(milestone)
  89. }
  90. assert.True(t, sort.IntsAreSorted(values))
  91. milestones, _, err = GetMilestones(GetMilestonesOption{
  92. ListOptions: db.ListOptions{
  93. Page: page,
  94. PageSize: setting.UI.IssuePagingNum,
  95. },
  96. RepoID: repo.ID,
  97. State: api.StateClosed,
  98. Name: "",
  99. SortType: sortType,
  100. })
  101. assert.NoError(t, err)
  102. assert.Len(t, milestones, repo.NumClosedMilestones)
  103. values = make([]int, len(milestones))
  104. for i, milestone := range milestones {
  105. values[i] = sortCond(milestone)
  106. }
  107. assert.True(t, sort.IntsAreSorted(values))
  108. }
  109. }
  110. test("furthestduedate", func(milestone *Milestone) int {
  111. return -int(milestone.DeadlineUnix)
  112. })
  113. test("leastcomplete", func(milestone *Milestone) int {
  114. return milestone.Completeness
  115. })
  116. test("mostcomplete", func(milestone *Milestone) int {
  117. return -milestone.Completeness
  118. })
  119. test("leastissues", func(milestone *Milestone) int {
  120. return milestone.NumIssues
  121. })
  122. test("mostissues", func(milestone *Milestone) int {
  123. return -milestone.NumIssues
  124. })
  125. test("soonestduedate", func(milestone *Milestone) int {
  126. return int(milestone.DeadlineUnix)
  127. })
  128. }
  129. func TestCountRepoMilestones(t *testing.T) {
  130. assert.NoError(t, unittest.PrepareTestDatabase())
  131. test := func(repoID int64) {
  132. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  133. count, err := countRepoMilestones(db.GetEngine(db.DefaultContext), repoID)
  134. assert.NoError(t, err)
  135. assert.EqualValues(t, repo.NumMilestones, count)
  136. }
  137. test(1)
  138. test(2)
  139. test(3)
  140. count, err := countRepoMilestones(db.GetEngine(db.DefaultContext), unittest.NonexistentID)
  141. assert.NoError(t, err)
  142. assert.EqualValues(t, 0, count)
  143. }
  144. func TestCountRepoClosedMilestones(t *testing.T) {
  145. assert.NoError(t, unittest.PrepareTestDatabase())
  146. test := func(repoID int64) {
  147. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  148. count, err := CountRepoClosedMilestones(repoID)
  149. assert.NoError(t, err)
  150. assert.EqualValues(t, repo.NumClosedMilestones, count)
  151. }
  152. test(1)
  153. test(2)
  154. test(3)
  155. count, err := CountRepoClosedMilestones(unittest.NonexistentID)
  156. assert.NoError(t, err)
  157. assert.EqualValues(t, 0, count)
  158. }
  159. func TestCountMilestonesByRepoIDs(t *testing.T) {
  160. assert.NoError(t, unittest.PrepareTestDatabase())
  161. milestonesCount := func(repoID int64) (int, int) {
  162. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  163. return repo.NumOpenMilestones, repo.NumClosedMilestones
  164. }
  165. repo1OpenCount, repo1ClosedCount := milestonesCount(1)
  166. repo2OpenCount, repo2ClosedCount := milestonesCount(2)
  167. openCounts, err := CountMilestonesByRepoCond(builder.In("repo_id", []int64{1, 2}), false)
  168. assert.NoError(t, err)
  169. assert.EqualValues(t, repo1OpenCount, openCounts[1])
  170. assert.EqualValues(t, repo2OpenCount, openCounts[2])
  171. closedCounts, err := CountMilestonesByRepoCond(builder.In("repo_id", []int64{1, 2}), true)
  172. assert.NoError(t, err)
  173. assert.EqualValues(t, repo1ClosedCount, closedCounts[1])
  174. assert.EqualValues(t, repo2ClosedCount, closedCounts[2])
  175. }
  176. func TestGetMilestonesByRepoIDs(t *testing.T) {
  177. assert.NoError(t, unittest.PrepareTestDatabase())
  178. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  179. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
  180. test := func(sortType string, sortCond func(*Milestone) int) {
  181. for _, page := range []int{0, 1} {
  182. openMilestones, err := GetMilestonesByRepoIDs([]int64{repo1.ID, repo2.ID}, page, false, sortType)
  183. assert.NoError(t, err)
  184. assert.Len(t, openMilestones, repo1.NumOpenMilestones+repo2.NumOpenMilestones)
  185. values := make([]int, len(openMilestones))
  186. for i, milestone := range openMilestones {
  187. values[i] = sortCond(milestone)
  188. }
  189. assert.True(t, sort.IntsAreSorted(values))
  190. closedMilestones, err := GetMilestonesByRepoIDs([]int64{repo1.ID, repo2.ID}, page, true, sortType)
  191. assert.NoError(t, err)
  192. assert.Len(t, closedMilestones, repo1.NumClosedMilestones+repo2.NumClosedMilestones)
  193. values = make([]int, len(closedMilestones))
  194. for i, milestone := range closedMilestones {
  195. values[i] = sortCond(milestone)
  196. }
  197. assert.True(t, sort.IntsAreSorted(values))
  198. }
  199. }
  200. test("furthestduedate", func(milestone *Milestone) int {
  201. return -int(milestone.DeadlineUnix)
  202. })
  203. test("leastcomplete", func(milestone *Milestone) int {
  204. return milestone.Completeness
  205. })
  206. test("mostcomplete", func(milestone *Milestone) int {
  207. return -milestone.Completeness
  208. })
  209. test("leastissues", func(milestone *Milestone) int {
  210. return milestone.NumIssues
  211. })
  212. test("mostissues", func(milestone *Milestone) int {
  213. return -milestone.NumIssues
  214. })
  215. test("soonestduedate", func(milestone *Milestone) int {
  216. return int(milestone.DeadlineUnix)
  217. })
  218. }
  219. func TestGetMilestonesStats(t *testing.T) {
  220. assert.NoError(t, unittest.PrepareTestDatabase())
  221. test := func(repoID int64) {
  222. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  223. stats, err := GetMilestonesStatsByRepoCond(builder.And(builder.Eq{"repo_id": repoID}))
  224. assert.NoError(t, err)
  225. assert.EqualValues(t, repo.NumMilestones-repo.NumClosedMilestones, stats.OpenCount)
  226. assert.EqualValues(t, repo.NumClosedMilestones, stats.ClosedCount)
  227. }
  228. test(1)
  229. test(2)
  230. test(3)
  231. stats, err := GetMilestonesStatsByRepoCond(builder.And(builder.Eq{"repo_id": unittest.NonexistentID}))
  232. assert.NoError(t, err)
  233. assert.EqualValues(t, 0, stats.OpenCount)
  234. assert.EqualValues(t, 0, stats.ClosedCount)
  235. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  236. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
  237. milestoneStats, err := GetMilestonesStatsByRepoCond(builder.In("repo_id", []int64{repo1.ID, repo2.ID}))
  238. assert.NoError(t, err)
  239. assert.EqualValues(t, repo1.NumOpenMilestones+repo2.NumOpenMilestones, milestoneStats.OpenCount)
  240. assert.EqualValues(t, repo1.NumClosedMilestones+repo2.NumClosedMilestones, milestoneStats.ClosedCount)
  241. }