Specs refactor and tweaks
- Make ParseOptions func to take an arg and return struct so we can test it - Refactor and add more tests for options parsing - Run test suite on postgres 10.x branch - Change format for connection idle timer from float64 to in
This commit is contained in:
@@ -9,86 +9,97 @@ import (
|
||||
)
|
||||
|
||||
type Options struct {
|
||||
Version bool `short:"v" long:"version" description:"Print version"`
|
||||
Debug bool `short:"d" long:"debug" description:"Enable debugging mode" default:"false"`
|
||||
Url string `long:"url" description:"Database connection string"`
|
||||
Host string `long:"host" description:"Server hostname or IP"`
|
||||
Port int `long:"port" description:"Server port" default:"5432"`
|
||||
User string `long:"user" description:"Database user"`
|
||||
Pass string `long:"pass" description:"Password for user"`
|
||||
DbName string `long:"db" description:"Database name"`
|
||||
Ssl string `long:"ssl" description:"SSL option"`
|
||||
HttpHost string `long:"bind" description:"HTTP server host" default:"localhost"`
|
||||
HttpPort uint `long:"listen" description:"HTTP server listen port" default:"8081"`
|
||||
AuthUser string `long:"auth-user" description:"HTTP basic auth user"`
|
||||
AuthPass string `long:"auth-pass" description:"HTTP basic auth password"`
|
||||
SkipOpen bool `short:"s" long:"skip-open" description:"Skip browser open on start"`
|
||||
Sessions bool `long:"sessions" description:"Enable multiple database sessions" default:"false"`
|
||||
Prefix string `long:"prefix" description:"Add a url prefix"`
|
||||
ReadOnly bool `long:"readonly" description:"Run database connection in readonly mode"`
|
||||
LockSession bool `long:"lock-session" description:"Lock session to a single database connection" default:"false"`
|
||||
Bookmark string `short:"b" long:"bookmark" description:"Bookmark to use for connection. Bookmark files are stored under $HOME/.pgweb/bookmarks/*.toml" default:""`
|
||||
BookmarksDir string `long:"bookmarks-dir" description:"Overrides default directory for bookmark files to search" default:""`
|
||||
DisablePrettyJson bool `long:"no-pretty-json" description:"Disable JSON formatting feature for result export" default:"false"`
|
||||
DisableSSH bool `long:"no-ssh" description:"Disable database connections via SSH" default:"false"`
|
||||
ConnectBackend string `long:"connect-backend" description:"Enable database authentication through a third party backend"`
|
||||
ConnectToken string `long:"connect-token" description:"Authentication token for the third-party connect backend"`
|
||||
ConnectHeaders string `long:"connect-headers" description:"List of headers to pass to the connect backend"`
|
||||
DisableConnectionIdleTimeout bool `long:"no-idle-timeout" description:"Disable connection idle timeout" default:"false"`
|
||||
ConnectionIdleTimeout float64 `long:"idle-timeout" description:"Set connection idle timeout in minutes" default:"180"`
|
||||
Cors bool `long:"cors" description:"Enable Cross-Origin Resource Sharing (CORS)" default:"false"`
|
||||
CorsOrigin string `long:"cors-origin" description:"Allowed CORS origins" default:"*"`
|
||||
Version bool `short:"v" long:"version" description:"Print version"`
|
||||
Debug bool `short:"d" long:"debug" description:"Enable debugging mode" default:"false"`
|
||||
Url string `long:"url" description:"Database connection string"`
|
||||
Host string `long:"host" description:"Server hostname or IP"`
|
||||
Port int `long:"port" description:"Server port" default:"5432"`
|
||||
User string `long:"user" description:"Database user"`
|
||||
Pass string `long:"pass" description:"Password for user"`
|
||||
DbName string `long:"db" description:"Database name"`
|
||||
Ssl string `long:"ssl" description:"SSL option"`
|
||||
HttpHost string `long:"bind" description:"HTTP server host" default:"localhost"`
|
||||
HttpPort uint `long:"listen" description:"HTTP server listen port" default:"8081"`
|
||||
AuthUser string `long:"auth-user" description:"HTTP basic auth user"`
|
||||
AuthPass string `long:"auth-pass" description:"HTTP basic auth password"`
|
||||
SkipOpen bool `short:"s" long:"skip-open" description:"Skip browser open on start"`
|
||||
Sessions bool `long:"sessions" description:"Enable multiple database sessions" default:"false"`
|
||||
Prefix string `long:"prefix" description:"Add a url prefix"`
|
||||
ReadOnly bool `long:"readonly" description:"Run database connection in readonly mode"`
|
||||
LockSession bool `long:"lock-session" description:"Lock session to a single database connection" default:"false"`
|
||||
Bookmark string `short:"b" long:"bookmark" description:"Bookmark to use for connection. Bookmark files are stored under $HOME/.pgweb/bookmarks/*.toml" default:""`
|
||||
BookmarksDir string `long:"bookmarks-dir" description:"Overrides default directory for bookmark files to search" default:""`
|
||||
DisablePrettyJson bool `long:"no-pretty-json" description:"Disable JSON formatting feature for result export" default:"false"`
|
||||
DisableSSH bool `long:"no-ssh" description:"Disable database connections via SSH" default:"false"`
|
||||
ConnectBackend string `long:"connect-backend" description:"Enable database authentication through a third party backend"`
|
||||
ConnectToken string `long:"connect-token" description:"Authentication token for the third-party connect backend"`
|
||||
ConnectHeaders string `long:"connect-headers" description:"List of headers to pass to the connect backend"`
|
||||
DisableConnectionIdleTimeout bool `long:"no-idle-timeout" description:"Disable connection idle timeout" default:"false"`
|
||||
ConnectionIdleTimeout int `long:"idle-timeout" description:"Set connection idle timeout in minutes" default:"180"`
|
||||
Cors bool `long:"cors" description:"Enable Cross-Origin Resource Sharing (CORS)" default:"false"`
|
||||
CorsOrigin string `long:"cors-origin" description:"Allowed CORS origins" default:"*"`
|
||||
}
|
||||
|
||||
var Opts Options
|
||||
|
||||
func ParseOptions() error {
|
||||
_, err := flags.ParseArgs(&Opts, os.Args)
|
||||
func ParseOptions(args []string) (Options, error) {
|
||||
var opts = Options{}
|
||||
|
||||
_, err := flags.ParseArgs(&opts, args)
|
||||
if err != nil {
|
||||
return err
|
||||
return opts, err
|
||||
}
|
||||
|
||||
if Opts.Url == "" {
|
||||
Opts.Url = os.Getenv("DATABASE_URL")
|
||||
if opts.Url == "" {
|
||||
opts.Url = os.Getenv("DATABASE_URL")
|
||||
}
|
||||
|
||||
if os.Getenv("SESSIONS") != "" {
|
||||
Opts.Sessions = true
|
||||
opts.Sessions = true
|
||||
}
|
||||
|
||||
if os.Getenv("LOCK_SESSION") != "" {
|
||||
Opts.LockSession = true
|
||||
Opts.Sessions = false
|
||||
opts.LockSession = true
|
||||
opts.Sessions = false
|
||||
}
|
||||
|
||||
if Opts.Prefix != "" && !strings.Contains(Opts.Prefix, "/") {
|
||||
Opts.Prefix = Opts.Prefix + "/"
|
||||
if opts.Prefix != "" && !strings.Contains(opts.Prefix, "/") {
|
||||
opts.Prefix = opts.Prefix + "/"
|
||||
}
|
||||
|
||||
if Opts.AuthUser == "" && os.Getenv("AUTH_USER") != "" {
|
||||
Opts.AuthUser = os.Getenv("AUTH_USER")
|
||||
if opts.AuthUser == "" && os.Getenv("AUTH_USER") != "" {
|
||||
opts.AuthUser = os.Getenv("AUTH_USER")
|
||||
}
|
||||
|
||||
if Opts.AuthPass == "" && os.Getenv("AUTH_PASS") != "" {
|
||||
Opts.AuthPass = os.Getenv("AUTH_PASS")
|
||||
if opts.AuthPass == "" && os.Getenv("AUTH_PASS") != "" {
|
||||
opts.AuthPass = os.Getenv("AUTH_PASS")
|
||||
}
|
||||
|
||||
if Opts.Bookmark != "" && Opts.Sessions {
|
||||
return errors.New("--bookmark is not allowed in multi-session mode")
|
||||
if opts.Bookmark != "" && opts.Sessions {
|
||||
return opts, errors.New("--bookmark is not allowed in multi-session mode")
|
||||
}
|
||||
|
||||
if Opts.ConnectBackend != "" {
|
||||
if !Opts.Sessions {
|
||||
return errors.New("--sessions flag must be set")
|
||||
if opts.ConnectBackend != "" {
|
||||
if !opts.Sessions {
|
||||
return opts, errors.New("--sessions flag must be set")
|
||||
}
|
||||
if Opts.ConnectToken == "" {
|
||||
return errors.New("--connect-token flag must be set")
|
||||
if opts.ConnectToken == "" {
|
||||
return opts, errors.New("--connect-token flag must be set")
|
||||
}
|
||||
} else {
|
||||
if Opts.ConnectToken != "" || Opts.ConnectHeaders != "" {
|
||||
return errors.New("--connect-backend flag must be set")
|
||||
if opts.ConnectToken != "" || opts.ConnectHeaders != "" {
|
||||
return opts, errors.New("--connect-backend flag must be set")
|
||||
}
|
||||
}
|
||||
|
||||
return opts, nil
|
||||
}
|
||||
|
||||
func SetDefaultOptions() error {
|
||||
opts, err := ParseOptions([]string{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Opts = opts
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1,38 +1,50 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test_Options(t *testing.T) {
|
||||
err := ParseOptions()
|
||||
|
||||
func TestParseOptions(t *testing.T) {
|
||||
// Test default behavior
|
||||
opts, err := ParseOptions([]string{})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, false, opts.Sessions)
|
||||
assert.Equal(t, "", opts.Prefix)
|
||||
assert.Equal(t, "", opts.ConnectToken)
|
||||
assert.Equal(t, "", opts.ConnectHeaders)
|
||||
assert.Equal(t, false, opts.DisableSSH)
|
||||
assert.Equal(t, false, opts.DisablePrettyJson)
|
||||
assert.Equal(t, false, opts.DisableConnectionIdleTimeout)
|
||||
assert.Equal(t, 180, opts.ConnectionIdleTimeout)
|
||||
assert.Equal(t, false, opts.Cors)
|
||||
assert.Equal(t, "*", opts.CorsOrigin)
|
||||
|
||||
// Test sessions
|
||||
opts, err = ParseOptions([]string{"--sessions", "1"})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, true, opts.Sessions)
|
||||
|
||||
opts, err = ParseOptions([]string{"--sessions", "1", "--bookmark", "test"})
|
||||
assert.EqualError(t, err, "--bookmark is not allowed in multi-session mode")
|
||||
|
||||
// Test url prefix
|
||||
opts, err = ParseOptions([]string{"--prefix", "pgweb"})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "pgweb/", opts.Prefix)
|
||||
|
||||
opts, err = ParseOptions([]string{"--prefix", "pgweb/"})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "pgweb/", opts.Prefix)
|
||||
|
||||
// Test connect backend options
|
||||
opts, err = ParseOptions([]string{"--connect-backend", "test"})
|
||||
assert.EqualError(t, err, "--sessions flag must be set")
|
||||
|
||||
opts, err = ParseOptions([]string{"--connect-backend", "test", "--sessions"})
|
||||
assert.EqualError(t, err, "--connect-token flag must be set")
|
||||
|
||||
opts, err = ParseOptions([]string{"--connect-backend", "test", "--sessions", "--connect-token", "token"})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, false, Opts.Sessions)
|
||||
assert.Equal(t, "", Opts.Prefix)
|
||||
}
|
||||
|
||||
func Test_SessionsOption(t *testing.T) {
|
||||
oldargs := os.Args
|
||||
defer func() { os.Args = oldargs }()
|
||||
|
||||
os.Args = []string{"--sessions", "1"}
|
||||
assert.NoError(t, ParseOptions())
|
||||
assert.Equal(t, true, Opts.Sessions)
|
||||
}
|
||||
|
||||
func Test_PrefixOption(t *testing.T) {
|
||||
oldargs := os.Args
|
||||
defer func() { os.Args = oldargs }()
|
||||
|
||||
os.Args = []string{"--prefix", "pgweb"}
|
||||
assert.NoError(t, ParseOptions())
|
||||
assert.Equal(t, "pgweb/", Opts.Prefix)
|
||||
|
||||
os.Args = []string{"--prefix", "pgweb/"}
|
||||
assert.NoError(t, ParseOptions())
|
||||
assert.Equal(t, "pgweb/", Opts.Prefix)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user