relocate substitute_variables_with_mapping to parse_data

This commit is contained in:
httprunner
2018-08-05 22:38:01 +08:00
parent 6890a1fc94
commit 4b8537352b
5 changed files with 87 additions and 88 deletions
+2 -2
View File
@@ -5,7 +5,7 @@ import json
import os import os
import yaml import yaml
from httprunner import exceptions, logger, parser, utils, validator from httprunner import exceptions, logger, parser, validator
from httprunner.compat import OrderedDict from httprunner.compat import OrderedDict
############################################################################### ###############################################################################
@@ -331,7 +331,7 @@ def _get_block_by_name(ref_call, ref_type):
args_mapping[item] = call_args[index] args_mapping[item] = call_args[index]
if args_mapping: if args_mapping:
block = utils.substitute_variables_with_mapping(block, args_mapping) block = parser.parse_data(block, args_mapping)
return block return block
+57
View File
@@ -136,6 +136,63 @@ def parse_validator(validator):
} }
def parse_data(content, mapping):
""" substitute variables in content with mapping
e.g.
@params
content = {
'request': {
'url': '/api/users/$uid',
'headers': {'token': '$token'}
}
}
mapping = {"$uid": 1000}
@return
{
'request': {
'url': '/api/users/1000',
'headers': {'token': '$token'}
}
}
"""
# TODO: refactor type check
if isinstance(content, bool):
return content
if isinstance(content, (numeric_types, type)):
return content
if not content:
return content
if isinstance(content, (list, set, tuple)):
return [
parse_data(item, mapping)
for item in content
]
if isinstance(content, dict):
substituted_data = {}
for key, value in content.items():
eval_key = parse_data(key, mapping)
eval_value = parse_data(value, mapping)
substituted_data[eval_key] = eval_value
return substituted_data
# content is in string format here
for var, value in mapping.items():
if content == var:
# content is a variable
content = value
else:
if not isinstance(value, str):
value = builtin_str(value)
content = content.replace(var, value)
return content
def parse_parameters(parameters, testset_path=None): def parse_parameters(parameters, testset_path=None):
""" parse parameters and generate cartesian product """ parse parameters and generate cartesian product
@params @params
+1 -59
View File
@@ -15,8 +15,7 @@ import types
from datetime import datetime from datetime import datetime
from httprunner import exceptions, logger from httprunner import exceptions, logger
from httprunner.compat import (OrderedDict, basestring, builtin_str, is_py2, from httprunner.compat import OrderedDict, basestring, is_py2, is_py3
is_py3, numeric_types, str)
from requests.structures import CaseInsensitiveDict from requests.structures import CaseInsensitiveDict
SECRET_KEY = "DebugTalk" SECRET_KEY = "DebugTalk"
@@ -87,63 +86,6 @@ def query_json(json_content, query, delimiter='.'):
return json_content return json_content
def substitute_variables_with_mapping(content, mapping):
""" substitute variables in content with mapping
e.g.
@params
content = {
'request': {
'url': '/api/users/$uid',
'headers': {'token': '$token'}
}
}
mapping = {"$uid": 1000}
@return
{
'request': {
'url': '/api/users/1000',
'headers': {'token': '$token'}
}
}
"""
# TODO: refactor type check
if isinstance(content, bool):
return content
if isinstance(content, (numeric_types, type)):
return content
if not content:
return content
if isinstance(content, (list, set, tuple)):
return [
substitute_variables_with_mapping(item, mapping)
for item in content
]
if isinstance(content, dict):
substituted_data = {}
for key, value in content.items():
eval_key = substitute_variables_with_mapping(key, mapping)
eval_value = substitute_variables_with_mapping(value, mapping)
substituted_data[eval_key] = eval_value
return substituted_data
# content is in string format here
for var, value in mapping.items():
if content == var:
# content is a variable
content = value
else:
if not isinstance(value, str):
value = builtin_str(value)
content = content.replace(var, value)
return content
def get_uniform_comparator(comparator): def get_uniform_comparator(comparator):
""" convert comparator alias to uniform name """ convert comparator alias to uniform name
""" """
+27
View File
@@ -185,6 +185,33 @@ class TestParser(unittest.TestCase):
3 * 2 * 3 3 * 2 * 3
) )
def test_parse_data(self):
content = {
'request': {
'url': '/api/users/$uid',
'method': "$method",
'headers': {'token': '$token'},
'data': {
"null": None,
"true": True,
"false": False,
"empty_str": ""
}
}
}
mapping = {
"$uid": 1000,
"$method": "POST"
}
result = parser.parse_data(content, mapping)
self.assertEqual("/api/users/1000", result["request"]["url"])
self.assertEqual("$token", result["request"]["headers"]["token"])
self.assertEqual("POST", result["request"]["method"])
self.assertIsNone(result["request"]["data"]["null"])
self.assertTrue(result["request"]["data"]["true"])
self.assertFalse(result["request"]["data"]["false"])
self.assertEqual("", result["request"]["data"]["empty_str"])
class TestTestcaseParser(unittest.TestCase): class TestTestcaseParser(unittest.TestCase):
-27
View File
@@ -61,33 +61,6 @@ class TestUtils(ApiServerUnittest):
result = utils.query_json(json_content, query) result = utils.query_json(json_content, query)
self.assertEqual(result, "L") self.assertEqual(result, "L")
def test_substitute_variables_with_mapping(self):
content = {
'request': {
'url': '/api/users/$uid',
'method': "$method",
'headers': {'token': '$token'},
'data': {
"null": None,
"true": True,
"false": False,
"empty_str": ""
}
}
}
mapping = {
"$uid": 1000,
"$method": "POST"
}
result = utils.substitute_variables_with_mapping(content, mapping)
self.assertEqual("/api/users/1000", result["request"]["url"])
self.assertEqual("$token", result["request"]["headers"]["token"])
self.assertEqual("POST", result["request"]["method"])
self.assertIsNone(result["request"]["data"]["null"])
self.assertTrue(result["request"]["data"]["true"])
self.assertFalse(result["request"]["data"]["false"])
self.assertEqual("", result["request"]["data"]["empty_str"])
def test_get_uniform_comparator(self): def test_get_uniform_comparator(self):
self.assertEqual(utils.get_uniform_comparator("eq"), "equals") self.assertEqual(utils.get_uniform_comparator("eq"), "equals")
self.assertEqual(utils.get_uniform_comparator("=="), "equals") self.assertEqual(utils.get_uniform_comparator("=="), "equals")