github.com/friesencr/pop/v6@v6.1.6/dialect_postgresql_test.go (about)

     1  package pop
     2  
     3  import (
     4  	"os"
     5  	"os/user"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func Test_PostgreSQL_ConnectionDetails_Values_Finalize(t *testing.T) {
    12  	r := require.New(t)
    13  
    14  	cd := &ConnectionDetails{
    15  		Dialect:  "postgres",
    16  		Database: "database",
    17  		Host:     "host",
    18  		Port:     "1234",
    19  		User:     "user",
    20  		Password: "pass#",
    21  	}
    22  	err := cd.Finalize()
    23  	r.NoError(err)
    24  
    25  	p := &postgresql{commonDialect: commonDialect{ConnectionDetails: cd}}
    26  
    27  	r.Equal("postgres://user:pass%23@host:1234/database?", p.URL())
    28  }
    29  
    30  func Test_PostgreSQL_Connection_String(t *testing.T) {
    31  	r := require.New(t)
    32  
    33  	url := "host=host port=1234 dbname=database user=user password=pass#"
    34  	cd := &ConnectionDetails{
    35  		Dialect: "postgres",
    36  		URL:     url,
    37  	}
    38  	err := cd.Finalize()
    39  	r.NoError(err)
    40  
    41  	r.Equal(url, cd.URL)
    42  	r.Equal("postgres", cd.Dialect)
    43  	r.Equal("host", cd.Host)
    44  	r.Equal("pass#", cd.Password)
    45  	r.Equal("1234", cd.Port)
    46  	r.Equal("user", cd.User)
    47  	r.Equal("database", cd.Database)
    48  }
    49  
    50  func Test_PostgreSQL_Connection_String_Options(t *testing.T) {
    51  	r := require.New(t)
    52  
    53  	url := "host=host port=1234 dbname=database user=user password=pass# sslmode=disable fallback_application_name=test_app connect_timeout=10 sslcert=/some/location sslkey=/some/other/location sslrootcert=/root/location"
    54  	cd := &ConnectionDetails{
    55  		Dialect: "postgres",
    56  		URL:     url,
    57  	}
    58  	err := cd.Finalize()
    59  	r.NoError(err)
    60  
    61  	r.Equal(url, cd.URL)
    62  
    63  	r.Equal("disable", cd.Options["sslmode"])
    64  	r.Equal("test_app", cd.Options["fallback_application_name"])
    65  }
    66  
    67  func Test_PostgreSQL_Connection_String_Without_User(t *testing.T) {
    68  	r := require.New(t)
    69  
    70  	url := "dbname=database"
    71  	cd := &ConnectionDetails{
    72  		Dialect: "postgres",
    73  		URL:     url,
    74  	}
    75  	err := cd.Finalize()
    76  	r.NoError(err)
    77  
    78  	uc := os.Getenv("PGUSER")
    79  	if uc == "" {
    80  		c, err := user.Current()
    81  		if err == nil {
    82  			uc = c.Username
    83  		}
    84  	}
    85  
    86  	r.Equal(url, cd.URL)
    87  	r.Equal("postgres", cd.Dialect)
    88  
    89  	var foundHost bool
    90  	for _, host := range []string{
    91  		"/var/run/postgresql", // Debian
    92  		"/private/tmp",        // OSX - homebrew
    93  		"/tmp",                // standard PostgreSQL
    94  		"localhost",           // Windows does not do sockets
    95  	} {
    96  		if cd.Host == host {
    97  			foundHost = true
    98  			break
    99  		}
   100  	}
   101  	r.True(foundHost, `Got host: "%s"`, cd.Host)
   102  
   103  	r.Equal(os.Getenv("PGPASSWORD"), cd.Password)
   104  	r.Equal(portPostgreSQL, cd.Port) // fallback
   105  	r.Equal(uc, cd.User)
   106  	r.Equal("database", cd.Database)
   107  }
   108  
   109  func Test_PostgreSQL_Connection_String_Failure(t *testing.T) {
   110  	r := require.New(t)
   111  
   112  	url := "abc"
   113  	cd := &ConnectionDetails{
   114  		Dialect: "postgres",
   115  		URL:     url,
   116  	}
   117  	err := cd.Finalize()
   118  	r.Error(err)
   119  	r.Equal("postgres", cd.Dialect)
   120  }
   121  
   122  func Test_PostgreSQL_Quotable(t *testing.T) {
   123  	r := require.New(t)
   124  	p := postgresql{}
   125  
   126  	r.Equal(`"table_name"`, p.Quote("table_name"))
   127  	r.Equal(`"schema"."table_name"`, p.Quote("schema.table_name"))
   128  	r.Equal(`"schema"."table name"`, p.Quote(`"schema"."table name"`))
   129  }