github.com/icyphox/x@v0.0.355-0.20220311094250-029bd783e8b8/sqlcon/parse_opts_test.go (about) 1 package sqlcon 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/ory/x/logrusx" 11 ) 12 13 func TestParseConnectionOptions(t *testing.T) { 14 defaultMaxConns, defaultMaxIdleConns, defaultMaxConnIdleTime, defaultMaxConnLifetime := maxParallelism()*2, maxParallelism(), time.Duration(0), time.Duration(0) 15 logger := logrusx.New("", "") 16 for i, tc := range []struct { 17 name, dsn, cleanedDSN string 18 maxConns, maxIdleConns int 19 maxConnIdleTime, maxConnLifetime time.Duration 20 }{ 21 { 22 name: "no parameters", 23 dsn: "postgres://user:pwd@host:port", 24 cleanedDSN: "postgres://user:pwd@host:port", 25 maxConns: defaultMaxConns, 26 maxIdleConns: defaultMaxIdleConns, 27 maxConnIdleTime: defaultMaxConnIdleTime, 28 maxConnLifetime: defaultMaxConnLifetime, 29 }, 30 { 31 name: "only other parameters", 32 dsn: "postgres://user:pwd@host:port?bar=value&foo=other_value", 33 cleanedDSN: "postgres://user:pwd@host:port?bar=value&foo=other_value", 34 maxConns: defaultMaxConns, 35 maxIdleConns: defaultMaxIdleConns, 36 maxConnIdleTime: defaultMaxConnIdleTime, 37 maxConnLifetime: defaultMaxConnLifetime, 38 }, 39 { 40 name: "only maxConns", 41 dsn: "postgres://user:pwd@host:port?max_conns=5254", 42 cleanedDSN: "postgres://user:pwd@host:port?", 43 maxConns: 5254, 44 maxIdleConns: defaultMaxIdleConns, 45 maxConnIdleTime: defaultMaxConnIdleTime, 46 maxConnLifetime: defaultMaxConnLifetime, 47 }, 48 { 49 name: "only maxIdleConns", 50 dsn: "postgres://user:pwd@host:port?max_idle_conns=9342", 51 cleanedDSN: "postgres://user:pwd@host:port?", 52 maxConns: defaultMaxConns, 53 maxIdleConns: 9342, 54 maxConnIdleTime: defaultMaxConnIdleTime, 55 maxConnLifetime: defaultMaxConnLifetime, 56 }, 57 { 58 name: "only maxConnIdleTime", 59 dsn: "postgres://user:pwd@host:port?max_conn_idle_time=112s", 60 cleanedDSN: "postgres://user:pwd@host:port?", 61 maxConns: defaultMaxConns, 62 maxIdleConns: defaultMaxIdleConns, 63 maxConnIdleTime: 112 * time.Second, 64 maxConnLifetime: defaultMaxConnLifetime, 65 }, 66 { 67 name: "only maxConnLifetime", 68 dsn: "postgres://user:pwd@host:port?max_conn_lifetime=112s", 69 cleanedDSN: "postgres://user:pwd@host:port?", 70 maxConns: defaultMaxConns, 71 maxIdleConns: defaultMaxIdleConns, 72 maxConnIdleTime: defaultMaxConnIdleTime, 73 maxConnLifetime: 112 * time.Second, 74 }, 75 { 76 name: "all parameters and others", 77 dsn: "postgres://user:pwd@host:port?max_conns=5254&max_idle_conns=9342&max_conn_lifetime=112s&bar=value&foo=other_value", 78 cleanedDSN: "postgres://user:pwd@host:port?bar=value&foo=other_value", 79 maxConns: 5254, 80 maxIdleConns: 9342, 81 maxConnIdleTime: defaultMaxConnIdleTime, 82 maxConnLifetime: 112 * time.Second, 83 }, 84 } { 85 t.Run(fmt.Sprintf("case=%d/name=%s", i, tc.name), func(t *testing.T) { 86 maxConns, maxIdleConns, maxConnLifetime, maxConnIdleTime, cleanedDSN := ParseConnectionOptions(logger, tc.dsn) 87 assert.Equal(t, tc.maxConns, maxConns) 88 assert.Equal(t, tc.maxIdleConns, maxIdleConns) 89 assert.Equal(t, tc.maxConnLifetime, maxConnLifetime) 90 assert.Equal(t, tc.maxConnIdleTime, maxConnIdleTime) 91 assert.Equal(t, tc.cleanedDSN, cleanedDSN) 92 }) 93 } 94 } 95 96 func TestFinalizeDSN(t *testing.T) { 97 for i, tc := range []struct { 98 dsn, expected string 99 }{ 100 { 101 dsn: "mysql://localhost", 102 expected: "mysql://localhost?multiStatements=true&parseTime=true", 103 }, 104 { 105 dsn: "mysql://localhost?multiStatements=true&parseTime=true", 106 expected: "mysql://localhost?multiStatements=true&parseTime=true", 107 }, 108 { 109 dsn: "postgres://localhost", 110 expected: "postgres://localhost", 111 }, 112 } { 113 t.Run(fmt.Sprintf("case=%d", i), func(t *testing.T) { 114 assert.Equal(t, tc.expected, FinalizeDSN(logrusx.New("", ""), tc.dsn)) 115 }) 116 } 117 }