package database import ( "context" "database/sql" "fmt" "log" "testing" "time" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) var exec *sql.DB func TestMain(m *testing.M) { pool, err := dockertest.NewPool("") if err != nil { log.Fatalf("Could not create pool: %s", err) } err = pool.Client.Ping() if err != nil { log.Fatalf("Could not connect to Docker: %s", err) } resource, err := pool.RunWithOptions(&dockertest.RunOptions{ Repository: "postgres", Tag: "16", Env: []string{ "POSTGRES_PASSWORD=secret", "POSTGRES_USER=ibd-client-test", "POSTGRES_DB=ibd-client-test", "listen_addresses='*'", }, Cmd: []string{ "postgres", "-c", "log_statement=all", }, }, func(config *docker.HostConfig) { config.AutoRemove = true config.RestartPolicy = docker.RestartPolicy{Name: "no"} }) if err != nil { log.Fatalf("Could not start resource: %s", err) } hostAndPort := resource.GetHostPort("5432/tcp") databaseUrl := fmt.Sprintf("postgres://ibd-client-test:secret@%s/ibd-client-test?sslmode=disable", hostAndPort) // Kill container after 120 seconds _ = resource.Expire(120) pool.MaxWait = 120 * time.Second if err = pool.Retry(func() error { exec, err = sql.Open("postgres", databaseUrl) if err != nil { return err } return exec.Ping() }); err != nil { log.Fatalf("Could not connect to database: %s", err) } err = Migrate(context.Background(), databaseUrl) if err != nil { log.Fatalf("Could not migrate database: %s", err) } defer func() { if err := pool.Purge(resource); err != nil { log.Fatalf("Could not purge resource: %s", err) } }() m.Run() }