gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. // Copyright 2018 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package release
  4. import (
  5. "strings"
  6. "testing"
  7. "time"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/models/unittest"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/gitrepo"
  12. "code.gitea.io/gitea/services/attachment"
  13. _ "code.gitea.io/gitea/models/actions"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestMain(m *testing.M) {
  17. unittest.MainTest(m)
  18. }
  19. func TestRelease_Create(t *testing.T) {
  20. assert.NoError(t, unittest.PrepareTestDatabase())
  21. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  22. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  23. gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
  24. assert.NoError(t, err)
  25. defer gitRepo.Close()
  26. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  27. RepoID: repo.ID,
  28. Repo: repo,
  29. PublisherID: user.ID,
  30. Publisher: user,
  31. TagName: "v0.1",
  32. Target: "master",
  33. Title: "v0.1 is released",
  34. Note: "v0.1 is released",
  35. IsDraft: false,
  36. IsPrerelease: false,
  37. IsTag: false,
  38. }, nil, ""))
  39. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  40. RepoID: repo.ID,
  41. Repo: repo,
  42. PublisherID: user.ID,
  43. Publisher: user,
  44. TagName: "v0.1.1",
  45. Target: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
  46. Title: "v0.1.1 is released",
  47. Note: "v0.1.1 is released",
  48. IsDraft: false,
  49. IsPrerelease: false,
  50. IsTag: false,
  51. }, nil, ""))
  52. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  53. RepoID: repo.ID,
  54. Repo: repo,
  55. PublisherID: user.ID,
  56. Publisher: user,
  57. TagName: "v0.1.2",
  58. Target: "65f1bf2",
  59. Title: "v0.1.2 is released",
  60. Note: "v0.1.2 is released",
  61. IsDraft: false,
  62. IsPrerelease: false,
  63. IsTag: false,
  64. }, nil, ""))
  65. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  66. RepoID: repo.ID,
  67. Repo: repo,
  68. PublisherID: user.ID,
  69. Publisher: user,
  70. TagName: "v0.1.3",
  71. Target: "65f1bf2",
  72. Title: "v0.1.3 is released",
  73. Note: "v0.1.3 is released",
  74. IsDraft: true,
  75. IsPrerelease: false,
  76. IsTag: false,
  77. }, nil, ""))
  78. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  79. RepoID: repo.ID,
  80. Repo: repo,
  81. PublisherID: user.ID,
  82. Publisher: user,
  83. TagName: "v0.1.4",
  84. Target: "65f1bf2",
  85. Title: "v0.1.4 is released",
  86. Note: "v0.1.4 is released",
  87. IsDraft: false,
  88. IsPrerelease: true,
  89. IsTag: false,
  90. }, nil, ""))
  91. testPlayload := "testtest"
  92. attach, err := attachment.NewAttachment(t.Context(), &repo_model.Attachment{
  93. RepoID: repo.ID,
  94. UploaderID: user.ID,
  95. Name: "test.txt",
  96. }, strings.NewReader(testPlayload), int64(len([]byte(testPlayload))))
  97. assert.NoError(t, err)
  98. release := repo_model.Release{
  99. RepoID: repo.ID,
  100. Repo: repo,
  101. PublisherID: user.ID,
  102. Publisher: user,
  103. TagName: "v0.1.5",
  104. Target: "65f1bf2",
  105. Title: "v0.1.5 is released",
  106. Note: "v0.1.5 is released",
  107. IsDraft: false,
  108. IsPrerelease: false,
  109. IsTag: true,
  110. }
  111. assert.NoError(t, CreateRelease(gitRepo, &release, []string{attach.UUID}, "test"))
  112. }
  113. func TestRelease_Update(t *testing.T) {
  114. assert.NoError(t, unittest.PrepareTestDatabase())
  115. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  116. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  117. gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
  118. assert.NoError(t, err)
  119. defer gitRepo.Close()
  120. // Test a changed release
  121. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  122. RepoID: repo.ID,
  123. Repo: repo,
  124. PublisherID: user.ID,
  125. Publisher: user,
  126. TagName: "v1.1.1",
  127. Target: "master",
  128. Title: "v1.1.1 is released",
  129. Note: "v1.1.1 is released",
  130. IsDraft: false,
  131. IsPrerelease: false,
  132. IsTag: false,
  133. }, nil, ""))
  134. release, err := repo_model.GetRelease(t.Context(), repo.ID, "v1.1.1")
  135. assert.NoError(t, err)
  136. releaseCreatedUnix := release.CreatedUnix
  137. time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
  138. release.Note = "Changed note"
  139. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, nil, nil, nil))
  140. release, err = repo_model.GetReleaseByID(t.Context(), release.ID)
  141. assert.NoError(t, err)
  142. assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
  143. // Test a changed draft
  144. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  145. RepoID: repo.ID,
  146. Repo: repo,
  147. PublisherID: user.ID,
  148. Publisher: user,
  149. TagName: "v1.2.1",
  150. Target: "65f1bf2",
  151. Title: "v1.2.1 is draft",
  152. Note: "v1.2.1 is draft",
  153. IsDraft: true,
  154. IsPrerelease: false,
  155. IsTag: false,
  156. }, nil, ""))
  157. release, err = repo_model.GetRelease(t.Context(), repo.ID, "v1.2.1")
  158. assert.NoError(t, err)
  159. releaseCreatedUnix = release.CreatedUnix
  160. time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
  161. release.Title = "Changed title"
  162. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, nil, nil, nil))
  163. release, err = repo_model.GetReleaseByID(t.Context(), release.ID)
  164. assert.NoError(t, err)
  165. assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
  166. // Test a changed pre-release
  167. assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
  168. RepoID: repo.ID,
  169. Repo: repo,
  170. PublisherID: user.ID,
  171. Publisher: user,
  172. TagName: "v1.3.1",
  173. Target: "65f1bf2",
  174. Title: "v1.3.1 is pre-released",
  175. Note: "v1.3.1 is pre-released",
  176. IsDraft: false,
  177. IsPrerelease: true,
  178. IsTag: false,
  179. }, nil, ""))
  180. release, err = repo_model.GetRelease(t.Context(), repo.ID, "v1.3.1")
  181. assert.NoError(t, err)
  182. releaseCreatedUnix = release.CreatedUnix
  183. time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
  184. release.Title = "Changed title"
  185. release.Note = "Changed note"
  186. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, nil, nil, nil))
  187. release, err = repo_model.GetReleaseByID(t.Context(), release.ID)
  188. assert.NoError(t, err)
  189. assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
  190. // Test create release
  191. release = &repo_model.Release{
  192. RepoID: repo.ID,
  193. Repo: repo,
  194. PublisherID: user.ID,
  195. Publisher: user,
  196. TagName: "v1.1.2",
  197. Target: "master",
  198. Title: "v1.1.2 is released",
  199. Note: "v1.1.2 is released",
  200. IsDraft: true,
  201. IsPrerelease: false,
  202. IsTag: false,
  203. }
  204. assert.NoError(t, CreateRelease(gitRepo, release, nil, ""))
  205. assert.Positive(t, release.ID)
  206. release.IsDraft = false
  207. tagName := release.TagName
  208. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, nil, nil, nil))
  209. release, err = repo_model.GetReleaseByID(t.Context(), release.ID)
  210. assert.NoError(t, err)
  211. assert.Equal(t, tagName, release.TagName)
  212. // Add new attachments
  213. samplePayload := "testtest"
  214. attach, err := attachment.NewAttachment(t.Context(), &repo_model.Attachment{
  215. RepoID: repo.ID,
  216. UploaderID: user.ID,
  217. Name: "test.txt",
  218. }, strings.NewReader(samplePayload), int64(len([]byte(samplePayload))))
  219. assert.NoError(t, err)
  220. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, []string{attach.UUID}, nil, nil))
  221. assert.NoError(t, repo_model.GetReleaseAttachments(t.Context(), release))
  222. assert.Len(t, release.Attachments, 1)
  223. assert.Equal(t, attach.UUID, release.Attachments[0].UUID)
  224. assert.Equal(t, release.ID, release.Attachments[0].ReleaseID)
  225. assert.Equal(t, attach.Name, release.Attachments[0].Name)
  226. // update the attachment name
  227. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, nil, nil, map[string]string{
  228. attach.UUID: "test2.txt",
  229. }))
  230. release.Attachments = nil
  231. assert.NoError(t, repo_model.GetReleaseAttachments(t.Context(), release))
  232. assert.Len(t, release.Attachments, 1)
  233. assert.Equal(t, attach.UUID, release.Attachments[0].UUID)
  234. assert.Equal(t, release.ID, release.Attachments[0].ReleaseID)
  235. assert.Equal(t, "test2.txt", release.Attachments[0].Name)
  236. // delete the attachment
  237. assert.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, nil, []string{attach.UUID}, nil))
  238. release.Attachments = nil
  239. assert.NoError(t, repo_model.GetReleaseAttachments(t.Context(), release))
  240. assert.Empty(t, release.Attachments)
  241. }
  242. func TestRelease_createTag(t *testing.T) {
  243. assert.NoError(t, unittest.PrepareTestDatabase())
  244. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  245. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  246. gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
  247. assert.NoError(t, err)
  248. defer gitRepo.Close()
  249. // Test a changed release
  250. release := &repo_model.Release{
  251. RepoID: repo.ID,
  252. Repo: repo,
  253. PublisherID: user.ID,
  254. Publisher: user,
  255. TagName: "v2.1.1",
  256. Target: "master",
  257. Title: "v2.1.1 is released",
  258. Note: "v2.1.1 is released",
  259. IsDraft: false,
  260. IsPrerelease: false,
  261. IsTag: false,
  262. }
  263. _, err = createTag(t.Context(), gitRepo, release, "")
  264. assert.NoError(t, err)
  265. assert.NotEmpty(t, release.CreatedUnix)
  266. releaseCreatedUnix := release.CreatedUnix
  267. time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
  268. release.Note = "Changed note"
  269. _, err = createTag(t.Context(), gitRepo, release, "")
  270. assert.NoError(t, err)
  271. assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
  272. // Test a changed draft
  273. release = &repo_model.Release{
  274. RepoID: repo.ID,
  275. Repo: repo,
  276. PublisherID: user.ID,
  277. Publisher: user,
  278. TagName: "v2.2.1",
  279. Target: "65f1bf2",
  280. Title: "v2.2.1 is draft",
  281. Note: "v2.2.1 is draft",
  282. IsDraft: true,
  283. IsPrerelease: false,
  284. IsTag: false,
  285. }
  286. _, err = createTag(t.Context(), gitRepo, release, "")
  287. assert.NoError(t, err)
  288. releaseCreatedUnix = release.CreatedUnix
  289. time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
  290. release.Title = "Changed title"
  291. _, err = createTag(t.Context(), gitRepo, release, "")
  292. assert.NoError(t, err)
  293. assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
  294. // Test a changed pre-release
  295. release = &repo_model.Release{
  296. RepoID: repo.ID,
  297. Repo: repo,
  298. PublisherID: user.ID,
  299. Publisher: user,
  300. TagName: "v2.3.1",
  301. Target: "65f1bf2",
  302. Title: "v2.3.1 is pre-released",
  303. Note: "v2.3.1 is pre-released",
  304. IsDraft: false,
  305. IsPrerelease: true,
  306. IsTag: false,
  307. }
  308. _, err = createTag(t.Context(), gitRepo, release, "")
  309. assert.NoError(t, err)
  310. releaseCreatedUnix = release.CreatedUnix
  311. time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
  312. release.Title = "Changed title"
  313. release.Note = "Changed note"
  314. _, err = createTag(t.Context(), gitRepo, release, "")
  315. assert.NoError(t, err)
  316. assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
  317. }
  318. func TestCreateNewTag(t *testing.T) {
  319. assert.NoError(t, unittest.PrepareTestDatabase())
  320. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  321. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  322. assert.NoError(t, CreateNewTag(t.Context(), user, repo, "master", "v2.0",
  323. "v2.0 is released \n\n BUGFIX: .... \n\n 123"))
  324. }