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.

release_test.go 11KB

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