mirror of https://github.com/rancher/wrangler.git
225 lines
4.3 KiB
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)
|
|
})
|
|
}
|
|
}
|