test: initialize packages

This commit is contained in:
Kirill 2023-05-19 07:50:40 +03:00
parent de8e8c14e4
commit 0cb1d6bb1b
18 changed files with 246 additions and 59 deletions

@ -3,6 +3,7 @@ package client
import (
"context"
"fmt"
"log"
"net/url"
"go.uber.org/zap"
@ -23,6 +24,18 @@ type AuthClient struct {
}
func NewAuthClient(deps *AuthClientDeps) *AuthClient {
if deps == nil {
log.Panicln("deps is nil on <v>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewAuthClient>")
}
if deps.URLs == nil {
log.Panicln("auth urls is nil on <NewAuthClient>")
}
return &AuthClient{
logger: deps.Logger,
urls: deps.URLs,

@ -3,6 +3,7 @@ package account
import (
"context"
"fmt"
"log"
"net/http"
"github.com/labstack/echo/v4"
@ -30,13 +31,25 @@ type Deps struct {
type Controller struct {
logger *zap.Logger
service accountService
Service accountService
}
func New(deps *Deps) *Controller {
if deps == nil {
log.Panicln("deps is nil on <New (account controller)>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <New (account controller)>")
}
if deps.Service == nil {
log.Panicln("account service is nil on <New (account controller)>")
}
return &Controller{
logger: deps.Logger,
service: deps.Service,
Service: deps.Service,
}
}
@ -49,7 +62,7 @@ func (receiver *Controller) GetAccount(ctx echo.Context) error {
))
}
account, err := receiver.service.GetAccountByUserID(ctx.Request().Context(), userID)
account, err := receiver.Service.GetAccountByUserID(ctx.Request().Context(), userID)
if err != nil {
return echotools.ResponseError(ctx, err)
}
@ -58,7 +71,7 @@ func (receiver *Controller) GetAccount(ctx echo.Context) error {
}
func (receiver *Controller) GetDirectAccount(ctx echo.Context, userID string) error {
account, err := receiver.service.GetAccountByUserID(ctx.Request().Context(), userID)
account, err := receiver.Service.GetAccountByUserID(ctx.Request().Context(), userID)
if err != nil {
return echotools.ResponseError(ctx, err)
}
@ -67,7 +80,7 @@ func (receiver *Controller) GetDirectAccount(ctx echo.Context, userID string) er
}
func (receiver *Controller) GetAccounts(ctx echo.Context, params swagger.PaginationAccountsParams) error {
response, err := receiver.service.GetAccountsList(
response, err := receiver.Service.GetAccountsList(
ctx.Request().Context(),
utils.DeterminePagination(params.Page, params.Limit),
)
@ -87,7 +100,7 @@ func (receiver *Controller) CreateAccount(ctx echo.Context) error {
))
}
account, err := receiver.service.CreateAccountByUserID(ctx.Request().Context(), userID)
account, err := receiver.Service.CreateAccountByUserID(ctx.Request().Context(), userID)
if err != nil {
return echotools.ResponseError(ctx, err)
}
@ -104,7 +117,7 @@ func (receiver *Controller) RemoveAccount(ctx echo.Context) error {
))
}
account, err := receiver.service.RemoveAccount(ctx.Request().Context(), userID)
account, err := receiver.Service.RemoveAccount(ctx.Request().Context(), userID)
if err != nil {
return echotools.ResponseError(ctx, err)
}
@ -113,7 +126,7 @@ func (receiver *Controller) RemoveAccount(ctx echo.Context) error {
}
func (receiver *Controller) RemoveDirectAccount(ctx echo.Context, userID string) error {
account, err := receiver.service.RemoveAccount(ctx.Request().Context(), userID)
account, err := receiver.Service.RemoveAccount(ctx.Request().Context(), userID)
if err != nil {
return echotools.ResponseError(ctx, err)
}

@ -3,6 +3,7 @@ package currency
import (
"context"
"fmt"
"log"
"net/http"
"github.com/labstack/echo/v4"
@ -27,6 +28,18 @@ type Controller struct {
}
func New(deps *Deps) *Controller {
if deps == nil {
log.Panicln("deps is nil on <New (account controller)>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <New (account controller)>")
}
if deps.CurrencyService == nil {
log.Panicln("currency service is nil on <New (account controller)>")
}
return &Controller{
logger: deps.Logger,
currencyService: deps.CurrencyService,

@ -1,9 +1,12 @@
package initialize
import "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/swagger"
import (
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/swagger"
)
func NewAPI(controllers *Controllers) *swagger.API {
return swagger.New(&swagger.Deps{
AccountController: controllers.AccountController,
AccountController: controllers.AccountController,
CurrencyController: controllers.CurrencyController,
})
}

@ -44,6 +44,7 @@ func TestNewAPI(t *testing.T) {
assert.NotNil(t, api)
assert.NotNil(t, api.AccountController)
assert.NotNil(t, api.CurrencyController)
})
})
}

@ -4,13 +4,20 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/initialize"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
)
func TestNewClients(t *testing.T) {
t.Run("Клиенты должны успешно инициализироваться", func(t *testing.T) {
logger := zap.New(zap.L().Core())
assert.NotPanics(t, func() {
clients := initialize.NewClients(&initialize.ClientsDeps{})
clients := initialize.NewClients(&initialize.ClientsDeps{
Logger: logger,
AuthURL: &models.AuthMicroServiceURL{},
})
assert.NotNil(t, clients)
assert.NotNil(t, clients.AuthClient)

@ -1,8 +1,11 @@
package initialize
import (
"log"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/controller/account"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/controller/currency"
)
type ControllersDeps struct {
@ -11,14 +14,31 @@ type ControllersDeps struct {
}
type Controllers struct {
AccountController *account.Controller
AccountController *account.Controller
CurrencyController *currency.Controller
}
func NewControllers(deps *ControllersDeps) *Controllers {
if deps == nil {
log.Panicln("deps is nil on <NewControllers>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewControllers>")
}
if deps.Services == nil {
log.Panicln("services is nil on <NewControllers>")
}
return &Controllers{
AccountController: account.New(&account.Deps{
Logger: deps.Logger,
Service: deps.Services.AccountService,
}),
CurrencyController: currency.New(&currency.Deps{
Logger: deps.Logger,
CurrencyService: deps.Services.CurrencyService,
}),
}
}

@ -4,18 +4,23 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/initialize"
)
func TestNewControllers(t *testing.T) {
t.Run("Контроллеры должны успешно инициализироваться", func(t *testing.T) {
logger := zap.New(zap.L().Core())
assert.NotPanics(t, func() {
controllers := initialize.NewControllers(&initialize.ControllersDeps{
Logger: logger,
Services: &initialize.Services{},
})
assert.NotNil(t, controllers)
assert.NotNil(t, controllers.AccountController)
assert.NotNil(t, controllers.CurrencyController)
})
})
}

@ -1,27 +1,46 @@
package initialize
import (
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/repository"
)
type RepositoriesDeps struct {
MongoDB *mongo.Database
Logger *zap.Logger
MongoDB *mongo.Database
}
type Repositories struct {
HealthRepository *repository.HealthRepository
AccountRepository *repository.AccountRepository
HealthRepository *repository.HealthRepository
AccountRepository *repository.AccountRepository
CurrencyRepository *repository.CurrencyRepository
}
func NewRepositories(deps *RepositoriesDeps) *Repositories {
if deps == nil {
log.Panicln("deps is nil on <NewRepositories>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewRepositories>")
}
if deps.MongoDB == nil {
log.Panicln("mongodb is nil on <NewRepositories>")
}
return &Repositories{
HealthRepository: repository.NewHealthRepository(deps.MongoDB),
AccountRepository: repository.NewAccountRepository(&repository.AccountRepositoryDeps{
MongoDB: deps.MongoDB.Collection("accounts"),
Logger: deps.Logger,
MongoDB: deps.MongoDB.Collection("accounts"),
}),
CurrencyRepository: repository.NewCurrencyRepository(&repository.CurrencyRepositoryDeps{
Logger: deps.Logger,
MongoDB: deps.MongoDB.Collection("currency_lists"),
}),
}
}

@ -5,6 +5,7 @@ import (
"github.com/stretchr/testify/assert"
"go.mongodb.org/mongo-driver/mongo/integration/mtest"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/initialize"
)
@ -12,14 +13,18 @@ func TestNewRepositories(t *testing.T) {
mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
mt.Run("Репозитории должны успешно инициализироваться", func(t *mtest.T) {
logger := zap.New(zap.L().Core())
assert.NotPanics(t, func() {
repositories := initialize.NewRepositories(&initialize.RepositoriesDeps{
Logger: logger,
MongoDB: t.Client.Database("test"),
})
assert.NotNil(t, repositories)
assert.NotNil(t, repositories.AccountRepository)
assert.NotNil(t, repositories.HealthRepository)
assert.NotNil(t, repositories.CurrencyRepository)
})
})
}

@ -3,6 +3,7 @@ package initialize
import (
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/service/account"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/service/currency"
)
type ServicesDeps struct {
@ -12,31 +13,20 @@ type ServicesDeps struct {
}
type Services struct {
AccountService *account.Service
AccountService *account.Service
CurrencyService *currency.Service
}
func NewServices(deps *ServicesDeps) *Services {
if deps == nil {
panic("deps is nil")
}
if deps.Logger == nil {
panic("logger is nil")
}
if deps.Repositories == nil {
panic("repositories is nil")
}
if deps.Clients == nil {
panic("clients is nil")
}
return &Services{
AccountService: account.New(&account.Deps{
Logger: deps.Logger,
Repository: deps.Repositories.AccountRepository,
AuthClient: deps.Clients.AuthClient,
}),
CurrencyService: currency.New(&currency.Deps{
Logger: deps.Logger,
Repository: deps.Repositories.CurrencyRepository,
}),
}
}

@ -5,19 +5,30 @@ import (
"github.com/stretchr/testify/assert"
"go.mongodb.org/mongo-driver/mongo/integration/mtest"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/initialize"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
)
func TestNewServices(t *testing.T) {
mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
mt.Run("Сервисы должны успешно инициализироваться", func(t *mtest.T) {
logger := zap.New(zap.L().Core())
assert.NotPanics(t, func() {
clients := initialize.NewClients(&initialize.ClientsDeps{})
clients := initialize.NewClients(&initialize.ClientsDeps{
Logger: logger,
AuthURL: &models.AuthMicroServiceURL{},
})
repositories := initialize.NewRepositories(&initialize.RepositoriesDeps{
Logger: logger,
MongoDB: t.Client.Database("test"),
})
services := initialize.NewServices(&initialize.ServicesDeps{
Logger: logger,
Clients: clients,
Repositories: repositories,
})

@ -3,6 +3,7 @@ package repository
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/bson"
@ -17,19 +18,31 @@ import (
)
type AccountRepositoryDeps struct {
MongoDB *mongo.Collection
Logger *zap.Logger
MongoDB *mongo.Collection
}
type AccountRepository struct {
mongoDB *mongo.Collection
logger *zap.Logger
mongoDB *mongo.Collection
}
func NewAccountRepository(deps *AccountRepositoryDeps) *AccountRepository {
if deps == nil {
log.Panicln("deps is nil on <NewAccountRepository>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewAccountRepository>")
}
if deps.MongoDB == nil {
log.Panicln("repository is nil on <NewAccountRepository>")
}
return &AccountRepository{
mongoDB: deps.MongoDB,
logger: deps.Logger,
mongoDB: deps.MongoDB,
}
}

@ -3,6 +3,7 @@ package repository
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
@ -24,6 +25,18 @@ type CurrencyRepository struct {
}
func NewCurrencyRepository(deps *CurrencyRepositoryDeps) *CurrencyRepository {
if deps == nil {
log.Panicln("deps is nil on <NewCurrencyRepository>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewCurrencyRepository>")
}
if deps.MongoDB == nil {
log.Panicln("repository is nil on <NewCurrencyRepository>")
}
return &CurrencyRepository{
mongoDB: deps.MongoDB,
logger: deps.Logger,

@ -7,13 +7,13 @@ import (
)
type HealthRepository struct {
mongoDB *mongo.Database
MongoDB *mongo.Database
}
func NewHealthRepository(database *mongo.Database) *HealthRepository {
return &HealthRepository{mongoDB: database}
return &HealthRepository{MongoDB: database}
}
func (receiver *HealthRepository) Check(ctx context.Context) error {
return receiver.mongoDB.Client().Ping(ctx, nil)
return receiver.MongoDB.Client().Ping(ctx, nil)
}

@ -3,6 +3,7 @@ package account
import (
"context"
"fmt"
"log"
"math"
"go.uber.org/zap"
@ -31,20 +32,36 @@ type Deps struct {
type Service struct {
logger *zap.Logger
Repository accountRepository
AuthClient authClient
repository accountRepository
authClient authClient
}
func New(deps *Deps) *Service {
if deps == nil {
log.Panicln("deps is nil on <New (account service)>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <New (account service)>")
}
if deps.Repository == nil {
log.Panicln("repository is nil on <New (account service)>")
}
if deps.AuthClient == nil {
log.Panicln("auth client is nil on <New (account service)>")
}
return &Service{
logger: deps.Logger,
Repository: deps.Repository,
AuthClient: deps.AuthClient,
repository: deps.Repository,
authClient: deps.AuthClient,
}
}
func (receiver *Service) GetAccountByUserID(ctx context.Context, userID string) (*models.Account, errors.Error) {
account, err := receiver.Repository.FindByUserID(ctx, userID)
account, err := receiver.repository.FindByUserID(ctx, userID)
if err != nil {
receiver.logger.Error("failed to get account by id on <GetAccountByUserID> of <AccountService>",
zap.Error(err.Extract()),
@ -65,7 +82,7 @@ func (receiver *Service) GetAccountsList(ctx context.Context, pagination *models
)
}
count, err := receiver.Repository.CountAll(ctx)
count, err := receiver.repository.CountAll(ctx)
if err != nil {
receiver.logger.Error("failed to count accounts on <GetAccountsList> of <AccountService>",
zap.Error(err.Extract()),
@ -80,7 +97,7 @@ func (receiver *Service) GetAccountsList(ctx context.Context, pagination *models
totalPages := int64(math.Ceil(float64(count) / float64(pagination.Limit)))
accounts, err := receiver.Repository.FindMany(ctx, pagination.Page, pagination.Limit)
accounts, err := receiver.repository.FindMany(ctx, pagination.Page, pagination.Limit)
if err != nil {
receiver.logger.Error("failed to get accounts list on <GetAccountsList> of <AccountService>",
zap.Error(err.Extract()),
@ -117,7 +134,7 @@ func (receiver *Service) CreateAccount(ctx context.Context, account *models.Acco
)
}
createdAccount, err := receiver.Repository.Insert(ctx, account)
createdAccount, err := receiver.repository.Insert(ctx, account)
if err != nil {
receiver.logger.Error("failed to create account on <CreateAccount> of <AccountService>",
zap.Error(err.Extract()),
@ -155,7 +172,7 @@ func (receiver *Service) CreateAccountByUserID(ctx context.Context, userID strin
)
}
user, err := receiver.AuthClient.GetUser(ctx, userID)
user, err := receiver.authClient.GetUser(ctx, userID)
if err != nil {
receiver.logger.Error("failed to get user on <CreateAccountByUserID> of <AccountService>",
zap.Error(err.Extract()),
@ -165,7 +182,7 @@ func (receiver *Service) CreateAccountByUserID(ctx context.Context, userID strin
return nil, err
}
createdAccount, err := receiver.Repository.Insert(ctx, &models.Account{
createdAccount, err := receiver.repository.Insert(ctx, &models.Account{
UserID: user.ID,
Cart: make([]string, 0),
Wallet: models.Wallet{
@ -187,7 +204,7 @@ func (receiver *Service) CreateAccountByUserID(ctx context.Context, userID strin
}
func (receiver *Service) RemoveAccount(ctx context.Context, userID string) (*models.Account, errors.Error) {
account, err := receiver.Repository.Remove(ctx, userID)
account, err := receiver.repository.Remove(ctx, userID)
if err != nil {
receiver.logger.Error("failed to remove account on <RemoveAccount> of <AccountService>",
zap.Error(err.Extract()),
@ -201,7 +218,7 @@ func (receiver *Service) RemoveAccount(ctx context.Context, userID string) (*mod
}
func (receiver *Service) DeleteAccount(ctx context.Context, userID string) (*models.Account, errors.Error) {
account, err := receiver.Repository.Delete(ctx, userID)
account, err := receiver.repository.Delete(ctx, userID)
if err != nil {
receiver.logger.Error("failed to delete account on <DeleteAccount> of <AccountService>",
zap.Error(err.Extract()),

@ -2,6 +2,7 @@ package currency
import (
"context"
"log"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors"
@ -24,6 +25,18 @@ type Service struct {
}
func New(deps *Deps) *Service {
if deps == nil {
log.Panicln("deps is nil on <New (currency service)>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <New (currency service)>")
}
if deps.Repository == nil {
log.Panicln("repository is nil on <New (currency service)>")
}
return &Service{
logger: deps.Logger,
repository: deps.Repository,

@ -1,6 +1,7 @@
package swagger
import (
"log"
"net/http"
"github.com/labstack/echo/v4"
@ -9,7 +10,7 @@ import (
//go:generate oapi-codegen --config api.yaml ../../openapi.yaml
//go:generate oapi-codegen --config models.yaml ../../openapi.yaml
type AccountController interface {
type accountController interface {
RemoveAccount(ctx echo.Context) error
GetAccount(ctx echo.Context) error
CreateAccount(ctx echo.Context) error
@ -18,20 +19,42 @@ type AccountController interface {
GetAccounts(ctx echo.Context, params PaginationAccountsParams) error
}
type currencyController interface {
GetCurrencies(ctx echo.Context) error
PutCurrencies(ctx echo.Context) error
}
type Deps struct {
AccountController AccountController
AccountController accountController
CurrencyController currencyController
}
type API struct {
AccountController AccountController
AccountController accountController
CurrencyController currencyController
}
func New(deps *Deps) *API {
if deps == nil {
log.Panicln("deps is nil on <New (API)>")
}
if deps.AccountController == nil {
log.Panicln("AccountController is nil on <New (API)>")
}
if deps.CurrencyController == nil {
log.Panicln("CurrencyController is nil on <New (API)>")
}
return &API{
AccountController: deps.AccountController,
AccountController: deps.AccountController,
CurrencyController: deps.CurrencyController,
}
}
// Account
func (receiver *API) DeleteAccount(ctx echo.Context) error {
return receiver.AccountController.RemoveAccount(ctx)
}
@ -56,7 +79,9 @@ func (receiver *API) PaginationAccounts(ctx echo.Context, params PaginationAccou
return receiver.AccountController.GetAccounts(ctx, params)
}
func (receiver *API) RemoveFromCart(ctx echo.Context, params RemoveFromCartParams) error {
// Cart
func (receiver *API) RemoveFromCart(ctx echo.Context, _ RemoveFromCartParams) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}
@ -68,6 +93,8 @@ func (receiver *API) PayCart(ctx echo.Context) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}
// Currency
func (receiver *API) GetCurrencies(ctx echo.Context) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}
@ -76,7 +103,9 @@ func (receiver *API) UpdateCurrencies(ctx echo.Context) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}
func (receiver *API) GetHistory(ctx echo.Context, params GetHistoryParams) error {
// History
func (receiver *API) GetHistory(ctx echo.Context, _ GetHistoryParams) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}
@ -84,7 +113,9 @@ func (receiver *API) Add2history(ctx echo.Context) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}
func (receiver *API) RequestMoney(ctx echo.Context, params RequestMoneyParams) error {
// Wallet
func (receiver *API) RequestMoney(ctx echo.Context, _ RequestMoneyParams) error {
return ctx.String(http.StatusNotImplemented, "method not implemented")
}