wrangler/pkg/data/values_test.go

225 lines
4.3 KiB
Go

package data
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestGetValueFromAny(t *testing.T) {
t.Parallel()
tests := []struct {
name string
data interface{}
keys []string
wantValue interface{}
wantSuccess bool
}{
{
name: "nil map",
data: nil,
keys: []string{"somekey"},
wantValue: nil,
wantSuccess: false,
},
{
name: "key is not in map",
data: map[string]interface{}{
"realKey": "realVal",
},
keys: []string{"badKey"},
wantValue: nil,
wantSuccess: false,
},
{
name: "key is in first level of map",
data: map[string]interface{}{
"realKey": "realVal",
},
keys: []string{"realKey"},
wantValue: "realVal",
wantSuccess: true,
},
{
name: "key is nested in map",
data: map[string]interface{}{
"parent": map[string]interface{}{
"child": map[string]interface{}{
"grandchild": "someValue",
},
},
},
keys: []string{"parent", "child", "grandchild"},
wantValue: "someValue",
wantSuccess: true,
},
{
name: "incorrected nested key",
data: map[string]interface{}{
"parent": map[string]interface{}{
"child": map[string]interface{}{
"grandchild": "someValue",
},
},
},
keys: []string{"parent", "grandchild", "child"},
wantValue: nil,
wantSuccess: false,
},
{
name: "get index of slice",
data: map[string]interface{}{
"parent": map[string]interface{}{
"children": []interface{}{
"alice",
"bob",
"eve",
},
},
},
keys: []string{"parent", "children", "2"},
wantValue: "eve",
wantSuccess: true,
},
{
name: "get index of top level slice",
data: []interface{}{
"alice",
"bob",
"eve",
},
keys: []string{"2"},
wantValue: "eve",
wantSuccess: true,
},
{
name: "slice of maps",
data: []interface{}{
map[string]interface{}{
"notthisone": "val",
},
map[string]interface{}{
"parent": map[string]interface{}{
"children": []interface{}{
"alice",
"bob",
"eve",
},
},
},
},
keys: []string{"1", "parent", "children", "0"},
wantValue: "alice",
wantSuccess: true,
},
{
name: "index is too big",
data: map[string]interface{}{
"parent": map[string]interface{}{
"children": []interface{}{
"alice",
"bob",
"eve",
},
},
},
keys: []string{"parent", "children", "3"},
wantValue: nil,
wantSuccess: false,
},
{
name: "index is negative",
data: map[string]interface{}{
"parent": map[string]interface{}{
"children": []interface{}{
"alice",
"bob",
"eve",
},
},
},
keys: []string{"parent", "children", "-3"},
wantValue: nil,
wantSuccess: false,
},
{
name: "index not parseable to int",
data: map[string]interface{}{
"parent": map[string]interface{}{
"children": []interface{}{
"alice",
"bob",
"eve",
},
},
},
keys: []string{"parent", "children", "notanint"},
wantValue: nil,
wantSuccess: false,
},
{
name: "slice blank index",
data: []interface{}{
"bob",
},
keys: []string{""},
wantValue: nil,
wantSuccess: false,
},
{
name: "slice no index",
data: []interface{}{
"bob",
},
wantValue: nil,
wantSuccess: false,
},
{
name: "keys nested too far",
data: []interface{}{
"alice",
"bob",
"eve",
},
keys: []string{"2", "1"},
wantValue: nil,
wantSuccess: false,
},
{
name: "map blank key with value",
data: map[string]interface{}{
"": "bob",
},
keys: []string{""},
wantValue: "bob",
wantSuccess: true,
},
{
name: "map blank key no value",
data: map[string]interface{}{
"alice": "bob",
},
keys: []string{""},
wantValue: nil,
wantSuccess: false,
},
{
name: "map no key",
data: map[string]interface{}{
"": "bob",
},
wantValue: nil,
wantSuccess: false,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
t.Parallel()
gotValue, gotSuccess := GetValueFromAny(test.data, test.keys...)
assert.Equal(t, test.wantValue, gotValue)
assert.Equal(t, test.wantSuccess, gotSuccess)
})
}
}