diff options
author | Karthik Nayak <knayak@gitlab.com> | 2022-08-09 14:51:34 +0300 |
---|---|---|
committer | Karthik Nayak <knayak@gitlab.com> | 2022-08-09 19:51:07 +0300 |
commit | c71c54c94caa8599c90dcfbffd3a6c2ba1d8acd4 (patch) | |
tree | 43bfe6b830ee985f313b86e4947f253517376898 | |
parent | 9765a9733ed7f433d0241a589b45bbf712b1a0ab (diff) |
usermergebranch: add validation for user.{email, name}4257-usermergebranch-does-not-verify-it-got-a-user-name-and-email
While 'UserMergeBranch' verifies that it got a user as part of the first
request, it doesn't verify that the user actually has a name and email
set. This leads to an Internal error at a later point when trying to
create the merge commit because you cannot create merge commits with
either of them being empty.
This commit improves our validation to check these parameters and return
an InvalidArgument error if unset. We add a new test
'TestUserMergeBranch_failure' to test the validation logic in
'UserMergeBranch'.
Signed-off-by: Karthik Nayak <knayak@gitlab.com>
-rw-r--r-- | internal/gitaly/service/operations/merge.go | 8 | ||||
-rw-r--r-- | internal/gitaly/service/operations/merge_test.go | 119 |
2 files changed, 127 insertions, 0 deletions
diff --git a/internal/gitaly/service/operations/merge.go b/internal/gitaly/service/operations/merge.go index 8237ec034..d54b7b8d4 100644 --- a/internal/gitaly/service/operations/merge.go +++ b/internal/gitaly/service/operations/merge.go @@ -21,6 +21,14 @@ func validateMergeBranchRequest(request *gitalypb.UserMergeBranchRequest) error return fmt.Errorf("empty user") } + if len(request.User.Email) == 0 { + return fmt.Errorf("empty user email") + } + + if len(request.User.Name) == 0 { + return fmt.Errorf("empty user name") + } + if len(request.Branch) == 0 { return fmt.Errorf("empty branch name") } diff --git a/internal/gitaly/service/operations/merge_test.go b/internal/gitaly/service/operations/merge_test.go index 41c5038c8..d16fab2b3 100644 --- a/internal/gitaly/service/operations/merge_test.go +++ b/internal/gitaly/service/operations/merge_test.go @@ -120,6 +120,125 @@ func TestUserMergeBranch_successful(t *testing.T) { } } +func TestUserMergeBranch_failure(t *testing.T) { + t.Parallel() + ctx := testhelper.Context(t) + + ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) + + _ = localrepo.NewTestRepo(t, cfg, repoProto) + + gittest.Exec(t, cfg, "-C", repoPath, "branch", mergeBranchName, mergeBranchHeadBefore) + + testCases := []struct { + user *gitalypb.User + repo *gitalypb.Repository + desc string + commitID string + errMessage string + branch []byte + message []byte + code codes.Code + }{ + { + desc: "empty repository", + user: gittest.TestUser, + branch: []byte(mergeBranchName), + commitID: commitToMerge, + code: codes.InvalidArgument, + message: []byte("sample-message"), + errMessage: "", + }, + { + desc: "empty user", + repo: repoProto, + branch: []byte(mergeBranchName), + commitID: commitToMerge, + code: codes.InvalidArgument, + message: []byte("sample-message"), + errMessage: "empty user", + }, + { + desc: "empty user name", + user: &gitalypb.User{ + GlId: gittest.TestUser.GlId, + GlUsername: gittest.TestUser.GlUsername, + Email: gittest.TestUser.Email, + Timezone: gittest.TestUser.Timezone, + }, + repo: repoProto, + branch: []byte(mergeBranchName), + commitID: commitToMerge, + code: codes.InvalidArgument, + message: []byte("sample-message"), + errMessage: "empty user name", + }, + { + desc: "empty user email", + user: &gitalypb.User{ + GlId: gittest.TestUser.GlId, + Name: gittest.TestUser.Name, + GlUsername: gittest.TestUser.GlUsername, + Timezone: gittest.TestUser.Timezone, + }, + repo: repoProto, + branch: []byte(mergeBranchName), + commitID: commitToMerge, + code: codes.InvalidArgument, + message: []byte("sample-message"), + errMessage: "empty user email", + }, + { + desc: "empty commit", + repo: repoProto, + user: gittest.TestUser, + branch: []byte(mergeBranchName), + code: codes.InvalidArgument, + message: []byte("sample-message"), + errMessage: "empty commit ID", + }, + { + desc: "empty branch", + repo: repoProto, + user: gittest.TestUser, + commitID: commitToMerge, + code: codes.InvalidArgument, + message: []byte("sample-message"), + errMessage: "empty branch name", + }, + { + desc: "empty message", + repo: repoProto, + user: gittest.TestUser, + branch: []byte(mergeBranchName), + commitID: commitToMerge, + code: codes.InvalidArgument, + errMessage: "empty message", + }, + } + + for _, testCase := range testCases { + t.Run(testCase.desc, func(t *testing.T) { + request := &gitalypb.UserMergeBranchRequest{ + Repository: testCase.repo, + User: testCase.user, + Branch: testCase.branch, + CommitId: testCase.commitID, + Message: testCase.message, + } + + mergeBidi, err := client.UserMergeBranch(ctx) + require.NoError(t, err) + + require.NoError(t, mergeBidi.Send(request), "apply merge") + _, err = mergeBidi.Recv() + + testhelper.RequireGrpcCode(t, err, testCase.code) + require.ErrorContains(t, err, testCase.errMessage) + }) + } +} + func TestUserMergeBranch_quarantine(t *testing.T) { t.Parallel() |