251 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
package maputil
 | 
						|
 | 
						|
import (
 | 
						|
	"reflect"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func TestMapUtil_StrKeys(t *testing.T) {
 | 
						|
	m := map[string]any{
 | 
						|
		"a": []any{
 | 
						|
			map[string]any{
 | 
						|
				"b": []any{
 | 
						|
					map[string]any{
 | 
						|
						"c": "C",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	r, err := CastKeysToStrings(m)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("unexpected error: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	a := r["a"].([]any)
 | 
						|
	a0 := a[0].(map[string]any)
 | 
						|
	b := a0["b"].([]any)
 | 
						|
	b0 := b[0].(map[string]any)
 | 
						|
	c := b0["c"]
 | 
						|
 | 
						|
	if c != "C" {
 | 
						|
		t.Errorf("unexpected c: expected=C, got=%s", c)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_IFKeys(t *testing.T) {
 | 
						|
	m := map[any]any{
 | 
						|
		"a": []any{
 | 
						|
			map[any]any{
 | 
						|
				"b": []any{
 | 
						|
					map[any]any{
 | 
						|
						"c": "C",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	r, err := CastKeysToStrings(m)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("unexpected error: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	a := r["a"].([]any)
 | 
						|
	a0 := a[0].(map[string]any)
 | 
						|
	b := a0["b"].([]any)
 | 
						|
	b0 := b[0].(map[string]any)
 | 
						|
	c := b0["c"]
 | 
						|
 | 
						|
	if c != "C" {
 | 
						|
		t.Errorf("unexpected c: expected=C, got=%s", c)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_KeyArg(t *testing.T) {
 | 
						|
	m := map[string]any{}
 | 
						|
 | 
						|
	key := []string{"a", "b", "c"}
 | 
						|
 | 
						|
	Set(m, key, "C", false)
 | 
						|
 | 
						|
	c := (((m["a"].(map[string]any))["b"]).(map[string]any))["c"]
 | 
						|
 | 
						|
	if c != "C" {
 | 
						|
		t.Errorf("unexpected c: expected=C, got=%s", c)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_IndexedKeyArg(t *testing.T) {
 | 
						|
	m := map[string]any{}
 | 
						|
 | 
						|
	key := []string{"a", "b[0]", "c"}
 | 
						|
 | 
						|
	Set(m, key, "C", false)
 | 
						|
 | 
						|
	c := (((m["a"].(map[string]any))["b"].([]any))[0].(map[string]any))["c"]
 | 
						|
 | 
						|
	if c != "C" {
 | 
						|
		t.Errorf("unexpected c: expected=C, got=%s", c)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_IndexedKeyArg2(t *testing.T) {
 | 
						|
	cases := []struct {
 | 
						|
		name           string
 | 
						|
		stateValuesSet []string
 | 
						|
		want           map[string]any
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			name:           "IndexedKeyArg",
 | 
						|
			stateValuesSet: []string{"myvalues[0]=HELLO,myvalues[1]=HELMFILE"},
 | 
						|
			want:           map[string]any{"myvalues": []any{"HELLO", "HELMFILE"}},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:           "two state value",
 | 
						|
			stateValuesSet: []string{"myvalues[0]=HELLO,myvalues[1]=HELMFILE", "myvalues[2]=HELLO"},
 | 
						|
			want:           map[string]any{"myvalues": []any{"HELLO", "HELMFILE", "HELLO"}},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:           "different key",
 | 
						|
			stateValuesSet: []string{"myvalues[0]=HELLO,key2[0]=HELMFILE", "myvalues[1]=HELLO2"},
 | 
						|
			want:           map[string]any{"myvalues": []any{"HELLO", "HELLO2"}, "key2": []any{"HELMFILE"}},
 | 
						|
		},
 | 
						|
	}
 | 
						|
	for _, c := range cases {
 | 
						|
		t.Run(c.name, func(t *testing.T) {
 | 
						|
			set := map[string]any{}
 | 
						|
			for i := range c.stateValuesSet {
 | 
						|
				ops := strings.Split(c.stateValuesSet[i], ",")
 | 
						|
				for j := range ops {
 | 
						|
					op := strings.SplitN(ops[j], "=", 2)
 | 
						|
					k := ParseKey(op[0])
 | 
						|
					v := op[1]
 | 
						|
 | 
						|
					Set(set, k, v, false)
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if !reflect.DeepEqual(set, c.want) {
 | 
						|
				t.Errorf("expected set %v, got %v", c.want, set)
 | 
						|
			}
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type parseKeyTc struct {
 | 
						|
	key    string
 | 
						|
	result map[int]string
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_ParseKey(t *testing.T) {
 | 
						|
	tcs := []parseKeyTc{
 | 
						|
		{
 | 
						|
			key: `a.b.c`,
 | 
						|
			result: map[int]string{
 | 
						|
				0: "a",
 | 
						|
				1: "b",
 | 
						|
				2: "c",
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			key: `a\.b.c`,
 | 
						|
			result: map[int]string{
 | 
						|
				0: "a.b",
 | 
						|
				1: "c",
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			key: `a\.b\.c`,
 | 
						|
			result: map[int]string{
 | 
						|
				0: "a.b.c",
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range tcs {
 | 
						|
		parts := ParseKey(tc.key)
 | 
						|
 | 
						|
		for index, value := range tc.result {
 | 
						|
			if parts[index] != value {
 | 
						|
				t.Errorf("unexpected key part[%d]: expected=%s, got=%s", index, value, parts[index])
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_typedVal(t *testing.T) {
 | 
						|
	typedValueTest(t, "true", true)
 | 
						|
	typedValueTest(t, "null", nil)
 | 
						|
	typedValueTest(t, "0", int64(0))
 | 
						|
	typedValueTest(t, "5", int64(5))
 | 
						|
	typedValueTest(t, "05", "05")
 | 
						|
}
 | 
						|
 | 
						|
func typedValueTest(t *testing.T, input string, expectedWhenNoStr any) {
 | 
						|
	returnValue := typedVal(input, true)
 | 
						|
	if returnValue != input {
 | 
						|
		t.Errorf("unexpected typed value: expected=%s, got=%s", input, returnValue)
 | 
						|
	}
 | 
						|
	returnValue = typedVal(input, false)
 | 
						|
	if returnValue != expectedWhenNoStr {
 | 
						|
		t.Errorf("unexpected typed value: expected=%s, got=%s", input, returnValue)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMapUtil_MergeMaps(t *testing.T) {
 | 
						|
	map1 := map[string]interface{}{
 | 
						|
		"debug": true,
 | 
						|
	}
 | 
						|
	map2 := map[string]interface{}{
 | 
						|
		"logLevel":     "info",
 | 
						|
		"replicaCount": 3,
 | 
						|
	}
 | 
						|
	map3 := map[string]interface{}{
 | 
						|
		"logLevel": "info",
 | 
						|
		"replicaCount": map[string]any{
 | 
						|
			"app1":    3,
 | 
						|
			"awesome": 4,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	map4 := map[string]interface{}{
 | 
						|
		"logLevel": "info",
 | 
						|
		"replicaCount": map[string]any{
 | 
						|
			"app1": 3,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	testMap := MergeMaps(map2, map4)
 | 
						|
	equal := reflect.DeepEqual(testMap, map4)
 | 
						|
	if !equal {
 | 
						|
		t.Errorf("Expected a nested map to overwrite a flat value. Expected: %v, got %v", map4, testMap)
 | 
						|
	}
 | 
						|
 | 
						|
	testMap = MergeMaps(map4, map2)
 | 
						|
	equal = reflect.DeepEqual(testMap, map2)
 | 
						|
	if !equal {
 | 
						|
		t.Errorf("Expected a flat value to overwrite a map. Expected: %v, got %v", map2, testMap)
 | 
						|
	}
 | 
						|
 | 
						|
	testMap = MergeMaps(map4, map3)
 | 
						|
	equal = reflect.DeepEqual(testMap, map3)
 | 
						|
	if !equal {
 | 
						|
		t.Errorf("Expected a nested map to overwrite another nested map. Expected: %v, got %v", map3, testMap)
 | 
						|
	}
 | 
						|
 | 
						|
	testMap = MergeMaps(map1, map3)
 | 
						|
	expectedMap := map[string]interface{}{
 | 
						|
		"debug":    true,
 | 
						|
		"logLevel": "info",
 | 
						|
		"replicaCount": map[string]any{
 | 
						|
			"app1":    3,
 | 
						|
			"awesome": 4,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	equal = reflect.DeepEqual(testMap, expectedMap)
 | 
						|
	if !equal {
 | 
						|
		t.Errorf("Expected a map with different keys to merge properly with another map. Expected: %v, got %v", expectedMap, testMap)
 | 
						|
	}
 | 
						|
}
 |