diff --git a/pkg/models/user_auth.go b/pkg/models/user_auth.go index 652e0517075..94d74ba81ad 100644 --- a/pkg/models/user_auth.go +++ b/pkg/models/user_auth.go @@ -122,8 +122,3 @@ type GetTeamsForLDAPGroupCommand struct { Groups []string Result []TeamOrgGroupDTO } - -type SyncTeamsCommand struct { - ExternalUser *ExternalUserInfo - User *User -} diff --git a/pkg/services/login/login.go b/pkg/services/login/login.go index 1eda6bf2df1..9e08a36b062 100644 --- a/pkg/services/login/login.go +++ b/pkg/services/login/login.go @@ -18,9 +18,12 @@ var ( logger = log.New("login.ext_user") ) +type TeamSyncFunc func(user *models.User, externalUser *models.ExternalUserInfo) error + type LoginService struct { Bus bus.Bus `inject:""` QuotaService *quota.QuotaService `inject:""` + TeamSync TeamSyncFunc } func (ls *LoginService) Init() error { @@ -109,12 +112,11 @@ func (ls *LoginService) UpsertUser(cmd *models.UpsertUserCommand) error { } } - err := ls.Bus.Dispatch(&models.SyncTeamsCommand{ - User: cmd.Result, - ExternalUser: extUser, - }) - if err != nil && !errors.Is(err, bus.ErrHandlerNotFound) { - return err + if ls.TeamSync != nil { + err := ls.TeamSync(cmd.Result, extUser) + if err != nil { + return err + } } return nil diff --git a/pkg/services/login/login_test.go b/pkg/services/login/login_test.go index 084f38e9f09..04953b567a1 100644 --- a/pkg/services/login/login_test.go +++ b/pkg/services/login/login_test.go @@ -1,10 +1,12 @@ package login import ( + "errors" "testing" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/services/quota" log "github.com/inconshreveable/log15" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -74,6 +76,60 @@ func Test_syncOrgRoles_whenTryingToRemoveLastOrgLogsError(t *testing.T) { assert.Contains(t, logs, models.ErrLastOrgAdmin.Error()) } +func Test_teamSync(t *testing.T) { + login := LoginService{ + Bus: bus.New(), + QuotaService: "a.QuotaService{}, + } + + upserCmd := &models.UpsertUserCommand{ExternalUser: &models.ExternalUserInfo{Email: "test_user@example.org"}} + expectedUser := &models.User{ + Id: 1, + Email: "test_user@example.org", + Name: "test_user", + Login: "test_user", + } + + bus.ClearBusHandlers() + t.Cleanup(func() { bus.ClearBusHandlers() }) + bus.AddHandler("test", func(query *models.GetUserByAuthInfoQuery) error { + query.Result = expectedUser + return nil + }) + + var actualUser *models.User + var actualExternalUser *models.ExternalUserInfo + + t.Run("login.TeamSync should not be called when nil", func(t *testing.T) { + err := login.UpsertUser(upserCmd) + require.Nil(t, err) + assert.Nil(t, actualUser) + assert.Nil(t, actualExternalUser) + + t.Run("login.TeamSync should be called when not nil", func(t *testing.T) { + teamSyncFunc := func(user *models.User, externalUser *models.ExternalUserInfo) error { + actualUser = user + actualExternalUser = externalUser + return nil + } + login.TeamSync = teamSyncFunc + err := login.UpsertUser(upserCmd) + require.Nil(t, err) + assert.Equal(t, actualUser, expectedUser) + assert.Equal(t, actualExternalUser, upserCmd.ExternalUser) + }) + + t.Run("login.TeamSync should propagate its errors to the caller", func(t *testing.T) { + teamSyncFunc := func(user *models.User, externalUser *models.ExternalUserInfo) error { + return errors.New("teamsync test error") + } + login.TeamSync = teamSyncFunc + err := login.UpsertUser(upserCmd) + require.Error(t, err) + }) + }) +} + func createSimpleUser() models.User { user := models.User{ Id: 1,