evcc-io/util/auth/auth_test.go

78 lines
2 KiB
Go

package auth
import (
"testing"
"time"
"github.com/evcc-io/evcc/core/keys"
"github.com/evcc-io/evcc/server/db/settings"
"github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock"
)
func TestSetAdminPassword(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mock := settings.NewMockAPI(ctrl)
auth := NewMock(mock)
password := "testpassword"
mock.EXPECT().SetString(keys.AdminPassword, gomock.Not(gomock.Eq("")))
assert.Nil(t, auth.SetAdminPassword(password)) // success
}
func TestRemoveAdminPassword(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mock := settings.NewMockAPI(ctrl)
auth := NewMock(mock)
mock.EXPECT().SetString(keys.JwtSecret, "")
mock.EXPECT().SetString(keys.AdminPassword, "")
auth.RemoveAdminPassword()
}
func TestIsAdminPasswordValid(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mock := settings.NewMockAPI(ctrl)
auth := NewMock(mock)
validPw := "testpassword"
invalidPw := "wrongpassword"
// password not set, reject
mock.EXPECT().String(keys.AdminPassword).Return("", nil).Times(1)
assert.False(t, auth.IsAdminPasswordValid(validPw))
// password set, accept
var storedHash string
mock.EXPECT().SetString(keys.AdminPassword, gomock.Not(gomock.Eq(""))).Do(func(_ string, hash string) { storedHash = hash })
auth.SetAdminPassword(validPw)
mock.EXPECT().String(keys.AdminPassword).Return(storedHash, nil).Times(2)
assert.True(t, auth.IsAdminPasswordValid(validPw))
// password set, wrong password
assert.False(t, auth.IsAdminPasswordValid(invalidPw))
}
func TestJwtToken(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mock := settings.NewMockAPI(ctrl)
auth := NewMock(mock)
mock.EXPECT().String(keys.JwtSecret).Return("somesecret", nil).AnyTimes()
lifetime := time.Hour
tokenString, err := auth.GenerateJwtToken(lifetime)
assert.Nil(t, err, "token generation failed")
assert.NotEmpty(t, tokenString, "token is empty")
ok, err := auth.ValidateJwtToken(tokenString)
assert.True(t, ok && err == nil, "token is invalid")
}