package oauth_test import ( "context" "testing" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "golang.org/x/oauth2" "penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/errors" "penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/service/oauth" "penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/service/oauth/mocks" ) type SocialUserInformation struct { ID string } var ( code = "code" socialUserInformation = SocialUserInformation{ ID: "userid1", } oauthTokens = oauth2.Token{ AccessToken: "access-token-auth", RefreshToken: "refresh-token-auth", } ) func TestGetUserInformationByCode(t *testing.T) { t.Run("Успешное получение информации о пользователе oauth через код", func(t *testing.T) { serviceClient := mocks.NewServiceClient[SocialUserInformation](t) oauthClient := mocks.NewOauthClient(t) oauthService := oauth.New(&oauth.Deps[SocialUserInformation]{ Logger: logrus.New(), ServiceClient: serviceClient, OAuthClient: oauthClient, }) oauthCodeExchangeCall := oauthClient.EXPECT(). Exchange(mock.Anything, code). Return(&oauthTokens, nil). Once() serviceClient.EXPECT(). GetUserInformation(mock.Anything, oauthTokens.AccessToken). Return(&socialUserInformation, nil). NotBefore(oauthCodeExchangeCall). Once() information, err := oauthService.GetUserInformationByCode(context.Background(), code) assert.NoError(t, err) assert.Equal(t, &socialUserInformation, information) }) t.Run("Ошибка при запросе за информацией о пользователе oauth системы", func(t *testing.T) { serviceClient := mocks.NewServiceClient[SocialUserInformation](t) oauthClient := mocks.NewOauthClient(t) oauthService := oauth.New(&oauth.Deps[SocialUserInformation]{ Logger: logrus.New(), ServiceClient: serviceClient, OAuthClient: oauthClient, }) oauthCodeExchangeCall := oauthClient.EXPECT(). Exchange(mock.Anything, code). Return(&oauthTokens, nil). Once() serviceClient.EXPECT(). GetUserInformation(mock.Anything, oauthTokens.AccessToken). Return(nil, errors.ErrEmptyArgs). NotBefore(oauthCodeExchangeCall). Once() information, err := oauthService.GetUserInformationByCode(context.Background(), code) assert.Error(t, err) assert.EqualError(t, err, errors.ErrEmptyArgs.Error()) assert.Nil(t, information) }) t.Run("Ошибка при обмене ключа на токены при получении информации об oauth пользователе", func(t *testing.T) { serviceClient := mocks.NewServiceClient[SocialUserInformation](t) oauthClient := mocks.NewOauthClient(t) oauthService := oauth.New(&oauth.Deps[SocialUserInformation]{ Logger: logrus.New(), ServiceClient: serviceClient, OAuthClient: oauthClient, }) oauthClient.EXPECT(). Exchange(mock.Anything, code). Return(nil, errors.ErrEmptyArgs). Once() serviceClient.AssertNotCalled(t, "GetUserInformation") information, err := oauthService.GetUserInformationByCode(context.Background(), code) assert.Error(t, err) assert.EqualError(t, err, errors.ErrEmptyArgs.Error()) assert.Nil(t, information) }) } func TestGenerateURL(t *testing.T) { generatedLink := "https://link" accessToken := "access-token" t.Run("Успешная генерация ссылки авторизации", func(t *testing.T) { oauthClient := mocks.NewOauthClient(t) oauthService := oauth.New(&oauth.Deps[any]{ OAuthClient: oauthClient, }) oauthClient.EXPECT().AuthCodeURL(oauthService.GetState(), oauth2.AccessTypeOffline).Return(generatedLink).Once() assert.Equal(t, generatedLink, oauthService.GenerateAuthURL()) }) t.Run("Успешная генерация ссылки привязки аккаунта", func(t *testing.T) { oauthClient := mocks.NewOauthClient(t) oauthService := oauth.New(&oauth.Deps[any]{ OAuthClient: oauthClient, }) oauthClient.EXPECT(). AuthCodeURL( oauthService.GetState(), oauth2.AccessTypeOffline, oauth2.SetAuthURLParam("accessToken", accessToken), ). Return(generatedLink). Once() assert.Equal(t, generatedLink, oauthService.GenerateLinkURL(accessToken)) }) } func TestGetState(t *testing.T) { t.Run("Успешное получение state", func(t *testing.T) { oauthService := oauth.New(&oauth.Deps[any]{}) assert.NotEmpty(t, oauthService.GetState()) assert.NotNil(t, oauthService.GetState()) assert.NotZero(t, oauthService.GetState()) }) } func TestValidateState(t *testing.T) { t.Run("Невалидный state", func(t *testing.T) { oauthService := oauth.New(&oauth.Deps[any]{}) assert.Equal(t, false, oauthService.ValidateState("")) }) t.Run("Валидный state", func(t *testing.T) { oauthService := oauth.New(&oauth.Deps[any]{}) assert.Equal(t, true, oauthService.ValidateState(oauthService.GetState())) }) }