Skip to content

Commit

Permalink
fix: 🐛 bug fix in logging errors in tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mehdihadeli committed Sep 17, 2023
1 parent fdd13ef commit a548285
Show file tree
Hide file tree
Showing 29 changed files with 233 additions and 120 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/core/data"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/core/data/specification"
customErrors "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/http/http_errors/custom_errors"
defaultLogger "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger/default_logger"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/mapper"
gorm2 "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/testcontainer/gorm"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/utils"
Expand Down Expand Up @@ -429,7 +430,9 @@ func setupGenericGormRepositoryWithDataModel(
ctx context.Context,
t *testing.T,
) (data.GenericRepositoryWithDataModel[*ProductGorm, *Product], error) {
db, err := gorm2.NewGormTestContainers().Start(ctx, t)
defaultLogger.SetupDefaultLogger()

db, err := gorm2.NewGormTestContainers(defaultLogger.Logger).Start(ctx, t)
if err != nil {
return nil, err
}
Expand All @@ -443,7 +446,9 @@ func setupGenericGormRepositoryWithDataModel(
}

func setupGenericGormRepository(ctx context.Context, t *testing.T) (data.GenericRepository[*ProductGorm], error) {
db, err := gorm2.NewGormTestContainers().Start(ctx, t)
defaultLogger.SetupDefaultLogger()

db, err := gorm2.NewGormTestContainers(defaultLogger.Logger).Start(ctx, t)

err = seedAndMigration(ctx, db)
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/core/data"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/core/data/specification"
customErrors "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/http/http_errors/custom_errors"
defaultLogger "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger/default_logger"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/mapper"
mongo2 "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/testcontainer/mongo"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/utils"
Expand Down Expand Up @@ -537,7 +538,9 @@ func setupGenericMongoRepositoryWithDataModel(
ctx context.Context,
t *testing.T,
) (data.GenericRepositoryWithDataModel[*ProductMongo, *Product], error) {
db, err := mongo2.NewMongoTestContainers().Start(ctx, t)
defaultLogger.SetupDefaultLogger()

db, err := mongo2.NewMongoTestContainers(defaultLogger.Logger).Start(ctx, t)
if err != nil {
return nil, err
}
Expand All @@ -551,7 +554,9 @@ func setupGenericMongoRepositoryWithDataModel(
}

func setupGenericMongoRepository(ctx context.Context, t *testing.T) (data.GenericRepository[*ProductMongo], error) {
db, err := mongo2.NewMongoTestContainers().Start(ctx, t)
defaultLogger.SetupDefaultLogger()

db, err := mongo2.NewMongoTestContainers(defaultLogger.Logger).Start(ctx, t)
if err != nil {
return nil, err
}
Expand Down
2 changes: 0 additions & 2 deletions internal/pkg/test/containers/contracts/rabbitmq_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"testing"

"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/core/serializer"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/messaging/bus"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/rabbitmq/config"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/rabbitmq/configurations"
Expand All @@ -28,7 +27,6 @@ type RabbitMQContainer interface {
Start(ctx context.Context,
t *testing.T,
serializer serializer.EventSerializer,
logger logger.Logger,
rabbitmqBuilderFunc configurations.RabbitMQConfigurationBuilderFuc,
options ...*RabbitMQContainerOptions) (bus.Bus, error)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,17 @@ import (

"github.com/ory/dockertest/v3"
"github.com/ory/dockertest/v3/docker"
"github.com/rabbitmq/amqp091-go"
)

type rabbitmqDockerTest struct {
resource *dockertest.Resource
defaultOptions *contracts.RabbitMQContainerOptions
pool *dockertest.Pool
logger logger.Logger
}

func NewRabbitMQDockerTest() contracts.RabbitMQContainer {
func NewRabbitMQDockerTest(logger logger.Logger) contracts.RabbitMQContainer {
pool, err := dockertest.NewPool("")
if err != nil {
log.Fatalf("Could not connect to docker: %s", err)
Expand All @@ -43,7 +45,8 @@ func NewRabbitMQDockerTest() contracts.RabbitMQContainer {
ImageName: "rabbitmq",
Name: "rabbitmq-dockertest",
},
pool: pool,
logger: logger,
pool: pool,
}
}

Expand Down Expand Up @@ -74,16 +77,27 @@ func (g *rabbitmqDockerTest) CreatingContainerOptions(
hostPort, err := strconv.Atoi(
resource.GetPort(fmt.Sprintf("%s/tcp", g.defaultOptions.Ports[0])),
) // 5672
httpPort, err := strconv.Atoi(
resource.GetPort(fmt.Sprintf("%s/tcp", g.defaultOptions.Ports[1])),
) // 15672

g.defaultOptions.HostPort = hostPort
g.defaultOptions.HttpPort = httpPort

t.Cleanup(func() { _ = resource.Close() })

isConnectable := isConnectable(g.logger, g.defaultOptions)
if !isConnectable {
return g.CreatingContainerOptions(context.Background(), t, options...)
}

opt := &config.RabbitmqHostOptions{
UserName: g.defaultOptions.UserName,
Password: g.defaultOptions.Password,
HostName: g.defaultOptions.Host,
VirtualHost: g.defaultOptions.VirtualHost,
Port: g.defaultOptions.HostPort,
HttpPort: g.defaultOptions.HttpPort,
}

return opt, nil
Expand All @@ -93,7 +107,6 @@ func (g *rabbitmqDockerTest) Start(
ctx context.Context,
t *testing.T,
serializer serializer.EventSerializer,
logger logger.Logger,
rabbitmqBuilderFunc configurations.RabbitMQConfigurationBuilderFuc,
options ...*contracts.RabbitMQContainerOptions,
) (bus.Bus, error) {
Expand All @@ -115,7 +128,7 @@ func (g *rabbitmqDockerTest) Start(
mqBus, err = bus2.NewRabbitmqBus(
config,
serializer,
logger,
g.logger,
conn,
rabbitmqBuilderFunc)
if err != nil {
Expand All @@ -124,7 +137,7 @@ func (g *rabbitmqDockerTest) Start(

return nil
}); err != nil {
log.Fatalf("Could not connect to docker: %s", err)
g.logger.Errorf("Could not connect to docker: %s", err)
return nil, err
}

Expand Down Expand Up @@ -173,3 +186,38 @@ func (g *rabbitmqDockerTest) getRunOptions(

return runOptions
}

func isConnectable(logger logger.Logger, options *contracts.RabbitMQContainerOptions) bool {
conn, err := amqp091.Dial(
fmt.Sprintf("amqp://%s:%s@%s:%d", options.UserName, options.Password, options.Host, options.HostPort),
)
if err != nil {
logError(logger, options.UserName, options.Password, options.Host, options.HostPort)

return false
}

defer conn.Close()

if err != nil || (conn != nil && conn.IsClosed()) {
logError(logger, options.UserName, options.Password, options.Host, options.HostPort)

return false
}
logger.Infof(
"Opened rabbitmq connection on host: %s",
fmt.Sprintf("amqp://%s:%s@%s:%d", options.UserName, options.Password, options.Host, options.HostPort),
)

return true
}

func logError(logger logger.Logger, userName string, password string, host string, hostPort int) {
// we should not use `t.Error` or `t.Errorf` for logging errors because it will `fail` our test at the end and, we just should use logs without error like log.Error (not log.Fatal)
logger.Errorf(
fmt.Sprintf(
"Error in creating rabbitmq connection with %s",
fmt.Sprintf("amqp://%s:%s@%s:%d", userName, password, host, hostPort),
),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ func Test_RabbitMQ_Container(t *testing.T) {
defaultLogger.SetupDefaultLogger()
eventSerializer := serializer.NewDefaultEventSerializer(json.NewDefaultSerializer())

rabbitmq, err := NewRabbitMQDockerTest().Start(ctx, t, eventSerializer, defaultLogger.Logger, func(builder rabbitmqConfigurations.RabbitMQConfigurationBuilder) {
rabbitmq, err := NewRabbitMQDockerTest(
defaultLogger.Logger,
).Start(ctx, t, eventSerializer, func(builder rabbitmqConfigurations.RabbitMQConfigurationBuilder) {
builder.AddConsumer(ProducerConsumerMessage{},
func(consumerBuilder consumerConfigurations.RabbitMQConsumerConfigurationBuilder) {
consumerBuilder.WithHandlers(
Expand Down
18 changes: 18 additions & 0 deletions internal/pkg/test/containers/dockertest/rabbitmq/rabbitmq_fx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package rabbitmq

import (
"context"
"testing"

"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/rabbitmq/config"
)

var RabbitmqDockerTestContainerOptionsDecorator = func(t *testing.T, ctx context.Context) interface{} {
return func(c *config.RabbitmqOptions, logger logger.Logger) (*config.RabbitmqOptions, error) {
rabbitmqHostOptions, err := NewRabbitMQDockerTest(logger).CreatingContainerOptions(ctx, t)
c.RabbitmqHostOptions = rabbitmqHostOptions

return c, err
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ import (
"context"
"testing"

defaultLogger "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger/default_logger"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func Test_Custom_EventStoreDB_Container(t *testing.T) {
esdbInstance, err := NewEventstoreDBTestContainers().Start(context.Background(), t)
defaultLogger.SetupDefaultLogger()

esdbInstance, err := NewEventstoreDBTestContainers(defaultLogger.Logger).Start(context.Background(), t)
require.NoError(t, err)

assert.NotNil(t, esdbInstance)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/eventstroredb"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/eventstroredb/config"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/contracts"

"emperror.dev/errors"
Expand All @@ -20,9 +21,10 @@ import (
type eventstoredbTestContainers struct {
container testcontainers.Container
defaultOptions *contracts.EventstoreDBContainerOptions
logger logger.Logger
}

func NewEventstoreDBTestContainers() contracts.EventstoreDBContainer {
func NewEventstoreDBTestContainers(l logger.Logger) contracts.EventstoreDBContainer {
return &eventstoredbTestContainers{
defaultOptions: &contracts.EventstoreDBContainerOptions{
Ports: []string{"2113/tcp", "1113/tcp"},
Expand All @@ -34,6 +36,7 @@ func NewEventstoreDBTestContainers() contracts.EventstoreDBContainer {
ImageName: "eventstore/eventstore",
Name: "eventstoredb-testcontainers",
},
logger: l,
}
}

Expand Down Expand Up @@ -68,7 +71,7 @@ func (g *eventstoredbTestContainers) CreatingContainerOptions(
return nil, err
}
g.defaultOptions.HttpPort = httpPort.Int()
t.Logf("eventstoredb http and grpc port is: %d", httpPort.Int())
g.logger.Infof("eventstoredb http and grpc port is: %d", httpPort.Int())

// get a free random host port for tcp port eventstoredb
tcpPort, err := dbContainer.MappedPort(ctx, nat.Port(g.defaultOptions.Ports[1]))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import (
"testing"

"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/eventstroredb/config"
"github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/logger"
)

var EventstoreDBContainerOptionsDecorator = func(t *testing.T, ctx context.Context) interface{} {
return func(c *config.EventStoreDbOptions) (*config.EventStoreDbOptions, error) {
newOption, err := NewEventstoreDBTestContainers().CreatingContainerOptions(ctx, t)
return func(c *config.EventStoreDbOptions, logger logger.Logger) (*config.EventStoreDbOptions, error) {
newOption, err := NewEventstoreDBTestContainers(logger).CreatingContainerOptions(ctx, t)
if err != nil {
return nil, err
}
Expand All @@ -19,8 +20,8 @@ var EventstoreDBContainerOptionsDecorator = func(t *testing.T, ctx context.Conte
}
}

var ReplaceEventStoreContainerOptions = func(t *testing.T, options *config.EventStoreDbOptions, ctx context.Context) error {
newOption, err := NewEventstoreDBTestContainers().CreatingContainerOptions(ctx, t)
var ReplaceEventStoreContainerOptions = func(t *testing.T, options *config.EventStoreDbOptions, ctx context.Context, logger logger.Logger) error {
newOption, err := NewEventstoreDBTestContainers(logger).CreatingContainerOptions(ctx, t)
if err != nil {
return err
}
Expand Down
Loading

0 comments on commit a548285

Please sign in to comment.