You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/cmd/base/flags_test.go

152 lines
3.7 KiB

package base
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestFlagSet_StringSliceMapVar(t *testing.T) {
t.Parallel()
tests := []struct {
name string
setString string
wantErrContains string
wantTarget map[string][]string
}{
{
name: "key-value",
setString: "key=value",
wantTarget: map[string][]string{"key": {"value"}},
},
{
name: "many-values",
setString: "key=v1,v2,v3,v4,v5",
wantTarget: map[string][]string{"key": {"v1", "v2", "v3", "v4", "v5"}},
},
{
// this case passes here and errors at worker client
name: "duplicate-values",
setString: "k1=v1,v1",
wantTarget: map[string][]string{"k1": {"v1", "v1"}},
},
{
name: "no-deliminator",
setString: "key",
wantErrContains: "missing = in KV pair",
},
{
name: "multiple-keys",
setString: "k1=v1, k2=v2",
wantErrContains: "value \"k2=v2\" is invalid",
},
{
name: "too-many-commas",
setString: "k1=v1,,v3?,,,,,v8",
wantErrContains: "value \"\" is invalid",
},
{
name: "illegal-characters-key",
setString: "!@#$=%^&*()_",
wantErrContains: "key \"!@#$\" is invalid",
},
{
name: "illegal-characters-value",
setString: "k=%^&*()_",
wantErrContains: "value \"%^&*()_\" is invalid",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
target := make(map[string][]string, 1)
sliceMapVal := &stringSliceMapValue{
hidden: false,
target: &target,
}
err := sliceMapVal.Set(tt.setString)
if tt.wantErrContains != "" {
assert.Error(err)
assert.Contains(err.Error(), tt.wantErrContains)
return
}
require.NoError(err)
assert.Equal(tt.wantTarget, *sliceMapVal.target)
})
}
}
func TestFlagSet_StringSliceMapVar_NullCheck(t *testing.T) {
t.Parallel()
tests := []struct {
name string
setStrings []string
wantErrContains string
wantTarget map[string][]string
}{
{
name: "null",
setStrings: []string{"null"},
wantTarget: map[string][]string{"null": nil},
// this target is then converted to a nil value in workerscmd/func.go
},
{
name: "glass-half-null",
setStrings: []string{"milk=half", "null"},
wantErrContains: `"null" cannot be combined with other values`,
},
{
name: "invalid-entry-before",
setStrings: []string{"the-milk-is-bad", "null"},
wantErrContains: `missing = in KV pair: "the-milk-is-bad"`,
},
{
name: "invalid-entry-after",
setStrings: []string{"null", "the-milk-is-still-bad"},
wantErrContains: `"null" cannot be combined with other values`,
},
{
name: "no-error",
setStrings: []string{"k1=v1,v2,v3", "k2=v4,v5,v6"},
wantTarget: map[string][]string{"k1": {"v1", "v2", "v3"}, "k2": {"v4", "v5", "v6"}},
},
{
name: "too-null",
setStrings: []string{"null", "null", "null"},
wantErrContains: `"null" cannot be combined with other values`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
target := make(map[string][]string, 1)
sliceMapVal := &stringSliceMapValue{
hidden: false,
target: &target,
nullCheck: func() bool { return true },
}
var err error
for _, s := range tt.setStrings {
err = sliceMapVal.Set(s)
if err != nil {
break
}
}
if tt.wantErrContains != "" {
assert.Error(err)
assert.Contains(err.Error(), tt.wantErrContains)
return
}
require.NoError(err)
assert.Equal(tt.wantTarget, *sliceMapVal.target)
})
}
}