- MergeUser will - replace all user_ids from conflicting users to the chosen userId - delete users whose user_ids are not the chosen user - SameIdentification will - update chosen user with chosen email,login details - delete users whose user_ids are not the chosen user
120 lines
4.0 KiB
Go
120 lines
4.0 KiB
Go
package commands
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/grafana/grafana/pkg/models"
|
|
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
|
"github.com/grafana/grafana/pkg/services/sqlstore"
|
|
"github.com/grafana/grafana/pkg/services/user"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestUserManagerListConflictingUsers(t *testing.T) {
|
|
t.Run("should get conflicting users", func(t *testing.T) {
|
|
// Restore after destructive operation
|
|
sqlStore := sqlstore.InitTestDB(t)
|
|
|
|
for i := 0; i < 5; i++ {
|
|
cmd := user.CreateUserCommand{
|
|
Email: fmt.Sprint("user", i, "@test.com"),
|
|
Name: fmt.Sprint("user", i),
|
|
Login: fmt.Sprint("loginuser", i),
|
|
OrgID: 1,
|
|
}
|
|
_, err := sqlStore.CreateUser(context.Background(), cmd)
|
|
require.Nil(t, err)
|
|
}
|
|
|
|
// "Skipping conflicting users test for mysql as it does make unique constraint case insensitive by default
|
|
if sqlStore.GetDialect().DriverName() != "mysql" {
|
|
dupUserEmailcmd := user.CreateUserCommand{
|
|
Email: "USERDUPLICATETEST1@TEST.COM",
|
|
Name: "user name 1",
|
|
Login: "USER_DUPLICATE_TEST_1_LOGIN",
|
|
}
|
|
_, err := sqlStore.CreateUser(context.Background(), dupUserEmailcmd)
|
|
require.NoError(t, err)
|
|
|
|
// add additional user with conflicting login where DOMAIN is upper case
|
|
dupUserLogincmd := user.CreateUserCommand{
|
|
Email: "userduplicatetest1@test.com",
|
|
Name: "user name 1",
|
|
Login: "user_duplicate_test_1_login",
|
|
}
|
|
_, err = sqlStore.CreateUser(context.Background(), dupUserLogincmd)
|
|
require.NoError(t, err)
|
|
m, err := GetUsersWithConflictingEmailsOrLogins(context.Background(), sqlStore)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, len(m))
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestMergeUser(t *testing.T) {
|
|
t.Run("should be able to merge user", func(t *testing.T) {
|
|
// Restore after destructive operation
|
|
sqlStore := sqlstore.InitTestDB(t)
|
|
|
|
const testOrgID int64 = 1
|
|
// "Skipping conflicting users test for mysql as it does make unique constraint case insensitive by default
|
|
if sqlStore.GetDialect().DriverName() != "mysql" {
|
|
|
|
// setup
|
|
dupUserEmailcmd := user.CreateUserCommand{
|
|
Email: "USERDUPLICATETEST1@TEST.COM",
|
|
Name: "user name 1",
|
|
Login: "USER_DUPLICATE_TEST_1_LOGIN",
|
|
OrgID: testOrgID,
|
|
}
|
|
userWithUpperCase, err := sqlStore.CreateUser(context.Background(), dupUserEmailcmd)
|
|
require.NoError(t, err)
|
|
|
|
// add additional user with conflicting login where DOMAIN is upper case
|
|
dupUserLogincmd := user.CreateUserCommand{
|
|
Email: "userduplicatetest1@test.com",
|
|
Name: "user name 1",
|
|
Login: "user_duplicate_test_1_login",
|
|
OrgID: testOrgID,
|
|
}
|
|
userWithLowerCase, err := sqlStore.CreateUser(context.Background(), dupUserLogincmd)
|
|
require.NoError(t, err)
|
|
// fromUser should be replaced by userWithLowerCase
|
|
team1, err := sqlStore.CreateTeam("group1 name", "test1@test.com", testOrgID)
|
|
require.NoError(t, err)
|
|
err = sqlStore.AddTeamMember(userWithUpperCase.ID, testOrgID, team1.Id, false, 0)
|
|
require.NoError(t, err)
|
|
// setup finished
|
|
|
|
m, err := GetUsersWithConflictingEmailsOrLogins(context.Background(), sqlStore)
|
|
require.NoError(t, err)
|
|
mergeErr := mergeUser(context.Background(), userWithLowerCase.ID, m[0], sqlStore)
|
|
require.NoError(t, mergeErr)
|
|
|
|
// start test
|
|
// fromUser should be deleted after merger
|
|
t.Logf("testing getting user")
|
|
query := &models.GetUserByIdQuery{Id: userWithUpperCase.ID}
|
|
err = sqlStore.GetUserById(context.Background(), query)
|
|
require.Error(t, models.ErrUserNotFound, err)
|
|
|
|
testUser := &models.SignedInUser{
|
|
OrgId: testOrgID,
|
|
Permissions: map[int64]map[string][]string{
|
|
1: {
|
|
ac.ActionTeamsRead: []string{ac.ScopeTeamsAll},
|
|
ac.ActionOrgUsersRead: []string{ac.ScopeUsersAll},
|
|
},
|
|
},
|
|
}
|
|
t.Logf("testing getting team member")
|
|
q1 := &models.GetTeamMembersQuery{OrgId: testOrgID, TeamId: team1.Id, SignedInUser: testUser}
|
|
err = sqlStore.GetTeamMembers(context.Background(), q1)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 0, len(q1.Result))
|
|
}
|
|
})
|
|
}
|