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