status-im/status-go

View on GitHub
postgres/helpers.go

Summary

Maintainability
A
0 mins
Test Coverage
D
65%
package postgres

import (
    "database/sql"
    "fmt"
    "os"

    // Import postgres driver
    _ "github.com/lib/pq"
)

var (
    DefaultTestDBHost = GetEnvDefault("TEST_POSTGRES_HOST", "localhost")
    DefaultTestDBPort = GetEnvDefault("TEST_POSTGRES_PORT", "5432")
    DefaultTestURI    = fmt.Sprintf("postgres://postgres@%s:%s/postgres?sslmode=disable", DefaultTestDBHost, DefaultTestDBPort)
    DropTableURI      = fmt.Sprintf("postgres://postgres@%s:%s/template1?sslmode=disable", DefaultTestDBHost, DefaultTestDBPort)
)

func GetEnvDefault(key, fallback string) string {
    value := os.Getenv(key)
    if len(value) == 0 {
        return fallback
    }
    return value
}

func ResetDefaultTestPostgresDB() error {
    db, err := sql.Open("postgres", DropTableURI)
    if err != nil {
        return err
    }
    defer func() {
        _ = db.Close()
    }()

    // Drop current and prevent any future connections. Used in tests. Details here:
    // https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db
    _, err = db.Exec("REVOKE CONNECT ON DATABASE postgres FROM public;")
    if err != nil {
        return err
    }

    _, err = db.Exec("SELECT pid, pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'postgres' AND pid <> pg_backend_pid();")
    if err != nil {
        return err
    }

    _, err = db.Exec("DROP DATABASE IF EXISTS postgres;")
    if err != nil {
        return err
    }

    _, err = db.Exec("CREATE DATABASE postgres;")
    if err != nil {
        return err
    }

    _, err = db.Exec("GRANT CONNECT ON DATABASE postgres TO public;")
    if err != nil {
        return err
    }

    return nil
}