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:
Emil Hessman
2021-01-01 14:10:12 +01:00
committed by GitHub
parent 71899a0ed7
commit d236eabe8c
+126 -144
View File
@@ -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)
}) })