generated from PenaSide/GolangTemplate
523 lines
17 KiB
Go
523 lines
17 KiB
Go
package amocrm_test
|
||
|
||
import (
|
||
"context"
|
||
"strconv"
|
||
"testing"
|
||
|
||
"github.com/sirupsen/logrus"
|
||
"github.com/stretchr/testify/assert"
|
||
"github.com/stretchr/testify/mock"
|
||
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/errors"
|
||
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/models"
|
||
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/service/amocrm"
|
||
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/service/amocrm/mocks"
|
||
)
|
||
|
||
var (
|
||
inputCode = "input-code"
|
||
|
||
amocrmUserInformation = models.AmocrmUserInformation{
|
||
ID: 2,
|
||
UUID: "geagae0-13413g-gadg",
|
||
}
|
||
|
||
amocrmUser = models.AmocrmUser{
|
||
UserID: "153-35-5135",
|
||
Information: amocrmUserInformation,
|
||
}
|
||
|
||
authUser = models.AuthUser{
|
||
ID: "1geat",
|
||
Login: "gkohoeh",
|
||
}
|
||
|
||
authTokens = models.Tokens{
|
||
AccessToken: "auth-251-access-token-auth",
|
||
RefreshToken: "auth-7582-refresh-token-auth",
|
||
}
|
||
)
|
||
|
||
func TestAmocrmLink(t *testing.T) {
|
||
t.Run("Успешная привязка аккаунта amocrm", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getAuthUserCall := authService.EXPECT().
|
||
GetAuthUserByToken(mock.Anything, authTokens.AccessToken).
|
||
Return(&authUser, nil).
|
||
Once()
|
||
|
||
getUserInformationCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
findByAmocrmIDCall := amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrNoRecord).
|
||
NotBefore(getUserInformationCall).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
Insert(mock.Anything, &models.AmocrmUser{
|
||
UserID: authUser.ID,
|
||
AmocrmID: strconv.Itoa(int(amocrmUserInformation.ID)),
|
||
Information: amocrmUserInformation,
|
||
}).
|
||
Return(&amocrmUser, nil).
|
||
NotBefore(getAuthUserCall, findByAmocrmIDCall).
|
||
Once()
|
||
|
||
isLinked, err := amocrmService.Link(context.Background(), inputCode, authTokens.AccessToken)
|
||
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, true, isLinked)
|
||
})
|
||
|
||
t.Run("Ошибка получения пользователя ЕСА по токену при привязке аккаунта amocrm", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
authService.EXPECT().
|
||
GetAuthUserByToken(mock.Anything, authTokens.AccessToken).
|
||
Return(&authUser, errors.ErrInvalidArgs).
|
||
Once()
|
||
|
||
oauthService.AssertNotCalled(t, "GetUserInformationByCode")
|
||
amocrmRepository.AssertNotCalled(t, "FindByID")
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
|
||
isLinked, err := amocrmService.Link(context.Background(), inputCode, authTokens.AccessToken)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrInvalidArgs.Error())
|
||
assert.Equal(t, false, isLinked)
|
||
})
|
||
|
||
t.Run("Ошибка получения пользователя amocrm по коду при привязке аккаунта amocrm", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
authService.EXPECT().
|
||
GetAuthUserByToken(mock.Anything, authTokens.AccessToken).
|
||
Return(&authUser, nil).
|
||
Once()
|
||
|
||
oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(nil, errors.ErrInvalidArgs).
|
||
Once()
|
||
|
||
amocrmRepository.AssertNotCalled(t, "FindByID")
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
|
||
isLinked, err := amocrmService.Link(context.Background(), inputCode, authTokens.AccessToken)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrInvalidArgs.Error())
|
||
assert.Equal(t, false, isLinked)
|
||
})
|
||
|
||
t.Run("Ошибка привязки аккаунта amocrm: пользователь уже существует", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getAuthUserCall := authService.EXPECT().
|
||
GetAuthUserByToken(mock.Anything, authTokens.AccessToken).
|
||
Return(&authUser, nil).
|
||
Once()
|
||
|
||
getUserInformationCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
NotBefore(getAuthUserCall).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(&amocrmUser, nil).
|
||
NotBefore(getUserInformationCall).
|
||
Once()
|
||
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
|
||
isLinked, err := amocrmService.Link(context.Background(), inputCode, authTokens.AccessToken)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrRecordAlreadyExist.Error())
|
||
assert.Equal(t, false, isLinked)
|
||
})
|
||
|
||
t.Run("Неизвестная ошибка при поиске пользователя amocrm в БД при привязке аккаунта", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
authService.EXPECT().
|
||
GetAuthUserByToken(mock.Anything, authTokens.AccessToken).
|
||
Return(&authUser, nil).
|
||
Once()
|
||
|
||
getUserInformationCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrDecodeRecord).
|
||
NotBefore(getUserInformationCall).
|
||
Once()
|
||
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
|
||
isLinked, err := amocrmService.Link(context.Background(), inputCode, authTokens.AccessToken)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrDecodeRecord.Error())
|
||
assert.Equal(t, false, isLinked)
|
||
})
|
||
|
||
t.Run("Непредвиденная ошибка поиска пользователя amocrm при привязке аккаунта amocrm", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getAuthUserCall := authService.EXPECT().
|
||
GetAuthUserByToken(mock.Anything, authTokens.AccessToken).
|
||
Return(&authUser, nil).
|
||
Once()
|
||
|
||
getUserInformationCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
findByAmocrmIDCall := amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrNoRecord).
|
||
NotBefore(getUserInformationCall).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
Insert(mock.Anything, &models.AmocrmUser{
|
||
UserID: authUser.ID,
|
||
AmocrmID: strconv.Itoa(int(amocrmUserInformation.ID)),
|
||
Information: amocrmUserInformation,
|
||
}).
|
||
Return(nil, errors.ErrInsertRecord).
|
||
NotBefore(getAuthUserCall, findByAmocrmIDCall).
|
||
Once()
|
||
|
||
isLinked, err := amocrmService.Link(context.Background(), inputCode, authTokens.AccessToken)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrInsertRecord.Error())
|
||
assert.Equal(t, false, isLinked)
|
||
})
|
||
}
|
||
|
||
func TestAmocrmAuth(t *testing.T) {
|
||
t.Run("Успешная авторизация аккаунта через amocrm (пользователь отсутствует в системе)", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getUserInfoByCodeCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
findByIDCall := amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrNoRecord).
|
||
NotBefore(getUserInfoByCodeCall).
|
||
Once()
|
||
|
||
registerCall := authService.EXPECT().
|
||
Register(mock.Anything, &models.AuthUserInformation{}).
|
||
Return(&authTokens, authUser.ID, nil).
|
||
NotBefore(findByIDCall).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
Insert(mock.Anything, &models.AmocrmUser{
|
||
UserID: authUser.ID,
|
||
AmocrmID: strconv.Itoa(int(amocrmUserInformation.ID)),
|
||
Information: amocrmUserInformation,
|
||
}).
|
||
Return(&amocrmUser, nil).
|
||
NotBefore(registerCall).
|
||
Once()
|
||
|
||
authService.AssertNotCalled(t, "Login")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, &authTokens, tokens)
|
||
})
|
||
|
||
t.Run("Успешная авторизация аккаунта через amocrm (пользователь присутствует в системе)", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getUserInfoByCodeCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
findByIDCall := amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(&amocrmUser, nil).
|
||
NotBefore(getUserInfoByCodeCall).
|
||
Once()
|
||
|
||
authService.EXPECT().
|
||
Login(mock.Anything, amocrmUser.UserID).
|
||
Return(&authTokens, nil).
|
||
NotBefore(findByIDCall).
|
||
Once()
|
||
|
||
authService.AssertNotCalled(t, "Register")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, &authTokens, tokens)
|
||
})
|
||
|
||
t.Run("Ошибка логина при авторизации через amocrm (пользователь присутствует в системе)", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getUserInfoByCodeCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(&amocrmUser, nil).
|
||
NotBefore(getUserInfoByCodeCall).
|
||
Once()
|
||
|
||
authService.EXPECT().
|
||
Login(mock.Anything, amocrmUser.UserID).
|
||
Return(nil, errors.ErrMethodNotImplemented).
|
||
Once()
|
||
|
||
authService.AssertNotCalled(t, "Register")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrMethodNotImplemented.Error())
|
||
assert.Nil(t, tokens)
|
||
})
|
||
|
||
t.Run("Ошибка добавления пользователя amocrm в БД", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getUserInfoByCodeCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrNoRecord).
|
||
NotBefore(getUserInfoByCodeCall).
|
||
Once()
|
||
|
||
authService.EXPECT().
|
||
Register(mock.Anything, &models.AuthUserInformation{}).
|
||
Return(&authTokens, authUser.ID, nil).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
Insert(mock.Anything, &models.AmocrmUser{
|
||
UserID: authUser.ID,
|
||
AmocrmID: strconv.Itoa(int(amocrmUserInformation.ID)),
|
||
Information: amocrmUserInformation,
|
||
}).
|
||
Return(nil, errors.ErrInsertRecord).
|
||
Once()
|
||
|
||
authService.AssertNotCalled(t, "Login")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrInsertRecord.Error())
|
||
assert.Nil(t, tokens)
|
||
})
|
||
|
||
t.Run("Ошибка регистрации пользователя amocrm", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getUserInfoByCodeCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrNoRecord).
|
||
NotBefore(getUserInfoByCodeCall).
|
||
Once()
|
||
|
||
authService.EXPECT().
|
||
Register(mock.Anything, &models.AuthUserInformation{}).
|
||
Return(nil, "", errors.ErrMethodNotImplemented).
|
||
Once()
|
||
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
authService.AssertNotCalled(t, "Login")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrMethodNotImplemented.Error())
|
||
assert.Nil(t, tokens)
|
||
})
|
||
|
||
t.Run("Ошибка получения пользователя amocrm при авторизации через аккаунт", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
getUserInfoByCodeCall := oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(&amocrmUserInformation, nil).
|
||
Once()
|
||
|
||
amocrmRepository.EXPECT().
|
||
FindByID(mock.Anything, strconv.Itoa(int(amocrmUserInformation.ID))).
|
||
Return(nil, errors.ErrFindRecord).
|
||
NotBefore(getUserInfoByCodeCall).
|
||
Once()
|
||
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
authService.AssertNotCalled(t, "Login")
|
||
authService.AssertNotCalled(t, "Register")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrFindRecord.Error())
|
||
assert.Nil(t, tokens)
|
||
})
|
||
|
||
t.Run("Ошибка получения информации пользователя amocrm при авторизации через аккаунт", func(t *testing.T) {
|
||
oauthService := mocks.NewOauthService[models.AmocrmUserInformation](t)
|
||
authService := mocks.NewAuthService(t)
|
||
amocrmRepository := mocks.NewAmocrmRepository(t)
|
||
amocrmService := amocrm.New(&amocrm.Deps{
|
||
Logger: logrus.New(),
|
||
AuthService: authService,
|
||
OAuthService: oauthService,
|
||
Repository: amocrmRepository,
|
||
})
|
||
|
||
oauthService.EXPECT().
|
||
GetUserInformationByCode(mock.Anything, inputCode).
|
||
Return(nil, errors.ErrMethodNotImplemented).
|
||
Once()
|
||
|
||
amocrmRepository.AssertNotCalled(t, "Insert")
|
||
amocrmRepository.AssertNotCalled(t, "FindByID")
|
||
authService.AssertNotCalled(t, "Login")
|
||
authService.AssertNotCalled(t, "Register")
|
||
|
||
tokens, err := amocrmService.Auth(context.Background(), inputCode)
|
||
|
||
assert.Error(t, err)
|
||
assert.EqualError(t, err, errors.ErrMethodNotImplemented.Error())
|
||
assert.Nil(t, tokens)
|
||
})
|
||
}
|