mirror of
https://github.com/go-gitea/gitea
synced 2025-07-16 07:18:37 +00:00
Validate that the tag doesn't exist when creating a tag via the web (#33241)
Found while investigating #33210. This line no longer makes sense because the form field "TagName" is required, so this would mean that this code path would never be covered. Because it isn't covered, we end up going down the "update release" logic where we eventually set `Release.IsTag` to false (meaning it will now be treated as a release instead of a tag). This snapshot rewrites the condition to ensure that we aren't trying to create a tag that already exists. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
@@ -11,60 +11,135 @@ import (
|
||||
"code.gitea.io/gitea/models/unit"
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
"code.gitea.io/gitea/services/context"
|
||||
"code.gitea.io/gitea/services/contexttest"
|
||||
"code.gitea.io/gitea/services/forms"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestNewReleasePost(t *testing.T) {
|
||||
for _, testCase := range []struct {
|
||||
RepoID int64
|
||||
UserID int64
|
||||
TagName string
|
||||
Form forms.NewReleaseForm
|
||||
}{
|
||||
{
|
||||
RepoID: 1,
|
||||
UserID: 2,
|
||||
TagName: "v1.1", // pre-existing tag
|
||||
Form: forms.NewReleaseForm{
|
||||
TagName: "newtag",
|
||||
Target: "master",
|
||||
Title: "title",
|
||||
Content: "content",
|
||||
},
|
||||
},
|
||||
{
|
||||
RepoID: 1,
|
||||
UserID: 2,
|
||||
TagName: "newtag",
|
||||
Form: forms.NewReleaseForm{
|
||||
TagName: "newtag",
|
||||
Target: "master",
|
||||
Title: "title",
|
||||
Content: "content",
|
||||
},
|
||||
},
|
||||
} {
|
||||
unittest.PrepareTestEnv(t)
|
||||
unittest.PrepareTestEnv(t)
|
||||
|
||||
get := func(t *testing.T, tagName string) *context.Context {
|
||||
ctx, _ := contexttest.MockContext(t, "user2/repo1/releases/new?tag="+tagName)
|
||||
contexttest.LoadUser(t, ctx, 2)
|
||||
contexttest.LoadRepo(t, ctx, 1)
|
||||
contexttest.LoadGitRepo(t, ctx)
|
||||
defer ctx.Repo.GitRepo.Close()
|
||||
NewRelease(ctx)
|
||||
return ctx
|
||||
}
|
||||
|
||||
t.Run("NewReleasePage", func(t *testing.T) {
|
||||
ctx := get(t, "v1.1")
|
||||
assert.Empty(t, ctx.Data["ShowCreateTagOnlyButton"])
|
||||
ctx = get(t, "new-tag-name")
|
||||
assert.NotEmpty(t, ctx.Data["ShowCreateTagOnlyButton"])
|
||||
})
|
||||
|
||||
post := func(t *testing.T, form forms.NewReleaseForm) *context.Context {
|
||||
ctx, _ := contexttest.MockContext(t, "user2/repo1/releases/new")
|
||||
contexttest.LoadUser(t, ctx, 2)
|
||||
contexttest.LoadRepo(t, ctx, 1)
|
||||
contexttest.LoadGitRepo(t, ctx)
|
||||
web.SetForm(ctx, &testCase.Form)
|
||||
defer ctx.Repo.GitRepo.Close()
|
||||
web.SetForm(ctx, &form)
|
||||
NewReleasePost(ctx)
|
||||
unittest.AssertExistsAndLoadBean(t, &repo_model.Release{
|
||||
RepoID: 1,
|
||||
PublisherID: 2,
|
||||
TagName: testCase.Form.TagName,
|
||||
Target: testCase.Form.Target,
|
||||
Title: testCase.Form.Title,
|
||||
Note: testCase.Form.Content,
|
||||
}, unittest.Cond("is_draft=?", len(testCase.Form.Draft) > 0))
|
||||
ctx.Repo.GitRepo.Close()
|
||||
return ctx
|
||||
}
|
||||
|
||||
loadRelease := func(t *testing.T, tagName string) *repo_model.Release {
|
||||
return unittest.GetBean(t, &repo_model.Release{}, unittest.Cond("repo_id=1 AND tag_name=?", tagName))
|
||||
}
|
||||
|
||||
t.Run("NewTagRelease", func(t *testing.T) {
|
||||
post(t, forms.NewReleaseForm{
|
||||
TagName: "newtag",
|
||||
Target: "master",
|
||||
Title: "title",
|
||||
Content: "content",
|
||||
})
|
||||
rel := loadRelease(t, "newtag")
|
||||
require.NotNil(t, rel)
|
||||
assert.False(t, rel.IsTag)
|
||||
assert.Equal(t, "master", rel.Target)
|
||||
assert.Equal(t, "title", rel.Title)
|
||||
assert.Equal(t, "content", rel.Note)
|
||||
})
|
||||
|
||||
t.Run("ReleaseExistsDoUpdate(non-tag)", func(t *testing.T) {
|
||||
ctx := post(t, forms.NewReleaseForm{
|
||||
TagName: "v1.1",
|
||||
Target: "master",
|
||||
Title: "updated-title",
|
||||
Content: "updated-content",
|
||||
})
|
||||
rel := loadRelease(t, "v1.1")
|
||||
require.NotNil(t, rel)
|
||||
assert.False(t, rel.IsTag)
|
||||
assert.Equal(t, "testing-release", rel.Title)
|
||||
assert.NotEmpty(t, ctx.Flash.ErrorMsg)
|
||||
})
|
||||
|
||||
t.Run("ReleaseExistsDoUpdate(tag-only)", func(t *testing.T) {
|
||||
ctx := post(t, forms.NewReleaseForm{
|
||||
TagName: "delete-tag", // a strange name, but it is the only "is_tag=true" fixture
|
||||
Target: "master",
|
||||
Title: "updated-title",
|
||||
Content: "updated-content",
|
||||
TagOnly: true,
|
||||
})
|
||||
rel := loadRelease(t, "delete-tag")
|
||||
require.NotNil(t, rel)
|
||||
assert.True(t, rel.IsTag) // the record should not be updated because the request is "tag-only". TODO: need to improve the logic?
|
||||
assert.Equal(t, "delete-tag", rel.Title)
|
||||
assert.NotEmpty(t, ctx.Flash.ErrorMsg)
|
||||
assert.NotEmpty(t, ctx.Data["ShowCreateTagOnlyButton"]) // still show the "tag-only" button
|
||||
})
|
||||
|
||||
t.Run("ReleaseExistsDoUpdate(tag-release)", func(t *testing.T) {
|
||||
ctx := post(t, forms.NewReleaseForm{
|
||||
TagName: "delete-tag", // a strange name, but it is the only "is_tag=true" fixture
|
||||
Target: "master",
|
||||
Title: "updated-title",
|
||||
Content: "updated-content",
|
||||
})
|
||||
rel := loadRelease(t, "delete-tag")
|
||||
require.NotNil(t, rel)
|
||||
assert.False(t, rel.IsTag) // the tag has been "updated" to be a real "release"
|
||||
assert.Equal(t, "updated-title", rel.Title)
|
||||
assert.Empty(t, ctx.Flash.ErrorMsg)
|
||||
})
|
||||
|
||||
t.Run("TagOnly", func(t *testing.T) {
|
||||
ctx := post(t, forms.NewReleaseForm{
|
||||
TagName: "new-tag-only",
|
||||
Target: "master",
|
||||
Title: "title",
|
||||
Content: "content",
|
||||
TagOnly: true,
|
||||
})
|
||||
rel := loadRelease(t, "new-tag-only")
|
||||
require.NotNil(t, rel)
|
||||
assert.True(t, rel.IsTag)
|
||||
assert.Empty(t, ctx.Flash.ErrorMsg)
|
||||
})
|
||||
|
||||
t.Run("TagOnlyConflict", func(t *testing.T) {
|
||||
ctx := post(t, forms.NewReleaseForm{
|
||||
TagName: "v1.1",
|
||||
Target: "master",
|
||||
Title: "title",
|
||||
Content: "content",
|
||||
TagOnly: true,
|
||||
})
|
||||
rel := loadRelease(t, "v1.1")
|
||||
require.NotNil(t, rel)
|
||||
assert.False(t, rel.IsTag)
|
||||
assert.NotEmpty(t, ctx.Flash.ErrorMsg)
|
||||
})
|
||||
}
|
||||
|
||||
func TestCalReleaseNumCommitsBehind(t *testing.T) {
|
||||
|
Reference in New Issue
Block a user