2023-03-28 22:48:58 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
2023-08-11 13:12:13 +00:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
2023-03-28 22:48:58 +00:00
|
|
|
|
2019-04-29 22:08:09 +00:00
|
|
|
package lib
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestMapWalk(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
type tcase struct {
|
|
|
|
input interface{}
|
|
|
|
expected interface{}
|
|
|
|
unexpected bool
|
|
|
|
err bool
|
|
|
|
}
|
|
|
|
|
|
|
|
cases := map[string]tcase{
|
|
|
|
// basically tests that []uint8 gets turned into
|
|
|
|
// a string
|
2020-06-16 17:19:31 +00:00
|
|
|
"simple": {
|
2019-04-29 22:08:09 +00:00
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": []uint8("bar"),
|
|
|
|
},
|
|
|
|
expected: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// ensures that it was actually converted and not
|
|
|
|
// just the require.Equal masking the underlying
|
|
|
|
// type differences
|
2020-06-16 17:19:31 +00:00
|
|
|
"uint8 conversion": {
|
2019-04-29 22:08:09 +00:00
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": []uint8("bar"),
|
|
|
|
},
|
|
|
|
expected: map[string]interface{}{
|
|
|
|
"foo": []uint8("bar"),
|
|
|
|
},
|
|
|
|
unexpected: true,
|
|
|
|
},
|
2023-04-19 17:23:38 +00:00
|
|
|
// ensure we don't panic from trying to call reflect.Value.Type
|
|
|
|
// on a nil pointer
|
|
|
|
"nil pointer": {
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": nil,
|
|
|
|
},
|
|
|
|
expected: map[string]interface{}{
|
|
|
|
"foo": nil,
|
|
|
|
},
|
|
|
|
},
|
2019-05-02 18:43:54 +00:00
|
|
|
// ensure nested maps get processed correctly
|
2020-06-16 17:19:31 +00:00
|
|
|
"nested": {
|
2019-05-02 18:43:54 +00:00
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": map[interface{}]interface{}{
|
|
|
|
"bar": []uint8("baz"),
|
|
|
|
},
|
|
|
|
"bar": []uint8("baz"),
|
|
|
|
},
|
|
|
|
expected: map[string]interface{}{
|
|
|
|
"foo": map[string]interface{}{
|
|
|
|
"bar": "baz",
|
|
|
|
},
|
|
|
|
"bar": "baz",
|
|
|
|
},
|
|
|
|
},
|
2020-06-16 17:19:31 +00:00
|
|
|
"map with slice": {
|
2019-05-07 15:40:48 +00:00
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": []uint8("bar"),
|
|
|
|
"bar": []interface{}{
|
|
|
|
[]uint8("one"),
|
|
|
|
[]uint8("two"),
|
|
|
|
3,
|
|
|
|
4,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expected: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
"bar": []interface{}{
|
|
|
|
"one",
|
|
|
|
"two",
|
|
|
|
3,
|
|
|
|
4,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-04-29 22:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for name, tcase := range cases {
|
|
|
|
name := name
|
|
|
|
tcase := tcase
|
|
|
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
actual, err := MapWalk(tcase.input)
|
|
|
|
if tcase.err {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
if tcase.unexpected {
|
|
|
|
require.NotEqual(t, tcase.expected, actual)
|
|
|
|
} else {
|
|
|
|
require.Equal(t, tcase.expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|