package integration import ( "fmt" "os" "testing" "github.com/go-chi/chi/v5" "github.com/ory/dockertest/v3" "gorm.io/driver/postgres" "gorm.io/gorm" ) 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) } } }