diff --git a/config_test.go b/config_test.go new file mode 100644 index 0000000..61d1b2e --- /dev/null +++ b/config_test.go @@ -0,0 +1,54 @@ +package kong_test + +import ( + "encoding/json" + "io/ioutil" + "os" + "testing" + + "github.com/alecthomas/kong" + "github.com/stretchr/testify/require" +) + +func TestMultipleConfigLoading(t *testing.T) { + var cli struct { + Flag string `json:"flag,omitempty"` + } + + cli.Flag = "first" + first, cleanFirst := makeConfig(t, &cli) + defer cleanFirst() + + cli.Flag = "" + second, cleanSecond := makeConfig(t, &cli) + defer cleanSecond() + + p := mustNew(t, &cli, kong.Configuration(kong.JSON, first, second)) + _, err := p.Parse(nil) + require.NoError(t, err) + require.Equal(t, "first", cli.Flag) +} + +func TestConfigValidation(t *testing.T) { + var cli struct { + Flag string `json:"flag,omitempty" enum:"valid"` + } + + cli.Flag = "invalid" + conf, cleanConf := makeConfig(t, &cli) + defer cleanConf() + + p := mustNew(t, &cli, kong.Configuration(kong.JSON, conf)) + _, err := p.Parse(nil) + require.Error(t, err) +} + +func makeConfig(t *testing.T, config interface{}) (path string, cleanup func()) { + t.Helper() + w, err := ioutil.TempFile("", "") + require.NoError(t, err) + defer w.Close() + err = json.NewEncoder(w).Encode(config) + require.NoError(t, err) + return w.Name(), func() { os.Remove(w.Name()) } +} diff --git a/kong.go b/kong.go index 771b820..b4350cd 100644 --- a/kong.go +++ b/kong.go @@ -326,7 +326,6 @@ func (k *Kong) FatalIfErrorf(err error, args ...interface{}) { if err, ok := err.(*ParseError); ok && k.usageOnError { fmt.Fprintln(k.Stdout) options := k.helpOptions - options.Summary = true _ = k.help(options, err.Context) } k.Exit(1) diff --git a/kong_test.go b/kong_test.go index 0e0c064..36bb11c 100644 --- a/kong_test.go +++ b/kong_test.go @@ -707,3 +707,12 @@ func TestDefaultValueIsHyphen(t *testing.T) { require.NoError(t, err) require.Equal(t, "-", cli.Flag) } + +func TestDefaultEnumValidated(t *testing.T) { + var cli struct { + Flag string `default:"invalid" enum:"valid"` + } + p := mustNew(t, &cli) + _, err := p.Parse(nil) + require.Error(t, err) +} diff --git a/options_test.go b/options_test.go index 4612298..5e2da7b 100644 --- a/options_test.go +++ b/options_test.go @@ -1,9 +1,6 @@ package kong import ( - "encoding/json" - "io/ioutil" - "os" "reflect" "testing" @@ -21,35 +18,6 @@ func TestOptions(t *testing.T) { require.Nil(t, p.Exit) } -func TestConfigLoading(t *testing.T) { - first, err := ioutil.TempFile("", "") - require.NoError(t, err) - defer first.Close() - defer os.Remove(first.Name()) - second, err := ioutil.TempFile("", "") - require.NoError(t, err) - defer second.Close() - defer os.Remove(second.Name()) - - var cli struct { - Flag string `json:"flag,omitempty"` - } - - cli.Flag = "first" - err = json.NewEncoder(first).Encode(&cli) - require.NoError(t, err) - - cli.Flag = "" - err = json.NewEncoder(second).Encode(&cli) - require.NoError(t, err) - - p, err := New(&cli, Configuration(JSON, first.Name(), second.Name())) - require.NoError(t, err) - _, err = p.Parse(nil) - require.NoError(t, err) - require.Equal(t, "first", cli.Flag) -} - type impl string func (impl) Method() {} diff --git a/resolver_test.go b/resolver_test.go index c23c4f3..1a3f327 100644 --- a/resolver_test.go +++ b/resolver_test.go @@ -74,6 +74,24 @@ func TestEnvarsTag(t *testing.T) { require.Equal(t, []int{5, 2, 9}, cli.Slice) } +func TestEnvarsWithDefault(t *testing.T) { + var cli struct { + Flag string `env:"KONG_FLAG" default:"default"` + } + parser, restoreEnv := newEnvParser(t, &cli, envMap{}) + defer restoreEnv() + + _, err := parser.Parse(nil) + require.NoError(t, err) + require.Equal(t, "default", cli.Flag) + + parser, restoreEnv = newEnvParser(t, &cli, envMap{"KONG_FLAG": "moo"}) + defer restoreEnv() + _, err = parser.Parse(nil) + require.NoError(t, err) + require.Equal(t, "moo", cli.Flag) +} + func TestJSONBasic(t *testing.T) { var cli struct { String string