feat(config): support Resolver for config variable placeholders (#1135)
* test: add yaml test case for reader test: init test case for fillTemplate * add env placeholder resolver fix ci test fail * fix ci test fail * feat(config): add config resolver * test(config): add test cases * move defaultDecoder & defaultResolver to options.gopull/1185/head
parent
3089419e14
commit
e19730e4b6
@ -0,0 +1,141 @@ |
|||||||
|
package config |
||||||
|
|
||||||
|
import ( |
||||||
|
"reflect" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
) |
||||||
|
|
||||||
|
func TestDefaultResolver(t *testing.T) { |
||||||
|
var ( |
||||||
|
portString = "8080" |
||||||
|
countInt = 10 |
||||||
|
enableBool = true |
||||||
|
rateFloat = 0.9 |
||||||
|
) |
||||||
|
|
||||||
|
data := map[string]interface{}{ |
||||||
|
"foo": map[string]interface{}{ |
||||||
|
"bar": map[string]interface{}{ |
||||||
|
"notexist": "${NOTEXIST:100}", |
||||||
|
"port": "${PORT:8081}", |
||||||
|
"count": "${COUNT:0}", |
||||||
|
"enable": "${ENABLE:false}", |
||||||
|
"rate": "${RATE}", |
||||||
|
"empty": "${EMPTY:foobar}", |
||||||
|
"array": []interface{}{"${PORT}", "${NOTEXIST:8081}"}, |
||||||
|
"value1": "${test.value}", |
||||||
|
"value2": "$PORT", |
||||||
|
"value3": "$PORT:default", |
||||||
|
}, |
||||||
|
}, |
||||||
|
"test": map[string]interface{}{ |
||||||
|
"value": "foobar", |
||||||
|
}, |
||||||
|
"PORT": "8080", |
||||||
|
"COUNT": "10", |
||||||
|
"ENABLE": "true", |
||||||
|
"RATE": "0.9", |
||||||
|
"EMPTY": "", |
||||||
|
} |
||||||
|
|
||||||
|
tests := []struct { |
||||||
|
name string |
||||||
|
path string |
||||||
|
expect interface{} |
||||||
|
}{ |
||||||
|
{ |
||||||
|
name: "test not exist int env with default", |
||||||
|
path: "foo.bar.notexist", |
||||||
|
expect: 100, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test string with default", |
||||||
|
path: "foo.bar.port", |
||||||
|
expect: portString, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test int with default", |
||||||
|
path: "foo.bar.count", |
||||||
|
expect: countInt, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test bool with default", |
||||||
|
path: "foo.bar.enable", |
||||||
|
expect: enableBool, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test float without default", |
||||||
|
path: "foo.bar.rate", |
||||||
|
expect: rateFloat, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test empty value with default", |
||||||
|
path: "foo.bar.empty", |
||||||
|
expect: "", |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test array", |
||||||
|
path: "foo.bar.array", |
||||||
|
expect: []interface{}{portString, "8081"}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test ${test.value}", |
||||||
|
path: "foo.bar.value1", |
||||||
|
expect: "foobar", |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test $value", |
||||||
|
path: "foo.bar.value2", |
||||||
|
expect: portString, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "test $value:default", |
||||||
|
path: "foo.bar.value3", |
||||||
|
expect: portString + ":default", |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
for _, test := range tests { |
||||||
|
t.Run(test.name, func(t *testing.T) { |
||||||
|
err := defaultResolver(data) |
||||||
|
assert.NoError(t, err) |
||||||
|
rd := reader{ |
||||||
|
values: data, |
||||||
|
} |
||||||
|
if v, ok := rd.Value(test.path); ok { |
||||||
|
var actual interface{} |
||||||
|
switch test.expect.(type) { |
||||||
|
case int: |
||||||
|
if actual, err = v.Int(); err == nil { |
||||||
|
assert.Equal(t, test.expect, int(actual.(int64)), "int value should be equal") |
||||||
|
} |
||||||
|
case string: |
||||||
|
if actual, err = v.String(); err == nil { |
||||||
|
assert.Equal(t, test.expect, actual, "string value should be equal") |
||||||
|
} |
||||||
|
case bool: |
||||||
|
if actual, err = v.Bool(); err == nil { |
||||||
|
assert.Equal(t, test.expect, actual, "bool value should be equal") |
||||||
|
} |
||||||
|
case float64: |
||||||
|
if actual, err = v.Float(); err == nil { |
||||||
|
assert.Equal(t, test.expect, actual, "float64 value should be equal") |
||||||
|
} |
||||||
|
default: |
||||||
|
actual = v.Load() |
||||||
|
if !reflect.DeepEqual(test.expect, actual) { |
||||||
|
t.Logf("expect: %#v, actural: %#v", test.expect, actual) |
||||||
|
t.Fail() |
||||||
|
} |
||||||
|
} |
||||||
|
if err != nil { |
||||||
|
t.Error(err) |
||||||
|
} |
||||||
|
} else { |
||||||
|
t.Error("value path not found") |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue