mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-06 15:01:22 +08:00
fix: parse variables
This commit is contained in:
40
parser.go
40
parser.go
@@ -47,13 +47,24 @@ var (
|
|||||||
|
|
||||||
// parseString parse string with variables
|
// parseString parse string with variables
|
||||||
func parseString(raw string, variablesMapping map[string]interface{}) interface{} {
|
func parseString(raw string, variablesMapping map[string]interface{}) interface{} {
|
||||||
matchStartPosition := strings.Index(raw, "$")
|
matchStartPosition := 0
|
||||||
if matchStartPosition == -1 { // no $ found
|
parsedString := ""
|
||||||
return raw
|
remainedString := raw
|
||||||
}
|
|
||||||
parsedString := raw[0:matchStartPosition]
|
|
||||||
|
|
||||||
for matchStartPosition < len(raw) {
|
for matchStartPosition < len(raw) {
|
||||||
|
// locate $ char position
|
||||||
|
startPosition := strings.Index(remainedString, "$")
|
||||||
|
if startPosition == -1 { // no $ found
|
||||||
|
// append remained string
|
||||||
|
parsedString += remainedString
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// found $, check if variable or function
|
||||||
|
matchStartPosition += startPosition
|
||||||
|
parsedString += remainedString[0:startPosition]
|
||||||
|
remainedString = remainedString[startPosition:]
|
||||||
|
|
||||||
// search variable like ${var} or $var
|
// search variable like ${var} or $var
|
||||||
varMatched := regexCompileVariable.FindStringSubmatch(raw[matchStartPosition:])
|
varMatched := regexCompileVariable.FindStringSubmatch(raw[matchStartPosition:])
|
||||||
if len(varMatched) == 3 {
|
if len(varMatched) == 3 {
|
||||||
@@ -70,27 +81,12 @@ func parseString(raw string, variablesMapping map[string]interface{}) interface{
|
|||||||
return varValue
|
return varValue
|
||||||
}
|
}
|
||||||
|
|
||||||
parsedString += fmt.Sprintf("%v", varValue)
|
|
||||||
matchStartPosition += len(varMatched[0])
|
matchStartPosition += len(varMatched[0])
|
||||||
|
parsedString += fmt.Sprintf("%v", varValue)
|
||||||
|
remainedString = raw[matchStartPosition:]
|
||||||
log.Printf("[parseString] parsedString: %v, matchStartPosition: %v", parsedString, matchStartPosition)
|
log.Printf("[parseString] parsedString: %v, matchStartPosition: %v", parsedString, matchStartPosition)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPosition := matchStartPosition
|
|
||||||
var remainedString string
|
|
||||||
// find next $ location
|
|
||||||
nextStartPosition := strings.Index(raw[currentPosition+1:], "$")
|
|
||||||
if nextStartPosition == -1 { // no $ found
|
|
||||||
remainedString = raw[currentPosition:]
|
|
||||||
// break loop
|
|
||||||
matchStartPosition = len(raw)
|
|
||||||
} else { // found next $
|
|
||||||
matchStartPosition = nextStartPosition
|
|
||||||
remainedString = raw[currentPosition:nextStartPosition]
|
|
||||||
}
|
|
||||||
|
|
||||||
// append remained string
|
|
||||||
parsedString += remainedString
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parsedString
|
return parsedString
|
||||||
|
|||||||
@@ -55,4 +55,31 @@ func TestParseDataStringWithVariables(t *testing.T) {
|
|||||||
if !assert.Equal(t, "abc#XYZ", parseData("${var_1}#XYZ", variablesMapping)) {
|
if !assert.Equal(t, "abc#XYZ", parseData("${var_1}#XYZ", variablesMapping)) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
|
if !assert.Equal(t, "/abc/def/var3", parseData("/$var_1/$var_2/var3", variablesMapping)) {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
if !assert.Equal(t, 123, parseData("$var_3", variablesMapping)) {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
if !assert.Equal(t, map[string]interface{}{"a": 1}, parseData("$var_4", variablesMapping)) {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
if !assert.Equal(t, true, parseData("$var_5", variablesMapping)) {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
if !assert.Equal(t, nil, parseData("$var_6", 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()
|
||||||
|
}
|
||||||
|
// TODO: fix compatibility with python version, "abcTrue"
|
||||||
|
if !assert.Equal(t, "abctrue", parseData("abc$var_5", variablesMapping)) {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
// TODO: fix compatibility with python version, raise exception
|
||||||
|
if !assert.Equal(t, "/api/<nil>", parseData("/api/$SECRET_KEY", variablesMapping)) {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user