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  }