Files
grafana/pkg/login/grafana_login_test.go

135 lines
3.6 KiB
Go
Raw Normal View History

2018-01-26 10:41:41 +01:00
package login
import (
"context"
2018-01-26 10:41:41 +01:00
"testing"
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/models"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2018-01-26 10:41:41 +01:00
)
func TestLoginUsingGrafanaDB(t *testing.T) {
grafanaLoginScenario(t, "When login with non-existing user", func(sc *grafanaLoginScenarioContext) {
sc.withNonExistingUser()
err := loginUsingGrafanaDB(context.Background(), sc.loginUserQuery)
require.EqualError(t, err, models.ErrUserNotFound.Error())
2018-01-26 10:41:41 +01:00
assert.False(t, sc.validatePasswordCalled)
assert.Nil(t, sc.loginUserQuery.User)
})
2018-01-26 10:41:41 +01:00
grafanaLoginScenario(t, "When login with invalid credentials", func(sc *grafanaLoginScenarioContext) {
sc.withInvalidPassword()
err := loginUsingGrafanaDB(context.Background(), sc.loginUserQuery)
2018-01-26 10:41:41 +01:00
require.EqualError(t, err, ErrInvalidCredentials.Error())
2018-01-26 10:41:41 +01:00
assert.True(t, sc.validatePasswordCalled)
assert.Nil(t, sc.loginUserQuery.User)
})
2018-01-26 10:41:41 +01:00
grafanaLoginScenario(t, "When login with valid credentials", func(sc *grafanaLoginScenarioContext) {
sc.withValidCredentials()
err := loginUsingGrafanaDB(context.Background(), sc.loginUserQuery)
require.NoError(t, err)
assert.True(t, sc.validatePasswordCalled)
require.NotNil(t, sc.loginUserQuery.User)
assert.Equal(t, sc.loginUserQuery.Username, sc.loginUserQuery.User.Login)
assert.Equal(t, sc.loginUserQuery.Password, sc.loginUserQuery.User.Password)
})
grafanaLoginScenario(t, "When login with disabled user", func(sc *grafanaLoginScenarioContext) {
sc.withDisabledUser()
err := loginUsingGrafanaDB(context.Background(), sc.loginUserQuery)
require.EqualError(t, err, ErrUserDisabled.Error())
assert.False(t, sc.validatePasswordCalled)
assert.Nil(t, sc.loginUserQuery.User)
2018-01-26 10:41:41 +01:00
})
}
type grafanaLoginScenarioContext struct {
loginUserQuery *models.LoginUserQuery
2018-01-26 10:41:41 +01:00
validatePasswordCalled bool
}
type grafanaLoginScenarioFunc func(c *grafanaLoginScenarioContext)
func grafanaLoginScenario(t *testing.T, desc string, fn grafanaLoginScenarioFunc) {
t.Helper()
t.Run(desc, func(t *testing.T) {
2018-01-26 10:41:41 +01:00
origValidatePassword := validatePassword
sc := &grafanaLoginScenarioContext{
loginUserQuery: &models.LoginUserQuery{
2018-01-26 10:41:41 +01:00
Username: "user",
Password: "pwd",
IpAddress: "192.168.1.1:56433",
},
validatePasswordCalled: false,
}
t.Cleanup(func() {
2018-01-26 10:41:41 +01:00
validatePassword = origValidatePassword
})
2018-01-26 10:41:41 +01:00
fn(sc)
})
}
func mockPasswordValidation(valid bool, sc *grafanaLoginScenarioContext) {
validatePassword = func(providedPassword string, userPassword string, userSalt string) error {
sc.validatePasswordCalled = true
if !valid {
return ErrInvalidCredentials
}
return nil
}
}
func (sc *grafanaLoginScenarioContext) getUserByLoginQueryReturns(user *models.User) {
bus.AddHandler("test", func(query *models.GetUserByLoginQuery) error {
2018-01-26 10:41:41 +01:00
if user == nil {
return models.ErrUserNotFound
2018-01-26 10:41:41 +01:00
}
query.Result = user
return nil
})
}
func (sc *grafanaLoginScenarioContext) withValidCredentials() {
sc.getUserByLoginQueryReturns(&models.User{
2018-01-26 10:41:41 +01:00
Id: 1,
Login: sc.loginUserQuery.Username,
Password: sc.loginUserQuery.Password,
Salt: "salt",
})
mockPasswordValidation(true, sc)
}
func (sc *grafanaLoginScenarioContext) withNonExistingUser() {
sc.getUserByLoginQueryReturns(nil)
}
func (sc *grafanaLoginScenarioContext) withInvalidPassword() {
sc.getUserByLoginQueryReturns(&models.User{
2018-01-26 10:41:41 +01:00
Password: sc.loginUserQuery.Password,
Salt: "salt",
})
mockPasswordValidation(false, sc)
}
func (sc *grafanaLoginScenarioContext) withDisabledUser() {
sc.getUserByLoginQueryReturns(&models.User{
IsDisabled: true,
})
}