gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration_test
  4. import (
  5. "testing"
  6. "code.gitea.io/gitea/models/organization"
  7. "code.gitea.io/gitea/models/unittest"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // TestTimesByRepos tests TimesByRepos functionality
  12. func testTimesByRepos(t *testing.T) {
  13. kases := []struct {
  14. name string
  15. unixfrom int64
  16. unixto int64
  17. orgname int64
  18. expected []organization.WorktimeSumByRepos
  19. }{
  20. {
  21. name: "Full sum for org 1",
  22. unixfrom: 0,
  23. unixto: 9223372036854775807,
  24. orgname: 1,
  25. expected: []organization.WorktimeSumByRepos(nil),
  26. },
  27. {
  28. name: "Full sum for org 2",
  29. unixfrom: 0,
  30. unixto: 9223372036854775807,
  31. orgname: 2,
  32. expected: []organization.WorktimeSumByRepos{
  33. {
  34. RepoName: "repo1",
  35. SumTime: 4083,
  36. },
  37. {
  38. RepoName: "repo2",
  39. SumTime: 75,
  40. },
  41. },
  42. },
  43. {
  44. name: "Simple time bound",
  45. unixfrom: 946684801,
  46. unixto: 946684802,
  47. orgname: 2,
  48. expected: []organization.WorktimeSumByRepos{
  49. {
  50. RepoName: "repo1",
  51. SumTime: 3662,
  52. },
  53. },
  54. },
  55. {
  56. name: "Both times inclusive",
  57. unixfrom: 946684801,
  58. unixto: 946684801,
  59. orgname: 2,
  60. expected: []organization.WorktimeSumByRepos{
  61. {
  62. RepoName: "repo1",
  63. SumTime: 3661,
  64. },
  65. },
  66. },
  67. {
  68. name: "Should ignore deleted",
  69. unixfrom: 947688814,
  70. unixto: 947688815,
  71. orgname: 2,
  72. expected: []organization.WorktimeSumByRepos{
  73. {
  74. RepoName: "repo2",
  75. SumTime: 71,
  76. },
  77. },
  78. },
  79. }
  80. // Run test kases
  81. for _, kase := range kases {
  82. t.Run(kase.name, func(t *testing.T) {
  83. org, err := organization.GetOrgByID(t.Context(), kase.orgname)
  84. assert.NoError(t, err)
  85. results, err := organization.GetWorktimeByRepos(t.Context(), org, kase.unixfrom, kase.unixto)
  86. assert.NoError(t, err)
  87. assert.Equal(t, kase.expected, results)
  88. })
  89. }
  90. }
  91. // TestTimesByMilestones tests TimesByMilestones functionality
  92. func testTimesByMilestones(t *testing.T) {
  93. kases := []struct {
  94. name string
  95. unixfrom int64
  96. unixto int64
  97. orgname int64
  98. expected []organization.WorktimeSumByMilestones
  99. }{
  100. {
  101. name: "Full sum for org 1",
  102. unixfrom: 0,
  103. unixto: 9223372036854775807,
  104. orgname: 1,
  105. expected: []organization.WorktimeSumByMilestones(nil),
  106. },
  107. {
  108. name: "Full sum for org 2",
  109. unixfrom: 0,
  110. unixto: 9223372036854775807,
  111. orgname: 2,
  112. expected: []organization.WorktimeSumByMilestones{
  113. {
  114. RepoName: "repo1",
  115. MilestoneName: "",
  116. MilestoneID: 0,
  117. SumTime: 401,
  118. HideRepoName: false,
  119. },
  120. {
  121. RepoName: "repo1",
  122. MilestoneName: "milestone1",
  123. MilestoneID: 1,
  124. SumTime: 3682,
  125. HideRepoName: true,
  126. },
  127. {
  128. RepoName: "repo2",
  129. MilestoneName: "",
  130. MilestoneID: 0,
  131. SumTime: 75,
  132. HideRepoName: false,
  133. },
  134. },
  135. },
  136. {
  137. name: "Simple time bound",
  138. unixfrom: 946684801,
  139. unixto: 946684802,
  140. orgname: 2,
  141. expected: []organization.WorktimeSumByMilestones{
  142. {
  143. RepoName: "repo1",
  144. MilestoneName: "milestone1",
  145. MilestoneID: 1,
  146. SumTime: 3662,
  147. HideRepoName: false,
  148. },
  149. },
  150. },
  151. {
  152. name: "Both times inclusive",
  153. unixfrom: 946684801,
  154. unixto: 946684801,
  155. orgname: 2,
  156. expected: []organization.WorktimeSumByMilestones{
  157. {
  158. RepoName: "repo1",
  159. MilestoneName: "milestone1",
  160. MilestoneID: 1,
  161. SumTime: 3661,
  162. HideRepoName: false,
  163. },
  164. },
  165. },
  166. {
  167. name: "Should ignore deleted",
  168. unixfrom: 947688814,
  169. unixto: 947688815,
  170. orgname: 2,
  171. expected: []organization.WorktimeSumByMilestones{
  172. {
  173. RepoName: "repo2",
  174. MilestoneName: "",
  175. MilestoneID: 0,
  176. SumTime: 71,
  177. HideRepoName: false,
  178. },
  179. },
  180. },
  181. }
  182. // Run test kases
  183. for _, kase := range kases {
  184. t.Run(kase.name, func(t *testing.T) {
  185. org, err := organization.GetOrgByID(t.Context(), kase.orgname)
  186. require.NoError(t, err)
  187. results, err := organization.GetWorktimeByMilestones(t.Context(), org, kase.unixfrom, kase.unixto)
  188. if assert.NoError(t, err) {
  189. assert.Equal(t, kase.expected, results)
  190. }
  191. })
  192. }
  193. }
  194. // TestTimesByMembers tests TimesByMembers functionality
  195. func testTimesByMembers(t *testing.T) {
  196. kases := []struct {
  197. name string
  198. unixfrom int64
  199. unixto int64
  200. orgname int64
  201. expected []organization.WorktimeSumByMembers
  202. }{
  203. {
  204. name: "Full sum for org 1",
  205. unixfrom: 0,
  206. unixto: 9223372036854775807,
  207. orgname: 1,
  208. expected: []organization.WorktimeSumByMembers(nil),
  209. },
  210. {
  211. // Test case: Sum of times forever in org no. 2
  212. name: "Full sum for org 2",
  213. unixfrom: 0,
  214. unixto: 9223372036854775807,
  215. orgname: 2,
  216. expected: []organization.WorktimeSumByMembers{
  217. {
  218. UserName: "user2",
  219. SumTime: 3666,
  220. },
  221. {
  222. UserName: "user1",
  223. SumTime: 491,
  224. },
  225. },
  226. },
  227. {
  228. name: "Simple time bound",
  229. unixfrom: 946684801,
  230. unixto: 946684802,
  231. orgname: 2,
  232. expected: []organization.WorktimeSumByMembers{
  233. {
  234. UserName: "user2",
  235. SumTime: 3662,
  236. },
  237. },
  238. },
  239. {
  240. name: "Both times inclusive",
  241. unixfrom: 946684801,
  242. unixto: 946684801,
  243. orgname: 2,
  244. expected: []organization.WorktimeSumByMembers{
  245. {
  246. UserName: "user2",
  247. SumTime: 3661,
  248. },
  249. },
  250. },
  251. {
  252. name: "Should ignore deleted",
  253. unixfrom: 947688814,
  254. unixto: 947688815,
  255. orgname: 2,
  256. expected: []organization.WorktimeSumByMembers{
  257. {
  258. UserName: "user1",
  259. SumTime: 71,
  260. },
  261. },
  262. },
  263. }
  264. // Run test kases
  265. for _, kase := range kases {
  266. t.Run(kase.name, func(t *testing.T) {
  267. org, err := organization.GetOrgByID(t.Context(), kase.orgname)
  268. assert.NoError(t, err)
  269. results, err := organization.GetWorktimeByMembers(t.Context(), org, kase.unixfrom, kase.unixto)
  270. assert.NoError(t, err)
  271. assert.Equal(t, kase.expected, results)
  272. })
  273. }
  274. }
  275. func TestOrgWorktime(t *testing.T) {
  276. // we need to run these tests in integration test because there are complex SQL queries
  277. assert.NoError(t, unittest.PrepareTestDatabase())
  278. t.Run("ByRepos", testTimesByRepos)
  279. t.Run("ByMilestones", testTimesByMilestones)
  280. t.Run("ByMembers", testTimesByMembers)
  281. }