services/user: Fix userimpl tests when running on Spanner. (#103715)

Fix userimpl tests when running on Spanner.
This commit is contained in:
Peter Štibraný
2025-04-11 10:28:21 +02:00
committed by GitHub
parent 4648ba396b
commit 54b8dde1e1
4 changed files with 47 additions and 31 deletions
+9 -31
View File
@@ -2,15 +2,11 @@ package userimpl
import (
"context"
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/go-sql-driver/mysql"
"github.com/mattn/go-sqlite3"
"github.com/grafana/grafana/pkg/events"
"github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/log"
@@ -76,8 +72,9 @@ func (ss *sqlStore) Insert(ctx context.Context, cmd *user.User) (int64, error) {
})
return nil
})
if err != nil {
return 0, handleSQLError(err)
return 0, handleSQLError(ss.dialect, err)
}
return cmd.ID, nil
@@ -482,8 +479,6 @@ func (ss *sqlStore) Search(ctx context.Context, query *user.SearchUsersQuery) (*
Users: make([]*user.UserSearchHitDTO, 0),
}
err := ss.db.WithDbSession(ctx, func(dbSess *db.Session) error {
queryWithWildcards := "%" + query.Query + "%"
whereConditions := make([]string, 0)
whereParams := make([]any, 0)
sess := dbSess.Table("user").Alias("u")
@@ -512,8 +507,11 @@ func (ss *sqlStore) Search(ctx context.Context, query *user.SearchUsersQuery) (*
whereParams = append(whereParams, acFilter.Args...)
if query.Query != "" {
whereConditions = append(whereConditions, "(email "+ss.dialect.LikeStr()+" ? OR name "+ss.dialect.LikeStr()+" ? OR login "+ss.dialect.LikeStr()+" ?)")
whereParams = append(whereParams, queryWithWildcards, queryWithWildcards, queryWithWildcards)
emailSql, emailArg := ss.dialect.LikeOperator("email", true, query.Query, true)
nameSql, nameArg := ss.dialect.LikeOperator("name", true, query.Query, true)
loginSql, loginArg := ss.dialect.LikeOperator("login", true, query.Query, true)
whereConditions = append(whereConditions, fmt.Sprintf("(%s OR %s OR %s)", emailSql, nameSql, loginSql))
whereParams = append(whereParams, emailArg, nameArg, loginArg)
}
if query.IsDisabled != nil {
@@ -606,29 +604,9 @@ func setOptional[T any](v *T, add func(v T)) {
}
}
func handleSQLError(err error) error {
if isUniqueConstraintError(err) {
func handleSQLError(dialect migrator.Dialect, err error) error {
if dialect.IsUniqueConstraintViolation(err) {
return user.ErrUserAlreadyExists
}
return err
}
func isUniqueConstraintError(err error) bool {
// check mysql error code
var me *mysql.MySQLError
if errors.As(err, &me) && me.Number == 1062 {
return true
}
// for postgres we check the error message
if strings.Contains(err.Error(), "duplicate key value") {
return true
}
var se sqlite3.Error
if errors.As(err, &se) && se.ExtendedCode == sqlite3.ErrConstraintUnique {
return true
}
return false
}