change: use data driven test

This commit is contained in:
debugtalk
2021-09-29 12:49:54 +08:00
parent d04642eace
commit d37b801477
2 changed files with 76 additions and 109 deletions

View File

@@ -70,7 +70,7 @@ func parseString(raw string, variablesMapping map[string]interface{}) interface{
remainedString = remainedString[startPosition:] remainedString = remainedString[startPosition:]
// search variable like ${var} or $var // search variable like ${var} or $var
varMatched := regexCompileVariable.FindStringSubmatch(raw[matchStartPosition:]) varMatched := regexCompileVariable.FindStringSubmatch(remainedString)
if len(varMatched) == 3 { if len(varMatched) == 3 {
var varName string var varName string
if varMatched[1] != "" { if varMatched[1] != "" {

View File

@@ -42,115 +42,82 @@ func TestParseDataStringWithVariables(t *testing.T) {
"_v": 6.9, // variable name starts with underscore "_v": 6.9, // variable name starts with underscore
} }
// no variable testData := []struct {
if !assert.Equal(t, "var_1", parseData("var_1", variablesMapping)) { expr string
t.Fail() expect interface{}
} }{
if !assert.Equal(t, "$", parseData("$", variablesMapping)) { // no variable
t.Fail() {"var_1", "var_1"},
} {"$", "$"},
if !assert.Equal(t, "var_1$", parseData("var_1$", variablesMapping)) { {"var_1$", "var_1$"},
t.Fail() {"var_1$123", "var_1$123"}, // variable should starts with a letter
} // single variable
if !assert.Equal(t, "var_1$123", parseData("var_1$123", variablesMapping)) { // variable should starts with a letter {"$var_1", "abc"},
t.Fail() {"${var_1}", "abc"},
{"$var_3", 123},
{"$var_4", map[string]interface{}{"a": 1}},
{"${var_4}", map[string]interface{}{"a": 1}},
{"$var_5", true},
{"$var_6", nil},
{"$v", 4.5},
{"var_1$_v", "var_16.9"},
// single variable with prefix or suffix
{"$var_1#XYZ", "abc#XYZ"},
{"${var_1}#XYZ", "abc#XYZ"},
{"ABC$var_1", "ABCabc"},
{"ABC${var_1}", "ABCabc"},
{"ABC$var_1/", "ABCabc/"},
{"ABC${v}/", "ABC4.5/"},
// multiple variables
{"/$var_1/$var_2/var3", "/abc/def/var3"},
{"/${var_1}/$var_2/var3", "/abc/def/var3"},
{"ABC$var_1$var_3", "ABCabc123"},
{"ABC$var_1${var_3}", "ABCabc123"},
{"ABC$var_1/$var_3", "ABCabc/123"},
{"ABC${var_1}/${var_3}", "ABCabc/123"},
{"ABC$var_1/123$var_1/456", "ABCabc/123abc/456"},
{"ABC$var_1/123${var_1}/456", "ABCabc/123abc/456"},
{"ABC$var_1/$var_2/$var_1", "ABCabc/def/abc"},
{"ABC$var_1/$var_2/${var_1}", "ABCabc/def/abc"},
{"func1($var_1, $var_3)", "func1(abc, 123)"},
{"func1($var_1, ${var_3})", "func1(abc, 123)"},
// TODO: fix compatibility with python version
{"abc$var_4", "abcmap[a:1]"}, // "abc{'a': 1}"
{"abc$var_5", "abctrue"}, // "abcTrue"
{"/api/$SECRET_KEY", "/api/<nil>"}, // raise error
} }
// single variable for _, data := range testData {
if !assert.Equal(t, "abc", parseData("$var_1", variablesMapping)) { if !assert.Equal(t, data.expect, parseData(data.expr, variablesMapping)) {
t.Fail() t.Fail()
} }
if !assert.Equal(t, "abc", parseData("${var_1}", variablesMapping)) { }
t.Fail() }
} func TestParseDataStringWithVariablesAbnormal(t *testing.T) {
if !assert.Equal(t, 123, parseData("$var_3", variablesMapping)) { variablesMapping := map[string]interface{}{
t.Fail() "var_1": "abc",
} "var_2": "def",
if !assert.Equal(t, map[string]interface{}{"a": 1}, parseData("$var_4", variablesMapping)) { "var_3": 123,
t.Fail() "var_4": map[string]interface{}{"a": 1},
} "var_5": true,
if !assert.Equal(t, map[string]interface{}{"a": 1}, parseData("${var_4}", variablesMapping)) { "var_6": nil,
t.Fail() "v": 4.5, // variable name with one character
} "_v": 6.9, // variable name starts with underscore
if !assert.Equal(t, true, parseData("$var_5", variablesMapping)) { }
t.Fail()
} testData := []struct {
if !assert.Equal(t, nil, parseData("$var_6", variablesMapping)) { expr string
t.Fail() expect interface{}
} }{
if !assert.Equal(t, 4.5, parseData("$v", variablesMapping)) { {"ABC$var_1{", "ABCabc{"},
t.Fail() {"{ABC$var_1{}a}", "{ABCabc{}a}"},
} {"AB{C$var_1{}a}", "AB{Cabc{}a}"},
if !assert.Equal(t, "var_16.9", parseData("var_1$_v", variablesMapping)) { {"ABC$var_1}", "ABCabc}"},
t.Fail() }
}
for _, data := range testData {
// single variable with prefix or suffix if !assert.Equal(t, data.expect, parseData(data.expr, variablesMapping)) {
if !assert.Equal(t, "abc#XYZ", parseData("$var_1#XYZ", variablesMapping)) { t.Fail()
t.Fail() }
}
if !assert.Equal(t, "abc#XYZ", parseData("${var_1}#XYZ", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc", parseData("ABC$var_1", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc", parseData("ABC${var_1}", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/", parseData("ABC$var_1/", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABC4.5/", parseData("ABC${v}/", variablesMapping)) {
t.Fail()
}
// multiple variables
if !assert.Equal(t, "/abc/def/var3", parseData("/$var_1/$var_2/var3", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "/abc/def/var3", parseData("/${var_1}/$var_2/var3", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc123", parseData("ABC$var_1$var_3", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc123", parseData("ABC$var_1${var_3}", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/123", parseData("ABC$var_1/$var_3", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/123", parseData("ABC${var_1}/${var_3}", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/123abc/456", parseData("ABC$var_1/123$var_1/456", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/123abc/456", parseData("ABC$var_1/123${var_1}/456", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/def/abc", parseData("ABC$var_1/$var_2/$var_1", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "ABCabc/def/abc", parseData("ABC$var_1/$var_2/${var_1}", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "func1(abc, 123)", parseData("func1($var_1, $var_3)", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "func1(abc, 123)", parseData("func1($var_1, ${var_3})", variablesMapping)) {
t.Fail()
}
// TODO: fix compatibility with python version, "abc{'a': 1}"
if !assert.Equal(t, "abcmap[a:1]", parseData("abc$var_4", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "abctrue", parseData("abc$var_5", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, "/api/<nil>", parseData("/api/$SECRET_KEY", variablesMapping)) {
t.Fail()
} }
} }