On branch main
new file: main_dc/yalarba/api_yal/test/e2e/api_test.go new file: main_dc/yalarba/api_yal/test/fixtures/test_data.go new file: main_dc/yalarba/api_yal/test/intergration/account_intergration_test.go new file: main_dc/yalarba/api_yal/test/intergration/auth_integration_test.go new file: main_dc/yalarba/api_yal/test/intergration/objects_integration_test.go new file: main_dc/yalarba/api_yal/test/intergration/setup_test.go add test files not implemented
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/ory/dockertest/v3"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
|
||||
// Импортируйте ваши модели и конфиги
|
||||
"your_project/internal/config"
|
||||
"your_project/internal/database"
|
||||
"your_project/internal/router"
|
||||
)
|
||||
|
||||
var (
|
||||
TestDB *gorm.DB
|
||||
TestRouter *chi.Mux
|
||||
)
|
||||
|
||||
// TestMain - запускается один раз перед всеми тестами в пакете
|
||||
func TestMain(m *testing.M) {
|
||||
// Поднимаем PostgreSQL в Docker
|
||||
db, cleanup := setupTestDatabase()
|
||||
TestDB = db
|
||||
|
||||
// Инициализируем роутер с тестовой БД
|
||||
TestRouter = setupTestRouter(TestDB)
|
||||
|
||||
// Запускаем тесты
|
||||
code := m.Run()
|
||||
|
||||
// Очищаем ресурсы
|
||||
cleanup()
|
||||
|
||||
os.Exit(code)
|
||||
}
|
||||
|
||||
func setupTestDatabase() (*gorm.DB, func()) {
|
||||
// Используем dockertest
|
||||
pool, err := dockertest.NewPool("")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Could not connect to Docker: %s", err))
|
||||
}
|
||||
|
||||
// Запускаем PostgreSQL контейнер
|
||||
resource, err := pool.Run("postgres", "15-alpine", []string{
|
||||
"POSTGRES_PASSWORD=testpass",
|
||||
"POSTGRES_USER=testuser",
|
||||
"POSTGRES_DB=testdb",
|
||||
})
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Could not start PostgreSQL container: %s", err))
|
||||
}
|
||||
|
||||
// Ждем пока база поднимется
|
||||
var db *gorm.DB
|
||||
if err := pool.Retry(func() error {
|
||||
var err error
|
||||
dsn := fmt.Sprintf("host=localhost port=%s user=testuser password=testpass dbname=testdb sslmode=disable",
|
||||
resource.GetPort("5432/tcp"))
|
||||
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return sqlDB.Ping()
|
||||
}); err != nil {
|
||||
panic(fmt.Sprintf("Could not connect to database: %s", err))
|
||||
}
|
||||
|
||||
// Выполняем миграции (как в вашем main.go)
|
||||
if err := database.MigrateModels(db); err != nil {
|
||||
panic(fmt.Sprintf("Could not migrate: %s", err))
|
||||
}
|
||||
|
||||
// Очищаем базу после тестов
|
||||
cleanup := func() {
|
||||
if err := pool.Purge(resource); err != nil {
|
||||
fmt.Printf("Could not purge resource: %s\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
return db, cleanup
|
||||
}
|
||||
|
||||
func setupTestRouter(db *gorm.DB) *chi.Mux {
|
||||
// Инициализируем ваш роутер с тестовой БД
|
||||
appConfig := &config.Config{
|
||||
Environment: "test",
|
||||
AppPort: "8089",
|
||||
// ... другие настройки
|
||||
}
|
||||
|
||||
// Ваша функция настройки роутера
|
||||
return router.SetupRouter(db, appConfig)
|
||||
}
|
||||
|
||||
// Вспомогательная функция для очистки таблиц между тестами
|
||||
func CleanDatabase(t *testing.T) {
|
||||
tables := []string{
|
||||
"users",
|
||||
"accounts",
|
||||
"objects",
|
||||
"feedbacks",
|
||||
"comments",
|
||||
"ratings",
|
||||
"appeals",
|
||||
// Добавьте все ваши таблицы
|
||||
}
|
||||
|
||||
for _, table := range tables {
|
||||
if err := TestDB.Exec(fmt.Sprintf("TRUNCATE TABLE %s RESTART IDENTITY CASCADE", table)).Error; err != nil {
|
||||
t.Logf("Warning: could not truncate table %s: %v", table, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user