Files
tp/main_dc/yalarba/api_yal/test/intergration/setup_test.go
T
valitovgaziz 1bb91820d0 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
2026-05-31 05:12:49 +05:00

125 lines
3.5 KiB
Go

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)
}
}
}