gitea源码

release_test.go 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repo
  4. import (
  5. "testing"
  6. "code.gitea.io/gitea/models/db"
  7. repo_model "code.gitea.io/gitea/models/repo"
  8. "code.gitea.io/gitea/models/unit"
  9. "code.gitea.io/gitea/models/unittest"
  10. "code.gitea.io/gitea/modules/web"
  11. "code.gitea.io/gitea/services/context"
  12. "code.gitea.io/gitea/services/contexttest"
  13. "code.gitea.io/gitea/services/forms"
  14. "github.com/stretchr/testify/assert"
  15. "github.com/stretchr/testify/require"
  16. )
  17. func TestNewReleasePost(t *testing.T) {
  18. unittest.PrepareTestEnv(t)
  19. get := func(t *testing.T, tagName string) *context.Context {
  20. ctx, _ := contexttest.MockContext(t, "user2/repo1/releases/new?tag="+tagName)
  21. contexttest.LoadUser(t, ctx, 2)
  22. contexttest.LoadRepo(t, ctx, 1)
  23. contexttest.LoadGitRepo(t, ctx)
  24. defer ctx.Repo.GitRepo.Close()
  25. NewRelease(ctx)
  26. return ctx
  27. }
  28. t.Run("NewReleasePage", func(t *testing.T) {
  29. ctx := get(t, "v1.1")
  30. assert.Empty(t, ctx.Data["ShowCreateTagOnlyButton"])
  31. ctx = get(t, "new-tag-name")
  32. assert.NotEmpty(t, ctx.Data["ShowCreateTagOnlyButton"])
  33. })
  34. post := func(t *testing.T, form forms.NewReleaseForm) *context.Context {
  35. ctx, _ := contexttest.MockContext(t, "user2/repo1/releases/new")
  36. contexttest.LoadUser(t, ctx, 2)
  37. contexttest.LoadRepo(t, ctx, 1)
  38. contexttest.LoadGitRepo(t, ctx)
  39. defer ctx.Repo.GitRepo.Close()
  40. web.SetForm(ctx, &form)
  41. NewReleasePost(ctx)
  42. return ctx
  43. }
  44. loadRelease := func(t *testing.T, tagName string) *repo_model.Release {
  45. return unittest.GetBean(t, &repo_model.Release{}, unittest.Cond("repo_id=1 AND tag_name=?", tagName))
  46. }
  47. t.Run("NewTagRelease", func(t *testing.T) {
  48. post(t, forms.NewReleaseForm{
  49. TagName: "newtag",
  50. Target: "master",
  51. Title: "title",
  52. Content: "content",
  53. })
  54. rel := loadRelease(t, "newtag")
  55. require.NotNil(t, rel)
  56. assert.False(t, rel.IsTag)
  57. assert.Equal(t, "master", rel.Target)
  58. assert.Equal(t, "title", rel.Title)
  59. assert.Equal(t, "content", rel.Note)
  60. })
  61. t.Run("ReleaseExistsDoUpdate(non-tag)", func(t *testing.T) {
  62. ctx := post(t, forms.NewReleaseForm{
  63. TagName: "v1.1",
  64. Target: "master",
  65. Title: "updated-title",
  66. Content: "updated-content",
  67. })
  68. rel := loadRelease(t, "v1.1")
  69. require.NotNil(t, rel)
  70. assert.False(t, rel.IsTag)
  71. assert.Equal(t, "testing-release", rel.Title)
  72. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  73. })
  74. t.Run("ReleaseExistsDoUpdate(tag-only)", func(t *testing.T) {
  75. ctx := post(t, forms.NewReleaseForm{
  76. TagName: "delete-tag", // a strange name, but it is the only "is_tag=true" fixture
  77. Target: "master",
  78. Title: "updated-title",
  79. Content: "updated-content",
  80. TagOnly: true,
  81. })
  82. rel := loadRelease(t, "delete-tag")
  83. require.NotNil(t, rel)
  84. assert.True(t, rel.IsTag) // the record should not be updated because the request is "tag-only". TODO: need to improve the logic?
  85. assert.Equal(t, "delete-tag", rel.Title)
  86. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  87. assert.NotEmpty(t, ctx.Data["ShowCreateTagOnlyButton"]) // still show the "tag-only" button
  88. })
  89. t.Run("ReleaseExistsDoUpdate(tag-release)", func(t *testing.T) {
  90. ctx := post(t, forms.NewReleaseForm{
  91. TagName: "delete-tag", // a strange name, but it is the only "is_tag=true" fixture
  92. Target: "master",
  93. Title: "updated-title",
  94. Content: "updated-content",
  95. })
  96. rel := loadRelease(t, "delete-tag")
  97. require.NotNil(t, rel)
  98. assert.False(t, rel.IsTag) // the tag has been "updated" to be a real "release"
  99. assert.Equal(t, "updated-title", rel.Title)
  100. assert.Empty(t, ctx.Flash.ErrorMsg)
  101. })
  102. t.Run("TagOnly", func(t *testing.T) {
  103. ctx := post(t, forms.NewReleaseForm{
  104. TagName: "new-tag-only",
  105. Target: "master",
  106. Title: "title",
  107. Content: "content",
  108. TagOnly: true,
  109. })
  110. rel := loadRelease(t, "new-tag-only")
  111. require.NotNil(t, rel)
  112. assert.True(t, rel.IsTag)
  113. assert.Empty(t, ctx.Flash.ErrorMsg)
  114. })
  115. t.Run("TagOnlyConflict", func(t *testing.T) {
  116. ctx := post(t, forms.NewReleaseForm{
  117. TagName: "v1.1",
  118. Target: "master",
  119. Title: "title",
  120. Content: "content",
  121. TagOnly: true,
  122. })
  123. rel := loadRelease(t, "v1.1")
  124. require.NotNil(t, rel)
  125. assert.False(t, rel.IsTag)
  126. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  127. })
  128. }
  129. func TestCalReleaseNumCommitsBehind(t *testing.T) {
  130. unittest.PrepareTestEnv(t)
  131. ctx, _ := contexttest.MockContext(t, "user2/repo-release/releases")
  132. contexttest.LoadUser(t, ctx, 2)
  133. contexttest.LoadRepo(t, ctx, 57)
  134. contexttest.LoadGitRepo(t, ctx)
  135. t.Cleanup(func() { ctx.Repo.GitRepo.Close() })
  136. releases, err := db.Find[repo_model.Release](ctx, repo_model.FindReleasesOptions{
  137. IncludeDrafts: ctx.Repo.CanWrite(unit.TypeReleases),
  138. RepoID: ctx.Repo.Repository.ID,
  139. })
  140. assert.NoError(t, err)
  141. countCache := make(map[string]int64)
  142. for _, release := range releases {
  143. err := calReleaseNumCommitsBehind(ctx.Repo, release, countCache)
  144. assert.NoError(t, err)
  145. }
  146. type computedFields struct {
  147. NumCommitsBehind int64
  148. TargetBehind string
  149. }
  150. expectedComputation := map[string]computedFields{
  151. "v1.0": {
  152. NumCommitsBehind: 3,
  153. TargetBehind: "main",
  154. },
  155. "v1.1": {
  156. NumCommitsBehind: 1,
  157. TargetBehind: "main",
  158. },
  159. "v2.0": {
  160. NumCommitsBehind: 0,
  161. TargetBehind: "main",
  162. },
  163. "non-existing-target-branch": {
  164. NumCommitsBehind: 1,
  165. TargetBehind: "main",
  166. },
  167. "empty-target-branch": {
  168. NumCommitsBehind: 1,
  169. TargetBehind: "main",
  170. },
  171. }
  172. for _, r := range releases {
  173. actual := computedFields{
  174. NumCommitsBehind: r.NumCommitsBehind,
  175. TargetBehind: r.TargetBehind,
  176. }
  177. assert.Equal(t, expectedComputation[r.TagName], actual, "wrong computed fields for %s: %#v", r.TagName, r)
  178. }
  179. }