1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// nolint: govet
package konghcl
import (
"io/ioutil"
"os"
"strings"
"testing"
"github.com/alecthomas/kong"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
const testConfig = `
flag-name = "hello world"
int-flag = 10
float-flag = 10.5
slice-flag = [1, 2, 3]
prefix {
prefixed-flag = "prefixed flag"
}
map-flag = {
key = "value"
}
// Multiple keys are merged.
mapped = {
left = "left"
}
mapped = {
right = "right"
}
prefix-block {
embedded-flag = "yes"
}
`
type mapperValue struct {
Left string
Right string
}
func (m *mapperValue) Decode(ctx *kong.DecodeContext) error {
return DecodeValue(ctx, m)
}
func TestHCL(t *testing.T) {
type Embedded struct {
EmbeddedFlagTwo string
EmbeddedFlag string
}
type CLI struct {
FlagName string
IntFlag int
FloatFlag float64
SliceFlag []int
GroupedFlag string `group:"group"`
PrefixedFlag string `prefix:"prefix-"`
Embedded `group:"group"`
PrefixedBlock Embedded `embed:"" prefix:"prefix-block-"`
MapFlag map[string]string
Mapped mapperValue
}
t.Run("FromResolver", func(t *testing.T) {
var cli CLI
r := strings.NewReader(testConfig)
resolver, err := Loader(r)
require.NoError(t, err)
parser, err := kong.New(&cli, kong.Resolvers(resolver))
require.NoError(t, err)
_, err = parser.Parse(nil)
require.NoError(t, err)
assert.Equal(t, "hello world", cli.FlagName)
assert.Equal(t, "prefixed flag", cli.PrefixedFlag)
assert.Equal(t, 10, cli.IntFlag)
assert.Equal(t, 10.5, cli.FloatFlag)
assert.Equal(t, []int{1, 2, 3}, cli.SliceFlag)
assert.Equal(t, map[string]string{"key": "value"}, cli.MapFlag)
assert.Equal(t, mapperValue{Left: "left", Right: "right"}, cli.Mapped)
assert.Equal(t, Embedded{EmbeddedFlag: "yes"}, cli.PrefixedBlock)
})
t.Run("FragmentFromFlag", func(t *testing.T) {
var cli CLI
parser, err := kong.New(&cli)
require.NoError(t, err)
_, err = parser.Parse([]string{"--mapped", `
left = "LEFT"
right = "RIGHT"
`})
require.NoError(t, err)
require.Equal(t, mapperValue{Left: "LEFT", Right: "RIGHT"}, cli.Mapped)
})
t.Run("FragmentFromFile", func(t *testing.T) {
w, err := ioutil.TempFile("", "kong-hcl-")
require.NoError(t, err)
_, err = w.Write([]byte(`
left = "LEFT"
right = "RIGHT"
`))
require.NoError(t, err)
_ = w.Close()
defer os.Remove(w.Name())
var cli CLI
parser, err := kong.New(&cli)
require.NoError(t, err)
_, err = parser.Parse([]string{"--mapped", w.Name()})
require.NoError(t, err)
require.Equal(t, mapperValue{Left: "LEFT", Right: "RIGHT"}, cli.Mapped)
})
}
func TestHCLValidation(t *testing.T) {
type command struct {
CommandFlag string
}
var cli struct {
Command command `cmd:""`
Flag string
}
resolver, err := Loader(strings.NewReader(`
invalid-flag = true
`))
require.NoError(t, err)
parser, err := kong.New(&cli, kong.Resolvers(resolver))
require.NoError(t, err)
_, err = parser.Parse([]string{"command"})
require.EqualError(t, err, "unknown configuration key \"invalid-flag\"")
}
|