2021-05-26 12:38:43 +02:00
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/golang/mock/gomock"
|
|
|
|
"github.com/mattermost/focalboard/server/model"
|
|
|
|
"github.com/mattermost/focalboard/server/services/auth"
|
|
|
|
"github.com/mattermost/focalboard/server/utils"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
var mockUser = &model.User{
|
2021-10-05 15:52:59 +02:00
|
|
|
ID: utils.NewID(utils.IDTypeUser),
|
2021-05-26 12:38:43 +02:00
|
|
|
Username: "testUsername",
|
|
|
|
Email: "testEmail",
|
|
|
|
Password: auth.HashPassword("testPassword"),
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLogin(t *testing.T) {
|
2021-08-25 22:08:01 +02:00
|
|
|
th, tearDown := SetupTestHelper(t)
|
|
|
|
defer tearDown()
|
2021-05-26 12:38:43 +02:00
|
|
|
|
|
|
|
testcases := []struct {
|
|
|
|
title string
|
|
|
|
userName string
|
|
|
|
email string
|
|
|
|
password string
|
|
|
|
mfa string
|
|
|
|
isError bool
|
|
|
|
}{
|
|
|
|
{"fail, missing login information", "", "", "", "", true},
|
|
|
|
{"fail, invalid username", "badUsername", "", "", "", true},
|
|
|
|
{"fail, invalid email", "", "badEmail", "", "", true},
|
|
|
|
{"fail, invalid password", "testUsername", "", "badPassword", "", true},
|
|
|
|
{"success, using username", "testUsername", "", "testPassword", "", false},
|
|
|
|
{"success, using email", "", "testEmail", "testPassword", "", false},
|
|
|
|
}
|
|
|
|
|
|
|
|
th.Store.EXPECT().GetUserByUsername("badUsername").Return(nil, errors.New("Bad Username"))
|
|
|
|
th.Store.EXPECT().GetUserByEmail("badEmail").Return(nil, errors.New("Bad Email"))
|
|
|
|
th.Store.EXPECT().GetUserByUsername("testUsername").Return(mockUser, nil).Times(2)
|
|
|
|
th.Store.EXPECT().GetUserByEmail("testEmail").Return(mockUser, nil)
|
|
|
|
th.Store.EXPECT().CreateSession(gomock.Any()).Return(nil).Times(2)
|
|
|
|
|
|
|
|
for _, test := range testcases {
|
|
|
|
t.Run(test.title, func(t *testing.T) {
|
|
|
|
token, err := th.App.Login(test.userName, test.email, test.password, test.mfa)
|
|
|
|
if test.isError {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.NotNil(t, token)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetUser(t *testing.T) {
|
2021-08-25 22:08:01 +02:00
|
|
|
th, tearDown := SetupTestHelper(t)
|
|
|
|
defer tearDown()
|
2021-05-26 12:38:43 +02:00
|
|
|
|
|
|
|
testcases := []struct {
|
|
|
|
title string
|
|
|
|
id string
|
|
|
|
isError bool
|
|
|
|
}{
|
|
|
|
{"fail, missing id", "", true},
|
|
|
|
{"fail, invalid id", "badID", true},
|
|
|
|
{"success", "goodID", false},
|
|
|
|
}
|
|
|
|
|
2021-06-21 11:21:42 +02:00
|
|
|
th.Store.EXPECT().GetUserByID("badID").Return(nil, errors.New("Bad Id"))
|
|
|
|
th.Store.EXPECT().GetUserByID("goodID").Return(mockUser, nil)
|
2021-05-26 12:38:43 +02:00
|
|
|
|
|
|
|
for _, test := range testcases {
|
|
|
|
t.Run(test.title, func(t *testing.T) {
|
|
|
|
token, err := th.App.GetUser(test.id)
|
|
|
|
if test.isError {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.NotNil(t, token)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRegisterUser(t *testing.T) {
|
2021-08-25 22:08:01 +02:00
|
|
|
th, tearDown := SetupTestHelper(t)
|
|
|
|
defer tearDown()
|
2021-05-26 12:38:43 +02:00
|
|
|
|
|
|
|
testcases := []struct {
|
|
|
|
title string
|
|
|
|
userName string
|
|
|
|
email string
|
|
|
|
password string
|
|
|
|
isError bool
|
|
|
|
}{
|
|
|
|
{"fail, missing login information", "", "", "", true},
|
|
|
|
{"fail, username exists", "existingUsername", "", "", true},
|
|
|
|
{"fail, email exists", "", "existingEmail", "", true},
|
|
|
|
{"fail, invalid password", "newUsername", "", "test", true},
|
|
|
|
{"success, using email", "", "newEmail", "testPassword", false},
|
|
|
|
}
|
|
|
|
|
|
|
|
th.Store.EXPECT().GetUserByUsername("existingUsername").Return(mockUser, nil)
|
|
|
|
th.Store.EXPECT().GetUserByUsername("newUsername").Return(mockUser, errors.New("user not found"))
|
|
|
|
th.Store.EXPECT().GetUserByEmail("existingEmail").Return(mockUser, nil)
|
|
|
|
th.Store.EXPECT().GetUserByEmail("newEmail").Return(nil, errors.New("email not found"))
|
|
|
|
th.Store.EXPECT().CreateUser(gomock.Any()).Return(nil)
|
|
|
|
|
|
|
|
for _, test := range testcases {
|
|
|
|
t.Run(test.title, func(t *testing.T) {
|
|
|
|
err := th.App.RegisterUser(test.userName, test.email, test.password)
|
|
|
|
if test.isError {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUpdateUserPassword(t *testing.T) {
|
2021-08-25 22:08:01 +02:00
|
|
|
th, tearDown := SetupTestHelper(t)
|
|
|
|
defer tearDown()
|
2021-05-26 12:38:43 +02:00
|
|
|
|
|
|
|
testcases := []struct {
|
|
|
|
title string
|
|
|
|
userName string
|
|
|
|
password string
|
|
|
|
isError bool
|
|
|
|
}{
|
|
|
|
{"fail, missing login information", "", "", true},
|
|
|
|
{"fail, invalid username", "badUsername", "", true},
|
|
|
|
{"success, username", "testUsername", "testPassword", false},
|
|
|
|
}
|
|
|
|
|
|
|
|
th.Store.EXPECT().UpdateUserPassword("", gomock.Any()).Return(errors.New("user not found"))
|
|
|
|
th.Store.EXPECT().UpdateUserPassword("badUsername", gomock.Any()).Return(errors.New("user not found"))
|
|
|
|
th.Store.EXPECT().UpdateUserPassword("testUsername", gomock.Any()).Return(nil)
|
|
|
|
|
|
|
|
for _, test := range testcases {
|
|
|
|
t.Run(test.title, func(t *testing.T) {
|
|
|
|
err := th.App.UpdateUserPassword(test.userName, test.password)
|
|
|
|
if test.isError {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestChangePassword(t *testing.T) {
|
2021-08-25 22:08:01 +02:00
|
|
|
th, tearDown := SetupTestHelper(t)
|
|
|
|
defer tearDown()
|
2021-05-26 12:38:43 +02:00
|
|
|
|
|
|
|
testcases := []struct {
|
|
|
|
title string
|
|
|
|
userName string
|
|
|
|
oldPassword string
|
|
|
|
password string
|
|
|
|
isError bool
|
|
|
|
}{
|
|
|
|
{"fail, missing login information", "", "", "", true},
|
|
|
|
{"fail, invalid userId", "badID", "", "", true},
|
|
|
|
{"fail, invalid password", mockUser.ID, "wrongPassword", "newPassword", true},
|
|
|
|
{"success, using username", mockUser.ID, "testPassword", "newPassword", false},
|
|
|
|
}
|
|
|
|
|
2021-06-21 11:21:42 +02:00
|
|
|
th.Store.EXPECT().GetUserByID("badID").Return(nil, errors.New("userID not found"))
|
|
|
|
th.Store.EXPECT().GetUserByID(mockUser.ID).Return(mockUser, nil).Times(2)
|
2021-05-26 12:38:43 +02:00
|
|
|
th.Store.EXPECT().UpdateUserPasswordByID(mockUser.ID, gomock.Any()).Return(nil)
|
|
|
|
|
|
|
|
for _, test := range testcases {
|
|
|
|
t.Run(test.title, func(t *testing.T) {
|
|
|
|
err := th.App.ChangePassword(test.userName, test.oldPassword, test.password)
|
|
|
|
if test.isError {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|