Chore: Rewrite login auth test to standard library (#29985)
* Chore: Rewrite login auth test to standard library * Use assert.Empty when empty string expected
This commit is contained in:
+126
-144
@@ -4,177 +4,157 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
. "github.com/smartystreets/goconvey/convey"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/services/ldap"
|
"github.com/grafana/grafana/pkg/services/ldap"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAuthenticateUser(t *testing.T) {
|
func TestAuthenticateUser(t *testing.T) {
|
||||||
Convey("Authenticate user", t, func() {
|
authScenario(t, "When a user authenticates without setting a password", func(sc *authScenarioContext) {
|
||||||
authScenario("When a user authenticates without setting a password", func(sc *authScenarioContext) {
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginUsingGrafanaDB(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(nil, sc)
|
mockLoginUsingLDAP(false, nil, sc)
|
||||||
mockLoginUsingLDAP(false, nil, sc)
|
|
||||||
|
|
||||||
loginQuery := models.LoginUserQuery{
|
loginQuery := models.LoginUserQuery{
|
||||||
Username: "user",
|
Username: "user",
|
||||||
Password: "",
|
Password: "",
|
||||||
}
|
}
|
||||||
err := authenticateUser(&loginQuery)
|
err := authenticateUser(&loginQuery)
|
||||||
|
|
||||||
Convey("login should fail", func() {
|
require.EqualError(t, err, ErrPasswordEmpty.Error())
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeFalse)
|
assert.False(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeFalse)
|
assert.False(t, sc.ldapLoginWasCalled)
|
||||||
So(err, ShouldEqual, ErrPasswordEmpty)
|
assert.Empty(t, sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When a user authenticates having too many login attempts", func(sc *authScenarioContext) {
|
authScenario(t, "When a user authenticates having too many login attempts", func(sc *authScenarioContext) {
|
||||||
mockLoginAttemptValidation(ErrTooManyLoginAttempts, sc)
|
mockLoginAttemptValidation(ErrTooManyLoginAttempts, sc)
|
||||||
mockLoginUsingGrafanaDB(nil, sc)
|
mockLoginUsingGrafanaDB(nil, sc)
|
||||||
mockLoginUsingLDAP(true, nil, sc)
|
mockLoginUsingLDAP(true, nil, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.EqualError(t, err, ErrTooManyLoginAttempts.Error())
|
||||||
So(err, ShouldEqual, ErrTooManyLoginAttempts)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.False(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeFalse)
|
assert.False(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeFalse)
|
assert.False(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeFalse)
|
assert.Empty(t, sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When grafana user authenticate with valid credentials", func(sc *authScenarioContext) {
|
authScenario(t, "When grafana user authenticate with valid credentials", func(sc *authScenarioContext) {
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(nil, sc)
|
mockLoginUsingGrafanaDB(nil, sc)
|
||||||
mockLoginUsingLDAP(true, ErrInvalidCredentials, sc)
|
mockLoginUsingLDAP(true, ErrInvalidCredentials, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.NoError(t, err)
|
||||||
So(err, ShouldEqual, nil)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.False(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeFalse)
|
assert.False(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeFalse)
|
assert.Equal(t, "grafana", sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "grafana")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When grafana user authenticate and unexpected error occurs", func(sc *authScenarioContext) {
|
authScenario(t, "When grafana user authenticate and unexpected error occurs", func(sc *authScenarioContext) {
|
||||||
customErr := errors.New("custom")
|
customErr := errors.New("custom")
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(customErr, sc)
|
mockLoginUsingGrafanaDB(customErr, sc)
|
||||||
mockLoginUsingLDAP(true, ErrInvalidCredentials, sc)
|
mockLoginUsingLDAP(true, ErrInvalidCredentials, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.EqualError(t, err, customErr.Error())
|
||||||
So(err, ShouldEqual, customErr)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.False(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeFalse)
|
assert.False(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeFalse)
|
assert.Equal(t, "grafana", sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "grafana")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When a non-existing grafana user authenticate and ldap disabled", func(sc *authScenarioContext) {
|
authScenario(t, "When a non-existing grafana user authenticate and ldap disabled", func(sc *authScenarioContext) {
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
||||||
mockLoginUsingLDAP(false, nil, sc)
|
mockLoginUsingLDAP(false, nil, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.EqualError(t, err, models.ErrUserNotFound.Error())
|
||||||
So(err, ShouldEqual, models.ErrUserNotFound)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeTrue)
|
assert.False(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeFalse)
|
assert.Empty(t, sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When a non-existing grafana user authenticate and invalid ldap credentials", func(sc *authScenarioContext) {
|
authScenario(t, "When a non-existing grafana user authenticate and invalid ldap credentials", func(sc *authScenarioContext) {
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
||||||
mockLoginUsingLDAP(true, ldap.ErrInvalidCredentials, sc)
|
mockLoginUsingLDAP(true, ldap.ErrInvalidCredentials, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.EqualError(t, err, ErrInvalidCredentials.Error())
|
||||||
So(err, ShouldEqual, ErrInvalidCredentials)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeTrue)
|
assert.Equal(t, "ldap", sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "ldap")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When a non-existing grafana user authenticate and valid ldap credentials", func(sc *authScenarioContext) {
|
authScenario(t, "When a non-existing grafana user authenticate and valid ldap credentials", func(sc *authScenarioContext) {
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
||||||
mockLoginUsingLDAP(true, nil, sc)
|
mockLoginUsingLDAP(true, nil, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.NoError(t, err)
|
||||||
So(err, ShouldBeNil)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeTrue)
|
assert.False(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeFalse)
|
assert.Equal(t, "ldap", sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "ldap")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When a non-existing grafana user authenticate and ldap returns unexpected error", func(sc *authScenarioContext) {
|
authScenario(t, "When a non-existing grafana user authenticate and ldap returns unexpected error", func(sc *authScenarioContext) {
|
||||||
customErr := errors.New("custom")
|
customErr := errors.New("custom")
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
mockLoginUsingGrafanaDB(models.ErrUserNotFound, sc)
|
||||||
mockLoginUsingLDAP(true, customErr, sc)
|
mockLoginUsingLDAP(true, customErr, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.EqualError(t, err, customErr.Error())
|
||||||
So(err, ShouldEqual, customErr)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeTrue)
|
assert.False(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeFalse)
|
assert.Equal(t, "ldap", sc.loginUserQuery.AuthModule)
|
||||||
So(sc.loginUserQuery.AuthModule, ShouldEqual, "ldap")
|
})
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
authScenario("When grafana user authenticate with invalid credentials and invalid ldap credentials", func(sc *authScenarioContext) {
|
authScenario(t, "When grafana user authenticate with invalid credentials and invalid ldap credentials", func(sc *authScenarioContext) {
|
||||||
mockLoginAttemptValidation(nil, sc)
|
mockLoginAttemptValidation(nil, sc)
|
||||||
mockLoginUsingGrafanaDB(ErrInvalidCredentials, sc)
|
mockLoginUsingGrafanaDB(ErrInvalidCredentials, sc)
|
||||||
mockLoginUsingLDAP(true, ldap.ErrInvalidCredentials, sc)
|
mockLoginUsingLDAP(true, ldap.ErrInvalidCredentials, sc)
|
||||||
mockSaveInvalidLoginAttempt(sc)
|
mockSaveInvalidLoginAttempt(sc)
|
||||||
|
|
||||||
err := authenticateUser(sc.loginUserQuery)
|
err := authenticateUser(sc.loginUserQuery)
|
||||||
|
|
||||||
Convey("it should result in", func() {
|
require.EqualError(t, err, ErrInvalidCredentials.Error())
|
||||||
So(err, ShouldEqual, ErrInvalidCredentials)
|
assert.True(t, sc.loginAttemptValidationWasCalled)
|
||||||
So(sc.loginAttemptValidationWasCalled, ShouldBeTrue)
|
assert.True(t, sc.grafanaLoginWasCalled)
|
||||||
So(sc.grafanaLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.ldapLoginWasCalled)
|
||||||
So(sc.ldapLoginWasCalled, ShouldBeTrue)
|
assert.True(t, sc.saveInvalidLoginAttemptWasCalled)
|
||||||
So(sc.saveInvalidLoginAttemptWasCalled, ShouldBeTrue)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,8 +196,10 @@ func mockSaveInvalidLoginAttempt(sc *authScenarioContext) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func authScenario(desc string, fn authScenarioFunc) {
|
func authScenario(t *testing.T, desc string, fn authScenarioFunc) {
|
||||||
Convey(desc, func() {
|
t.Helper()
|
||||||
|
|
||||||
|
t.Run(desc, func(t *testing.T) {
|
||||||
origLoginUsingGrafanaDB := loginUsingGrafanaDB
|
origLoginUsingGrafanaDB := loginUsingGrafanaDB
|
||||||
origLoginUsingLDAP := loginUsingLDAP
|
origLoginUsingLDAP := loginUsingLDAP
|
||||||
origValidateLoginAttempts := validateLoginAttempts
|
origValidateLoginAttempts := validateLoginAttempts
|
||||||
@@ -231,12 +213,12 @@ func authScenario(desc string, fn authScenarioFunc) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
t.Cleanup(func() {
|
||||||
loginUsingGrafanaDB = origLoginUsingGrafanaDB
|
loginUsingGrafanaDB = origLoginUsingGrafanaDB
|
||||||
loginUsingLDAP = origLoginUsingLDAP
|
loginUsingLDAP = origLoginUsingLDAP
|
||||||
validateLoginAttempts = origValidateLoginAttempts
|
validateLoginAttempts = origValidateLoginAttempts
|
||||||
saveInvalidLoginAttempt = origSaveInvalidLoginAttempt
|
saveInvalidLoginAttempt = origSaveInvalidLoginAttempt
|
||||||
}()
|
})
|
||||||
|
|
||||||
fn(sc)
|
fn(sc)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user