test(integration): set verification status

This commit is contained in:
Kirill 2023-06-16 12:47:11 +03:00
parent c8f062a175
commit 7b589821e8
19 changed files with 548 additions and 198 deletions

@ -50,7 +50,7 @@ RUN apk --no-cache add ca-certificates
# Create home directory
WORKDIR /app
# Copy migration dir
COPY --from=build /app/migrations/tests ./migrations
COPY --from=build /app/migrations/test ./migrations
# Install migrate tool
COPY --from=build /bin/golang-migrate /usr/local/bin

@ -0,0 +1,27 @@
# HTTP settings
HTTP_HOST=0.0.0.0
HTTP_PORT=8080
# MONGO settings
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_USER=test
MONGO_PASSWORD=test
MONGO_AUTH=admin
MONGO_DB_NAME=admin
# Auth Microservice settings
AUTH_MICROSERVICE_USER_URL=http://localhost:8000/user
# Hub Admin Microservice settings
HUBADMIN_MICROSERVICE_TARIFF_URL=http://localhost:8001/tariff
# Currency Microservice settings
CURRENCY_MICROSERVICE_TRANSLATE_URL=http://localhost:8002/change
# Admin
# JWT settings
JWT_ISSUER="pena-auth-service"
JWT_AUDIENCE="pena"
JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyt4XuLovUY7i12K2PIMbQZOKn+wFFKUvxvKQDel049/+VMpHMx1FLolUKuyGp9zi6gOwjHsBPgc9oqr/eaXGQSh7Ult7i9f+Ht563Y0er5UU9Zc5ZPSxf9O75KYD48ruGkqiFoncDqPENK4dtUa7w0OqlN4bwVBbmIsP8B3EDC5Dof+vtiNTSHSXPx+zifKeZGyknp+nyOHVrRDhPjOhzQzCom0MSZA/sJYmps8QZgiPA0k4Z6jTupDymPOIwYeD2C57zSxnAv0AfC3/pZYJbZYH/0TszRzmy052DME3zMnhMK0ikdN4nzYqU0dkkA5kb5GtKDymspHIJ9eWbUuwgtg8Rq/LrVBj1I3UFgs0ibio40k6gqinLKslc5Y1I5mro7J3OSEP5eO/XeDLOLlOJjEqkrx4fviI1cL3m5L6QV905xmcoNZG1+RmOg7D7cZQUf27TXqM381jkbNdktm1JLTcMScxuo3vaRftnIVw70V8P8sIkaKY8S8HU1sQgE2LB9t04oog5u59htx2FHv4B13NEm8tt8Tv1PexpB4UVh7PIualF6SxdFBrKbraYej72wgjXVPQ0eGXtGGD57j8DUEzk7DK2OvIWhehlVqtiRnFdAvdBj2ynHT2/5FJ/Zpd4n5dKGJcQvy1U1qWMs+8M7AHfWyt2+nZ04s48+bK3yMCAwEAAQ==\n-----END PUBLIC KEY-----"

@ -7,17 +7,34 @@ services:
dockerfile: Dockerfile
target: test
env_file:
- ../../.env.test
- .env.test
environment:
- AUTH_MICROSERVICE_EXHANGE_URL=http://mock:8080/exchange
- AUTH_MICROSERVICE_REGISTER_URL=http://mock:8080/register
- AUTH_MICROSERVICE_USER_URL=http://mock:8080/user
- AMOCRM_USER_INFO_URL=http://mock:8080/api/v4/account
- AMOCRM_ACCESS_TOKEN_URL=http://mock:8080/oauth2/access_token
- HTTP_HOST=0.0.0.0
- HTTP_PORT=8082
- GRPC_HOST=0.0.0.0
- GRPC_PORT=9082
- GRPC_DOMEN=customer-app:9082
- MONGO_HOST=mongo
- MONGO_PORT=27017
- MONGO_USER=test
- MONGO_PASSWORD=test
- MONGO_DB_NAME=admin
- MONGO_AUTH=admin
- JWT_ISSUER=issuer
- JWT_AUDIENCE=audience
- AUTH_MICROSERVICE_USER_URL=http://pena-auth-service:8000/user
- HUBADMIN_MICROSERVICE_TARIFF_URL=http://hub-admin-service:8010/tariff
- CURRENCY_MICROSERVICE_TRANSLATE_URL=http://cbrf-service:8020/translate
- DISCOUNT_MICROSERVICE_GRPC_HOST=discount-service:9040
- PAYMENT_MICROSERVICE_GRPC_HOST=treasurer-service:9085
ports:
- 8080:8080
- 8082:8082
depends_on:
- mongo
- migration
networks:
- integration_test
@ -31,7 +48,7 @@ services:
[
"sh",
"-c",
'migrate -source file://migrations -database "mongodb://$MONGO_USER:$MONGO_PASSWORD@$MONGO_HOST:$MONGO_PORT/$MONGO_AUTH?authSource=$MONGO_AUTH" up',
'migrate -source file://migrations -database "mongodb://test:test@mongo:27017/admin?authSource=admin" up',
]
depends_on:
- mongo
@ -48,14 +65,5 @@ services:
networks:
- integration_test
mock:
image: 'wiremock/wiremock:2.35.0'
ports:
- 8000:8080
networks:
- integration_test
depends_on:
- app
networks:
integration_test:

