Loading...
Loading...
Generate comprehensive Go integration tests using testify suite patterns with real database and infrastructure dependencies. Use when creating or updating integration test files, testing use cases against real databases, verifying end-to-end flows, or when asked to add integration test coverage for Go code.
npx skill4agent add cristiano-pacheco/ai-rules go-integration-teststest/integration/internal/internal/modules/identity/usecase/user/user_register_usecase.gotest/integration/modules/identity/usecase/user/user_register_usecase_test.goTestExecute_ValidInput_ReturnsUserTestExecute_DuplicateEmail_ReturnsErrorsuite.SuitesutkitdbSetupSuiteTearDownSuiteSetupTest//go:build integration_testsuitesuite.Equal(v, 10)suite.Require()suite.Require().ErrorIssuite.Require().Error.AssertExpectations(s.T())//go:build integration
package user_test
import (
"context"
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite"
"github.com/cristiano-pacheco/bricks/pkg/itestkit"
"github.com/cristiano-pacheco/bricks/pkg/validator"
"github.com/cristiano-pacheco/pingo/internal/modules/identity/repository"
"github.com/cristiano-pacheco/pingo/internal/modules/identity/usecase/user"
"github.com/cristiano-pacheco/pingo/internal/shared/config"
"github.com/cristiano-pacheco/pingo/internal/shared/database"
"github.com/cristiano-pacheco/pingo/test/mocks"
)
func TestMain(m *testing.M) {
itestkit.TestMain(m)
}
type UserRegisterUseCaseTestSuite struct {
suite.Suite
kit *itestkit.ITestKit
db *database.PingoDB
sut *user.UserRegisterUseCase
emailSender *mocks.MockEmailSender
cfg config.Config
}
func TestUserRegisterUseCaseSuite(t *testing.T) {
suite.Run(t, new(UserRegisterUseCaseTestSuite))
}
func (s *UserRegisterUseCaseTestSuite) SetupSuite() {
s.kit = itestkit.New(itestkit.Config{
PostgresImage: "postgres:16-alpine",
RedisImage: "redis:7-alpine",
MigrationsPath: "file://migrations",
Database: "pingo_test",
User: "pingo_test",
Password: "pingo_test",
})
err := s.kit.StartPostgres()
s.Require().NoError(err)
err = s.kit.RunMigrations()
s.Require().NoError(err)
s.db = &database.PingoDB{DB: s.kit.DB()}
}
func (s *UserRegisterUseCaseTestSuite) TearDownSuite() {
if s.kit != nil {
s.kit.StopPostgres()
}
}
func (s *UserRegisterUseCaseTestSuite) SetupTest() {
s.kit.TruncateTables(s.T())
s.emailSender = mocks.NewMockEmailSender(s.T())
s.cfg = s.createTestConfig()
s.sut = s.createTestUseCase()
}
func (s *UserRegisterUseCaseTestSuite) createTestConfig() config.Config {
return config.Config{
App: config.AppConfig{
BaseURL: "http://test.example.com",
},
}
}
func (s *UserRegisterUseCaseTestSuite) createTestUseCase() *user.UserRegisterUseCase {
log := new(mocks.MockLogger)
v, err := validator.New()
s.Require().NoError(err)
userRepo := repository.NewUserRepository(s.db)
return user.NewUserRegisterUseCase(
userRepo,
s.emailSender,
v,
s.cfg,
log,
)
}
func (s *UserRegisterUseCaseTestSuite) TestExecute_ValidInput_ReturnsUser() {
// Arrange
ctx := context.Background()
input := user.UserRegisterInput{
Email: "test@example.com",
Password: "Password123!",
FirstName: "John",
LastName: "Doe",
}
// Act
output, err := s.sut.Execute(ctx, input)
// Assert
s.Require().NoError(err)
s.NotZero(output.ID)
s.Equal(input.Email, output.Email)
var savedUser model.UserModel
err = s.db.DB.Where("id = ?", output.ID).First(&savedUser).Error
s.Require().NoError(err)
s.Equal(input.Email, savedUser.Email)
}
func (s *UserRegisterUseCaseTestSuite) TestExecute_DuplicateEmail_ReturnsError() {
// Arrange
ctx := context.Background()
input := user.UserRegisterInput{
Email: "test@example.com",
Password: "Password123!",
FirstName: "John",
LastName: "Doe",
}
// Act - First registration
_, err := s.sut.Execute(ctx, input)
s.Require().NoError(err)
// Act - Second registration with same email
_, err = s.sut.Execute(ctx, input)
// Assert
s.Require().Error(err)
s.ErrorIs(err, errs.ErrDuplicateEmail)
}.Maybe()mock.Anythingfunc (s *UserRegisterUseCaseTestSuite) SetupTest() {
s.kit.TruncateTables(s.T())
s.emailSender = mocks.NewMockEmailSender(s.T())
s.tokenGenerator = mocks.NewMockTokenGenerator(s.T())
// Setup optional mock expectations
s.emailSender.On("Send", mock.Anything, mock.Anything, mock.Anything, mock.Anything).
Return(nil).Maybe()
s.tokenGenerator.On("GenerateToken").Return("test-token", nil).Maybe()
s.sut = s.createTestUseCase()
}// Arrange
// Act
// Asserttest/integration/| Source File | Integration Test File |
|---|---|
| |
| |
# Run all integration tests
make test-integration