customer/internal/service/amocrm/amocrm_test.go
2023-05-16 04:12:34 +03:00

523 lines
17 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
})
}