Skip to content

Commit

Permalink
add unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
gkech committed Jan 31, 2025
1 parent 7b397cb commit 12fe253
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
4 changes: 2 additions & 2 deletions pkg/controller/perconaservermongodb/custom_users.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,8 @@ func validateUser(ctx context.Context, user *api.User, sysUserNames, uniqueUserN
}

if _, exists := uniqueUserNames[user.Name]; exists {
log.Error(nil, "username already exists", "user", user.Name)
return errors.New("username already exists")
log.Error(nil, "username should be unique", "user", user.Name)
return errors.New("username should be unique")
}
uniqueUserNames[user.Name] = struct{}{}

Expand Down
68 changes: 68 additions & 0 deletions pkg/controller/perconaservermongodb/custom_users_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package perconaservermongodb

import (
"context"
"testing"

api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/mongo"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)

func TestRolesChanged(t *testing.T) {
Expand Down Expand Up @@ -232,3 +236,67 @@ func TestRolesChanged(t *testing.T) {
})
}
}

func TestValidateUser(t *testing.T) {
ctx := context.Background()

tests := map[string]struct {
user *api.User
actualUser *api.User
sysUserNames map[string]struct{}
uniqueUserNames map[string]struct{}
expectedErr error
}{
"invalid input for sysUserNames and uniqueUserNames": {
user: &api.User{Name: "john", Roles: []api.UserRole{{Name: "rolename", DB: "testdb"}}, DB: "testdb"},
expectedErr: errors.New("invalid sys or unique usernames config"),
},
"valid non-existing username": {
user: &api.User{Name: "john", Roles: []api.UserRole{{Name: "rolename", DB: "testdb"}}, DB: "testdb"},
actualUser: &api.User{Name: "john", Roles: []api.UserRole{{Name: "rolename", DB: "testdb"}}, DB: "testdb"},
sysUserNames: map[string]struct{}{},
uniqueUserNames: map[string]struct{}{},
},
"valid non-existing username, missing db and password secret ref": {
user: &api.User{Name: "john", Roles: []api.UserRole{{Name: "rolename"}}, PasswordSecretRef: &api.SecretKeySelector{}},
actualUser: &api.User{
Name: "john",
Roles: []api.UserRole{{Name: "rolename"}},
DB: "admin",
PasswordSecretRef: &api.SecretKeySelector{Key: "password"},
},
sysUserNames: map[string]struct{}{},
uniqueUserNames: map[string]struct{}{},
},
"sys reserved username": {
user: &api.User{Name: "root", Roles: []api.UserRole{{Name: "rolename", DB: "testdb"}}, DB: "testdb"},
sysUserNames: map[string]struct{}{"root": {}},
uniqueUserNames: map[string]struct{}{},
expectedErr: errors.New("sys reserved username"),
},
"not unique username": {
user: &api.User{Name: "useradmin", Roles: []api.UserRole{{Name: "rolename", DB: "testdb"}}, DB: "testdb"},
sysUserNames: map[string]struct{}{},
uniqueUserNames: map[string]struct{}{"useradmin": {}},
expectedErr: errors.New("username should be unique"),
},
"no roles defined": {
user: &api.User{Name: "john", Roles: []api.UserRole{}, DB: "testdb"},
sysUserNames: map[string]struct{}{},
uniqueUserNames: map[string]struct{}{},
expectedErr: errors.New("user must have at least one role"),
},
}

for name, tt := range tests {
t.Run(name, func(t *testing.T) {
err := validateUser(ctx, tt.user, tt.sysUserNames, tt.uniqueUserNames)
if tt.expectedErr != nil {
assert.EqualError(t, err, tt.expectedErr.Error())
} else {
assert.Equal(t, tt.user, tt.actualUser)
assert.NoError(t, err)
}
})
}
}

0 comments on commit 12fe253

Please sign in to comment.