mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-30 15:43:52 +03:00
Don't fail silently if trying to add a collaborator twice (#4533)
* don't fail silently if trying to add a collaborator twice * fix translation text * added collaborator test * improvee testcases * Added tests to make sure a collaborator cannot be added twice
This commit is contained in:
parent
7cb1c1cf20
commit
c7a6ee5c0b
3 changed files with 109 additions and 0 deletions
|
@ -1025,6 +1025,7 @@ settings.transfer_succeed = The repository has been transferred.
|
|||
settings.confirm_delete = Delete Repository
|
||||
settings.add_collaborator = Add Collaborator
|
||||
settings.add_collaborator_success = The collaborator has been added.
|
||||
settings.add_collaborator_duplicate =The collaborator is already added to this repository.
|
||||
settings.delete_collaborator = Remove
|
||||
settings.collaborator_deletion = Remove Collaborator
|
||||
settings.collaborator_deletion_desc = Removing a collaborator will revoke their access to this repository. Continue?
|
||||
|
|
|
@ -401,6 +401,12 @@ func CollaborationPost(ctx *context.Context) {
|
|||
}
|
||||
}
|
||||
|
||||
if got, err := ctx.Repo.Repository.IsCollaborator(u.ID); err == nil && got {
|
||||
ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_duplicate"))
|
||||
ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration")
|
||||
return
|
||||
}
|
||||
|
||||
if err = ctx.Repo.Repository.AddCollaborator(u); err != nil {
|
||||
ctx.ServerError("AddCollaborator", err)
|
||||
return
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
|
||||
"code.gitea.io/gitea/models"
|
||||
"code.gitea.io/gitea/modules/auth"
|
||||
"code.gitea.io/gitea/modules/context"
|
||||
"code.gitea.io/gitea/modules/test"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
@ -59,3 +60,104 @@ func TestAddReadWriteOnlyDeployKey(t *testing.T) {
|
|||
Mode: models.AccessModeWrite,
|
||||
})
|
||||
}
|
||||
|
||||
func TestCollaborationPost(t *testing.T) {
|
||||
|
||||
models.PrepareTestEnv(t)
|
||||
ctx := test.MockContext(t, "user2/repo1/issues/labels")
|
||||
test.LoadUser(t, ctx, 2)
|
||||
test.LoadUser(t, ctx, 4)
|
||||
test.LoadRepo(t, ctx, 1)
|
||||
|
||||
ctx.Req.Form.Set("collaborator", "user4")
|
||||
|
||||
u := &models.User{
|
||||
LowerName: "user2",
|
||||
Type: models.UserTypeIndividual,
|
||||
}
|
||||
|
||||
re := &models.Repository{
|
||||
ID: 2,
|
||||
Owner: u,
|
||||
}
|
||||
|
||||
repo := &context.Repository{
|
||||
Owner: u,
|
||||
Repository: re,
|
||||
}
|
||||
|
||||
ctx.Repo = repo
|
||||
|
||||
CollaborationPost(ctx)
|
||||
|
||||
assert.EqualValues(t, http.StatusFound, ctx.Resp.Status())
|
||||
|
||||
exists, err := re.IsCollaborator(4)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, exists)
|
||||
}
|
||||
|
||||
func TestCollaborationPost_AddCollaboratorTwice(t *testing.T) {
|
||||
|
||||
models.PrepareTestEnv(t)
|
||||
ctx := test.MockContext(t, "user2/repo1/issues/labels")
|
||||
test.LoadUser(t, ctx, 2)
|
||||
test.LoadUser(t, ctx, 4)
|
||||
test.LoadRepo(t, ctx, 1)
|
||||
|
||||
ctx.Req.Form.Set("collaborator", "user4")
|
||||
|
||||
u := &models.User{
|
||||
LowerName: "user2",
|
||||
Type: models.UserTypeIndividual,
|
||||
}
|
||||
|
||||
re := &models.Repository{
|
||||
ID: 2,
|
||||
Owner: u,
|
||||
}
|
||||
|
||||
repo := &context.Repository{
|
||||
Owner: u,
|
||||
Repository: re,
|
||||
}
|
||||
|
||||
ctx.Repo = repo
|
||||
|
||||
CollaborationPost(ctx)
|
||||
|
||||
assert.EqualValues(t, http.StatusFound, ctx.Resp.Status())
|
||||
|
||||
exists, err := re.IsCollaborator(4)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, exists)
|
||||
|
||||
// Try adding the same collaborator again
|
||||
CollaborationPost(ctx)
|
||||
|
||||
assert.EqualValues(t, http.StatusFound, ctx.Resp.Status())
|
||||
assert.NotEmpty(t, ctx.Flash.ErrorMsg)
|
||||
}
|
||||
|
||||
func TestCollaborationPost_NonExistentUser(t *testing.T) {
|
||||
|
||||
models.PrepareTestEnv(t)
|
||||
ctx := test.MockContext(t, "user2/repo1/issues/labels")
|
||||
test.LoadUser(t, ctx, 2)
|
||||
test.LoadRepo(t, ctx, 1)
|
||||
|
||||
ctx.Req.Form.Set("collaborator", "user34")
|
||||
|
||||
repo := &context.Repository{
|
||||
Owner: &models.User{
|
||||
LowerName: "user2",
|
||||
},
|
||||
}
|
||||
|
||||
ctx.Repo = repo
|
||||
|
||||
CollaborationPost(ctx)
|
||||
|
||||
assert.EqualValues(t, http.StatusFound, ctx.Resp.Status())
|
||||
assert.NotEmpty(t, ctx.Flash.ErrorMsg)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue