70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
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)
|
|
}
|
|
|
|
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()
|
|
}
|