package models_test import ( "arbeitszeitmessung/helper" "arbeitszeitmessung/models" "database/sql" "fmt" "log" "testing" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" _ "github.com/lib/pq" ) type DBFixture struct { Database models.IDatabase TX *sql.Tx } func SetupDBFixture(t *testing.T) *DBFixture { t.Helper() dbHost := helper.GetEnv("POSTGRES_HOST", "localhost") dbPort := helper.GetEnv("POSTGRES_PORT", "5433") dbName := helper.GetEnv("POSTGRES_DB", "arbeitszeitmessung") dbUser := helper.GetEnv("POSTGRES_USER", "postgres") dbPassword := helper.GetEnv("POSTGRES_PASSWORD", "password") connStr := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable&TimeZone=Europe/Berlin", dbUser, dbPassword, dbHost, dbPort, dbName) db, err := sql.Open("postgres", connStr) if err != nil { t.Fatalf("failed to connect to database: %v", err) } defer db.Close() err = MigrateDB(db, "file://../../migrations") if err != nil && err != migrate.ErrNoChange { t.Fatalf("Failed to migrate database: %v", err) } tx, err := db.Begin() if err != nil { t.Fatalf("Failed to start transaction: %v", err) } t.Cleanup(func() { tx.Rollback() db.Close() }) return &DBFixture{ Database: tx, TX: tx, } } func MigrateDB(db *sql.DB, fileUrl string) error { driver, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { log.Fatalln("Error starting migration", err) } m, err := migrate.NewWithDatabaseInstance( fileUrl, "postgres", driver) return m.Up() }