@ -7,7 +7,7 @@ var Account = struct {
Wallet string
Name string
Status string
Deleted string
IsDeleted string
CreatedAt string
UpdatedAt string
DeletedAt string
@ -18,7 +18,7 @@ var Account = struct {
Wallet: "wallet",
Name: "name",
Status: "status",
Deleted: "deleted",
IsDeleted: "isDeleted",
CreatedAt: "createdAt",
UpdatedAt: "updatedAt",
DeletedAt: "deletedAt",

@ -4,7 +4,7 @@ var Currency = struct {
ID string
Name string
Currencies string
Deleted string
IsDeleted string
CreatedAt string
UpdatedAt string
DeletedAt string
@ -12,7 +12,7 @@ var Currency = struct {
ID: "_id",
Name: "name",
Currencies: "currencies",
Deleted: "deleted",
IsDeleted: "isDeleted",
CreatedAt: "createdAt",
UpdatedAt: "updatedAt",
DeletedAt: "deletedAt",

@ -6,7 +6,7 @@ var History = struct {
Comment string
Subject string
Type string
Deleted string
IsDeleted string
CreatedAt string
UpdatedAt string
DeletedAt string
@ -16,7 +16,7 @@ var History = struct {
Comment: "comment",
Subject: "subject",
Type: "type",
Deleted: "deleted",
IsDeleted: "isDeleted",
CreatedAt: "createdAt",
UpdatedAt: "updatedAt",
DeletedAt: "deletedAt",

@ -44,8 +44,8 @@ func NewAccountRepository(deps AccountRepositoryDeps) *AccountRepository {
func (receiver *AccountRepository) FindByUserID(ctx context.Context, id string) (*models.Account, errors.Error) {
filter := bson.M{
fields.Account.UserID: id,
fields.Account.Deleted: false,
fields.Account.UserID: id,
fields.Account.IsDeleted: false,
}
account, err := mongoWrapper.FindOne[models.Account](ctx, &mongoWrapper.RequestSettings{
@ -74,7 +74,7 @@ func (receiver *AccountRepository) FindByUserID(ctx context.Context, id string)
}
func (receiver *AccountRepository) FindMany(ctx context.Context, page, limit int64) ([]models.Account, errors.Error) {
filter := bson.M{fields.Account.Deleted: false}
filter := bson.M{fields.Account.IsDeleted: false}
findOptions := options.Find()
skip := (page - 1) * limit
@ -129,12 +129,12 @@ func (receiver *AccountRepository) Remove(ctx context.Context, id string) (*mode
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: id,
fields.Account.Deleted: false,
fields.Account.UserID: id,
fields.Account.IsDeleted: false,
}
update := bson.M{"$set": bson.M{
fields.Account.Deleted: true,
fields.Account.IsDeleted: true,
fields.Account.DeletedAt: time.Now(),
}}
@ -163,8 +163,8 @@ func (receiver *AccountRepository) Delete(ctx context.Context, id string) (*mode
account := models.Account{}
filter := bson.M{
fields.Account.UserID: id,
fields.Account.Deleted: false,
fields.Account.UserID: id,
fields.Account.IsDeleted: false,
}
if err := receiver.mongoDB.FindOneAndDelete(ctx, filter).Decode(&account); err != nil {
@ -189,7 +189,7 @@ func (receiver *AccountRepository) Delete(ctx context.Context, id string) (*mode
}
func (receiver *AccountRepository) CountAll(ctx context.Context) (int64, errors.Error) {
count, err := receiver.mongoDB.CountDocuments(ctx, bson.M{fields.Account.Deleted: false})
count, err := receiver.mongoDB.CountDocuments(ctx, bson.M{fields.Account.IsDeleted: false})
if err != nil {
receiver.logger.Error("failed to count all documents on <CountAll> of <AccountRepository>", zap.Error(err))
@ -207,8 +207,8 @@ func (receiver *AccountRepository) AddItemToCart(ctx context.Context, userID, it
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: userID,
fields.Account.Deleted: false,
fields.Account.UserID: userID,
fields.Account.IsDeleted: false,
}
update := bson.M{
@ -243,8 +243,8 @@ func (receiver *AccountRepository) RemoveItemFromCart(ctx context.Context, userI
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: userID,
fields.Account.Deleted: false,
fields.Account.UserID: userID,
fields.Account.IsDeleted: false,
}
update := bson.M{
@ -279,8 +279,8 @@ func (receiver *AccountRepository) ChangeWallet(ctx context.Context, userID stri
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: userID,
fields.Account.Deleted: false,
fields.Account.UserID: userID,
fields.Account.IsDeleted: false,
}
update := bson.M{"$set": bson.M{
@ -315,8 +315,8 @@ func (receiver *AccountRepository) ClearCart(ctx context.Context, userID string)
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: userID,
fields.Account.Deleted: false,
fields.Account.UserID: userID,
fields.Account.IsDeleted: false,
}
update := bson.M{"$set": bson.M{
@ -350,8 +350,8 @@ func (receiver *AccountRepository) SetStatus(ctx context.Context, userID string,
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: userID,
fields.Account.Deleted: false,
fields.Account.UserID: userID,
fields.Account.IsDeleted: false,
}
update := bson.M{"$set": bson.M{
@ -386,8 +386,8 @@ func (receiver *AccountRepository) UpdateName(ctx context.Context, userID string
options := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.M{
fields.Account.UserID: userID,
fields.Account.Deleted: false,
fields.Account.UserID: userID,
fields.Account.IsDeleted: false,
}
update := bson.M{"$set": bson.M{

@ -43,8 +43,8 @@ func NewCurrencyRepository(deps CurrencyRepositoryDeps) *CurrencyRepository {
func (receiver *CurrencyRepository) FindCurrenciesList(ctx context.Context, name string) (*models.CurrencyList, errors.Error) {
filter := bson.M{
fields.Currency.Name: name,
fields.Account.Deleted: false,
fields.Currency.Name: name,
fields.Currency.IsDeleted: false,
}
currencyList, err := mongoWrapper.FindOne[models.CurrencyList](ctx, &mongoWrapper.RequestSettings{
@ -76,8 +76,8 @@ func (receiver *CurrencyRepository) ReplaceCurrencies(ctx context.Context, list
currencyList := models.CurrencyList{}
filter := bson.M{
fields.Currency.Name: list.Name,
fields.Account.Deleted: false,
fields.Currency.Name: list.Name,
fields.Currency.IsDeleted: false,
}
update := bson.M{

@ -62,7 +62,7 @@ func (receiver *HistoryRepository) Insert(ctx context.Context, history *models.H
}
func (receiver *HistoryRepository) FindMany(ctx context.Context, page, limit int64) ([]models.History, errors.Error) {
filter := bson.M{fields.Account.Deleted: false}
filter := bson.M{fields.Account.IsDeleted: false}
findOptions := options.Find()
skip := (page - 1) * limit
@ -92,7 +92,7 @@ func (receiver *HistoryRepository) FindMany(ctx context.Context, page, limit int
}
func (receiver *HistoryRepository) CountAll(ctx context.Context) (int64, errors.Error) {
count, err := receiver.mongoDB.CountDocuments(ctx, bson.M{fields.History.Deleted: false})
count, err := receiver.mongoDB.CountDocuments(ctx, bson.M{fields.History.IsDeleted: false})
if err != nil {
receiver.logger.Error("failed to count all documents on <CountAll> of <HistoryRepository>",
zap.Error(err),

@ -373,66 +373,66 @@ var swaggerSpec = []string{
"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",
"aPw7AAD//x8jBLeBRgAA",
"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",
"//8Ik+GHckYAAA==",
}
// GetSwagger returns the content of the embedded swagger specification file

@ -29,6 +29,29 @@ func NewJWT(configuration *models.JWTConfiguration) *JWT {
}
}
func (receiver *JWT) Create(id string) (string, error) {
privateKey, err := jwt.ParseRSAPrivateKeyFromPEM(receiver.privateKey)
if err != nil {
return "", fmt.Errorf("failed to parse private key on <Create> of <JWT>: %w", err)
}
now := time.Now().UTC()
claims := jwt.MapClaims{
"id": id, // Our userID
"exp": now.Add(receiver.expiresIn).Unix(), // The expiration time after which the token must be disregarded.
"aud": receiver.audience, // Audience
"iss": receiver.issuer, // Issuer
}
token, err := jwt.NewWithClaims(receiver.algorithm, claims).SignedString(privateKey)
if err != nil {
return "", fmt.Errorf("failed to sing on <Create> of <JWT>: %w", err)
}
return token, nil
}
func (receiver *JWT) Validate(tokenString string) (string, error) {
key, err := jwt.ParseRSAPublicKeyFromPEM(receiver.publicKey)
if err != nil {

129
internal/utils/jwt_test.go Normal file

@ -0,0 +1,129 @@
package utils_test
import (
"strings"
"testing"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/stretchr/testify/assert"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/utils"
)
func TestJWT(t *testing.T) {
type user struct {
Name string `json:"name"`
Age int `json:"age"`
}
testUser := user{
Name: "test",
Age: 80,
}
publicKey := `-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyt4XuLovUY7i12K2PIMb
QZOKn+wFFKUvxvKQDel049/+VMpHMx1FLolUKuyGp9zi6gOwjHsBPgc9oqr/eaXG
QSh7Ult7i9f+Ht563Y0er5UU9Zc5ZPSxf9O75KYD48ruGkqiFoncDqPENK4dtUa7
w0OqlN4bwVBbmIsP8B3EDC5Dof+vtiNTSHSXPx+zifKeZGyknp+nyOHVrRDhPjOh
zQzCom0MSZA/sJYmps8QZgiPA0k4Z6jTupDymPOIwYeD2C57zSxnAv0AfC3/pZYJ
bZYH/0TszRzmy052DME3zMnhMK0ikdN4nzYqU0dkkA5kb5GtKDymspHIJ9eWbUuw
gtg8Rq/LrVBj1I3UFgs0ibio40k6gqinLKslc5Y1I5mro7J3OSEP5eO/XeDLOLlO
JjEqkrx4fviI1cL3m5L6QV905xmcoNZG1+RmOg7D7cZQUf27TXqM381jkbNdktm1
JLTcMScxuo3vaRftnIVw70V8P8sIkaKY8S8HU1sQgE2LB9t04oog5u59htx2FHv4
B13NEm8tt8Tv1PexpB4UVh7PIualF6SxdFBrKbraYej72wgjXVPQ0eGXtGGD57j8
DUEzk7DK2OvIWhehlVqtiRnFdAvdBj2ynHT2/5FJ/Zpd4n5dKGJcQvy1U1qWMs+8
M7AHfWyt2+nZ04s48+bK3yMCAwEAAQ==
-----END PUBLIC KEY-----`
privateKey := `-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----`
publicKey = strings.Replace(publicKey, "\t", "", -1)
privateKey = strings.Replace(privateKey, "\t", "", -1)
jwt := utils.NewJWT(&models.JWTConfiguration{
PrivateKey: privateKey,
PublicKey: publicKey,
Algorithm: *jwt.SigningMethodRS256,
ExpiresIn: 15 * time.Minute,
Issuer: "issuer1",
Audience: "audience1",
})
t.Run("Успешная генерация токена", func(t *testing.T) {
assert.NotPanics(t, func() {
token, err := jwt.Create(testUser.Name)
assert.NoError(t, err)
assert.NotZero(t, token)
assert.NotEmpty(t, token)
})
})
t.Run("Успешная валидация токена", func(t *testing.T) {
assert.NotPanics(t, func() {
token, err := jwt.Create(testUser.Name)
isNoError := assert.NoError(t, err)
if isNoError {
parsedUser, err := jwt.Validate(token)
assert.NoError(t, err)
assert.NotNil(t, parsedUser)
assert.Equal(t, testUser.Name, parsedUser)
}
})
})
}

@ -0,0 +1 @@
[{ "delete": "accounts", "deletes": [{ "q": {} }] }]

@ -0,0 +1,28 @@
[
{
"insert": "accounts",
"ordered": true,
"documents": [
{
"_id": {
"$oid": "641b2d73e0e07a7e90b59616"
},
"userId": "807f1f77bcf81cd799439077",
"name": {},
"cart": ["807f1f77bcf81cd791439022", "807f1f77bcf81cd799439012"],
"wallet": {
"currency": "RUB",
"cash": 0,
"purchasesAmount": 0,
"spent": 0,
"money": 0
},
"status": "no",
"isDeleted": false,
"createdAt": "2023-06-16T08:15:30.336Z",
"updatedAt": "2023-06-16T08:15:30.336Z",
"deletedAt": "2023-06-16T08:15:30.336Z"
}
]
}
]

@ -1 +0,0 @@
[{ "delete": "amocrm", "deletes": [{ "q": {} }] }]

@ -1,85 +0,0 @@
[
{
"insert": "amocrm",
"ordered": true,
"documents": [
{
"amocrmId": "1",
"userId": "1",
"information": {
"id": 30228997,
"name": "ООО ПЕНА",
"subdomain": "penadigital",
"created_at": 1683680509,
"created_by": 0,
"updated_at": 1683680509,
"updated_by": 0,
"current_user_id": 8110726,
"country": "RU",
"customers_mode": "disabled",
"is_unsorted_on": true,
"is_loss_reason_enabled": true,
"is_helpbot_enabled": false,
"is_technical_account": true,
"contact_name_display_order": 1,
"amojo_id": "",
"uuid": "",
"version": 0,
"_links": { "self": { "href": "https://penadigital.amocrm.ru/api/v4/account" } },
"_embedded": {
"amojo_rights": { "can_direct": false, "can_create_groups": false },
"users_groups": null,
"task_types": null,
"entity_names": {
"leads": {
"ru": {
"gender": "",
"plural_form": {
"dative": "",
"default": "",
"genitive": "",
"accusative": "",
"instrumental": "",
"prepositional": ""
},
"singular_form": {
"dative": "",
"default": "",
"genitive": "",
"accusative": "",
"instrumental": "",
"prepositional": ""
}
},
"en": {
"singular_form": { "default": "" },
"plural_form": { "default": "" },
"gender": ""
},
"es": {
"singular_form": { "default": "" },
"plural_form": { "default": "" },
"gender": ""
}
}
},
"datetime_settings": {
"date_pattern": "",
"short_date_pattern": "",
"short_time_pattern": "",
"date_formant": "",
"time_format": "",
"timezone": "",
"timezone_offset": ""
}
}
},
"audit": {
"createdAt": "2022-12-31T00:00:00.000Z",
"updatedAt": "2022-12-31T00:00:00.000Z",
"deleted": false
}
}
]
}
]

@ -594,7 +594,6 @@ components:
status:
type: string
enum: ["no", "org", "nko"]
default: "no"
isDeleted:
type: boolean
example: false

88
tests/helpers/jwt.go Normal file

@ -0,0 +1,88 @@
package helpers
import (
"strings"
"time"
"github.com/golang-jwt/jwt/v5"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/utils"
)
func InitializeJWT() *utils.JWT {
publicKey := strings.Replace(`-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyt4XuLovUY7i12K2PIMb
QZOKn+wFFKUvxvKQDel049/+VMpHMx1FLolUKuyGp9zi6gOwjHsBPgc9oqr/eaXG
QSh7Ult7i9f+Ht563Y0er5UU9Zc5ZPSxf9O75KYD48ruGkqiFoncDqPENK4dtUa7
w0OqlN4bwVBbmIsP8B3EDC5Dof+vtiNTSHSXPx+zifKeZGyknp+nyOHVrRDhPjOh
zQzCom0MSZA/sJYmps8QZgiPA0k4Z6jTupDymPOIwYeD2C57zSxnAv0AfC3/pZYJ
bZYH/0TszRzmy052DME3zMnhMK0ikdN4nzYqU0dkkA5kb5GtKDymspHIJ9eWbUuw
gtg8Rq/LrVBj1I3UFgs0ibio40k6gqinLKslc5Y1I5mro7J3OSEP5eO/XeDLOLlO
JjEqkrx4fviI1cL3m5L6QV905xmcoNZG1+RmOg7D7cZQUf27TXqM381jkbNdktm1
JLTcMScxuo3vaRftnIVw70V8P8sIkaKY8S8HU1sQgE2LB9t04oog5u59htx2FHv4
B13NEm8tt8Tv1PexpB4UVh7PIualF6SxdFBrKbraYej72wgjXVPQ0eGXtGGD57j8
DUEzk7DK2OvIWhehlVqtiRnFdAvdBj2ynHT2/5FJ/Zpd4n5dKGJcQvy1U1qWMs+8
M7AHfWyt2+nZ04s48+bK3yMCAwEAAQ==
-----END PUBLIC KEY-----`, "\t", "", -1)
privateKey := strings.Replace(`-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAyt4XuLovUY7i12K2PIMbQZOKn+wFFKUvxvKQDel049/+VMpH
Mx1FLolUKuyGp9zi6gOwjHsBPgc9oqr/eaXGQSh7Ult7i9f+Ht563Y0er5UU9Zc5
ZPSxf9O75KYD48ruGkqiFoncDqPENK4dtUa7w0OqlN4bwVBbmIsP8B3EDC5Dof+v
tiNTSHSXPx+zifKeZGyknp+nyOHVrRDhPjOhzQzCom0MSZA/sJYmps8QZgiPA0k4
Z6jTupDymPOIwYeD2C57zSxnAv0AfC3/pZYJbZYH/0TszRzmy052DME3zMnhMK0i
kdN4nzYqU0dkkA5kb5GtKDymspHIJ9eWbUuwgtg8Rq/LrVBj1I3UFgs0ibio40k6
gqinLKslc5Y1I5mro7J3OSEP5eO/XeDLOLlOJjEqkrx4fviI1cL3m5L6QV905xmc
oNZG1+RmOg7D7cZQUf27TXqM381jkbNdktm1JLTcMScxuo3vaRftnIVw70V8P8sI
kaKY8S8HU1sQgE2LB9t04oog5u59htx2FHv4B13NEm8tt8Tv1PexpB4UVh7PIual
F6SxdFBrKbraYej72wgjXVPQ0eGXtGGD57j8DUEzk7DK2OvIWhehlVqtiRnFdAvd
Bj2ynHT2/5FJ/Zpd4n5dKGJcQvy1U1qWMs+8M7AHfWyt2+nZ04s48+bK3yMCAwEA
AQKCAgEAhodpK7MsFeWvQC3Rs6ctt/rjftHBPMOeP0wzg0ZBoau0uP264YaTjhy7
mAtp8H9matEvjrkzRbL/iJPk/wKTyjnSLfdEoqQFfOsEh09B/iXa1FIIWY569s2u
WB5PjgvQgdbkThX1vC+VuWmNgdz6Pq7su/Pea/+h/jKZyx2yGHHFn/QyzZH3dKD8
e3vGT8B4kRgKwrYVSf2Y+T+sXtdWgOfpWlT+RPpHgg7QauX9dexPClrP8M3gOmRM
vGkjU1NOd1m7939ugGjOnYrTcTdh4S4Q95L5hbuYwVGyrxqiqkdl8iWeOx4Fa287
+iXp5i3lJKdyMLCnytsp5GHu+2OqFKyYQli23eMEEiTq/7PrzJas0BD3LfuT55Ht
UCwI/pRdgHvc/xEHqr7eF0C3f+PPG9/C85StDbm9WqhCVQ9nGt2ezkLeUSM/DBAh
DgI/LDFqRwLlIDrhkTT7BJGz6+2cmHwV80+eGPG2WzjpI619qhqgqB0fGBjLlVcZ
qoHy0K6NXuBqaoPOQq0TGkhl3SjurSe9EXeZHrrCT3LcSAIT7ZYoZDYuIvKBj7Sh
7r/wdYS9nzsBhU0xeGzfAs+5yxDCp1/GzLK0H8LlJcjJOxqArtEzf55v7ZBB8erR
sqmbpGoQAwzwyw1zosmhzQwZRlAMPNi0yfnjfi8yQu4kZchyJyECggEBAOStATj0
JNYWrPoHSgdW+NkzMRNIjjkHkUM/zs9F1bIlYwYDzmduXUoLChCHcjbOyE2tsPi8
eFbyJ0vpMa0ZgoQmAnqUhYOwceu/tmI2CE7jLB2luq9oFhQIblKR6Fi8TyvPzn4N
Q4iD1I2VjffSSQher+hNVdLmpRkP8s2UiY7OQOZMBWKNqfORddQWcXp3Wrg2Lkbd
7KcAtaMLYWg2W3mRdz6dnsqjMomRMi5arhroG3CtIpb62uiEdq2ZwyGF/Awon/kr
/XnfRLQeH0xVFPuVS/EbP6Ipq0TiieElTh4erhUIbmLZg7B5Fe9z1c528GUzTxhP
geQwN3bS5q71/f8CggEBAOMbosN7S+merANPzCOnRruLDPXukW+u20t/8CrOibJM
MO0embITOJfEdG4jBVRwnm5qacojuzFwfD7C18fJ1Hty010yQkjnB/zch3i8Fjx1
vtsWnYOfbViuIzuEi+9bPWRlMZh504zDjgqo8P24JU5qziw/ySLfMZAX7iNsohRB
R+bBdP933kPoCo5ehSj4QyVgRIWN751x5sZ0eyCUTZIw9OswuOmsmnlw4nMsqWIx
OXlARVkbA97+1pp21pAromekE/bzN8Qo4pn4inZTTy9yAeAvSp+vScCiaVJ4n+ag
WAgLeQBLxqRCU6BMvKiRjQ8dBMAn1DjKCrlV+5zFZt0CggEAd8TZEBBnPq4vuOCa
eE+oFHKIcJYez2XUQkmoMs1byGtmet8BexDF0aMIiXG3c1dId87SEuT7jmZUCKFB
gG0M+9PAlp01dKy0bgpCJxwvq8m18G094uL8NU/ZIGwFKnyuZr73YvPlfBm3+NPs
wHCmCbk2HtBqdASTUhYVUHFMvrvuJ/CHHYAfFFAKS6PZmY/rtvHBuSJA8ZMgjx3F
zcQykvCKaQQ7B90D+iNPChI6gCMzRAeaR0Np5kCCvBf9qJA5W9DnQKU2pF8457Gj
KOKjE8W1ObnQ0UlLx89y8bYNPR9Kg/+feSx9ma9BuuGLiRCohgiik5QI7xAF7Lk3
U0nJ1wKCAQAmkbjwre3UfSgFX/XxUCVJEHJhCeUVLIL9rXqiKnVkHGBqxLmhbnY8
ABct5TCwiHe/lL7mn27ZFJtlJT30Jii51mRi/XgYXXQT03gGXxr/pZeGKa8SfW7a
kqhVIUuKmNoyRKVJmdb9nvBuiwZycGWVjbn59dM44uLN7+J3jalw+y002UH/aOIM
cknop9DBhngQzuqUK+i3unJQ3dNTUxxhaYMOtjWRKckKOsuad8lEbcuu9eVRHq9n
navgi7IgxehM5aamV+PuomrpbzZEph1al2gOJLntqJ1D49EzOl0dk7mflCM2k6fm
mYUOQjn//sgP+wOlhp4aDuYHV7zlgPjZAoIBAQDXPUl6NeA2ZMWbSO+WRc8zzjQ9
qyxRA7g3ZSu+E5OqkxfwayXr/kAVKQNHJvn5wr9rLFhEF6CkBJ7XgOrHN0RjgXq2
z0DpwG5JEFMeqkQWI+rVJ+ZJ4g0SAa9k39+WDxQhpZM8/IlkuIYqRI0mlcHwxhkG
7JhkLtELhlxaGobAIinWiskKqX85tzZtCLe1wkErWOCueWviiuoCY2HWfELoA5+4
wAvKspBO6oa+R2JtjA0nE72jKWuIz4m0QaCE7yInyCG9ikrBHSh/85eMu37nqegU
ziOydfDNcQp17fBjy8NVeQBjdjxVYejl8pKAVcQP9iM4vIyRIx0Ersv1fySA
-----END RSA PRIVATE KEY-----`, "\t", "", -1)
return utils.NewJWT(&models.JWTConfiguration{
PrivateKey: privateKey,
PublicKey: publicKey,
Audience: "audience",
Issuer: "issuer",
Algorithm: *jwt.SigningMethodRS256,
ExpiresIn: 15 * time.Minute,
})
}

@ -0,0 +1,133 @@
package integration_test
import (
"context"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/client"
"penahub.gitlab.yandexcloud.net/pena-services/customer/tests/helpers"
)
func TestSetAccountVerificationStatusNO(t *testing.T) {
jwtUtil := helpers.InitializeJWT()
t.Run("Успешная установка статуса верификации <no> аккаунту", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
assert.NotPanics(t, func() {
token, tokenErr := jwtUtil.Create("807f1f77bcf81cd799439077")
if isNoError := assert.NoError(t, tokenErr); !isNoError {
return
}
response, getAccountErr := client.Get[models.Account, models.ResponseErrorHTTP](ctx, &client.RequestSettings{
URL: "http://localhost:8082/account/807f1f77bcf81cd799439077",
Body: models.SetAccountStatus{Status: "no"},
Headers: map[string]string{"Authorization": fmt.Sprintf("Bearer %s", token)},
})
if isNoError := assert.NoError(t, getAccountErr); !isNoError {
return
}
if isNoRequestError := assert.Nil(t, response.Error); !isNoRequestError {
return
}
assert.Equal(t, "807f1f77bcf81cd799439077", response.Body.UserID)
assert.Equal(t, models.AccountStatusNo, response.Body.Status)
})
})
}
func TestSetAccountVerificationStatusORG(t *testing.T) {
jwtUtil := helpers.InitializeJWT()
t.Run("Успешная установка статуса верификации <org> аккаунту", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
assert.NotPanics(t, func() {
token, tokenErr := jwtUtil.Create("807f1f77bcf81cd799439077")
if isNoError := assert.NoError(t, tokenErr); !isNoError {
return
}
response, getAccountErr := client.Get[models.Account, models.ResponseErrorHTTP](ctx, &client.RequestSettings{
URL: "http://localhost:8082/account/807f1f77bcf81cd799439077",
Body: models.SetAccountStatus{Status: "org"},
Headers: map[string]string{"Authorization": fmt.Sprintf("Bearer %s", token)},
})
if isNoError := assert.NoError(t, getAccountErr); !isNoError {
return
}
if isNoRequestError := assert.Nil(t, response.Error); !isNoRequestError {
return
}
assert.Equal(t, "807f1f77bcf81cd799439077", response.Body.UserID)
assert.Equal(t, models.AccountStatusOrg, response.Body.Status)
})
})
}
func TestSetAccountVerificationStatusNKO(t *testing.T) {
jwtUtil := helpers.InitializeJWT()
t.Run("Успешная установка статуса верификации <nko> аккаунту", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
assert.NotPanics(t, func() {
token, tokenErr := jwtUtil.Create("807f1f77bcf81cd799439077")
if isNoError := assert.NoError(t, tokenErr); !isNoError {
return
}
response, getAccountErr := client.Get[models.Account, models.ResponseErrorHTTP](ctx, &client.RequestSettings{
URL: "http://localhost:8082/account/807f1f77bcf81cd799439077",
Body: models.SetAccountStatus{Status: "nko"},
Headers: map[string]string{"Authorization": fmt.Sprintf("Bearer %s", token)},
})
if isNoError := assert.NoError(t, getAccountErr); !isNoError {
return
}
if isNoRequestError := assert.Nil(t, response.Error); !isNoRequestError {
return
}
assert.Equal(t, "807f1f77bcf81cd799439077", response.Body.UserID)
assert.Equal(t, models.AccountStatusNko, response.Body.Status)
})
})
}
func TestSetAccountVerificationStatusFailure(t *testing.T) {
jwtUtil := helpers.InitializeJWT()
t.Run("Проваленная установка статуса верификации из-за невалидного значения статуса", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
assert.NotPanics(t, func() {
token, tokenErr := jwtUtil.Create("807f1f77bcf81cd799439077")
if isNoError := assert.NoError(t, tokenErr); !isNoError {
return
}
response, getAccountErr := client.Get[models.Account, models.ResponseErrorHTTP](ctx, &client.RequestSettings{
URL: "http://localhost:8082/account/807f1f77bcf81cd799439077",
Body: models.SetAccountStatus{Status: "radnom-status"},
Headers: map[string]string{"Authorization": fmt.Sprintf("Bearer %s", token)},
})
if isNoError := assert.NoError(t, getAccountErr); !isNoError {
return
}
if isNotNil := assert.NotNil(t, response.Error); isNotNil {
assert.Equal(t, 404, response.Error.StatusCode)
}
})
})
}