fix: compatibility with v2, body.lst.0.name

This commit is contained in:
debugtalk
2020-05-27 21:56:39 +08:00
parent cad3812384
commit 06b219fd06
2 changed files with 57 additions and 17 deletions

View File

@@ -4,23 +4,29 @@ This module handles compatibility issues between testcase format v2 and v3.
from typing import List, Dict, Text
from httprunner import exceptions
def convert_jmespath(raw: Text) -> Text:
# content.xx/json.xx => body.xx
if raw.startswith("content"):
return f"body{raw[len('content'):]}"
raw = f"body{raw[len('content'):]}"
elif raw.startswith("json"):
return f"body{raw[len('json'):]}"
raw = f"body{raw[len('json'):]}"
# add quotes for field with separator, e.g. headers.Content-Type
raw_list = []
for item in raw.split("."):
if "-" in item:
# add quotes for field with separator, e.g. headers.Content-Type
raw_list.append(f'"{item}"')
elif item.isdigit():
# convert lst.0.name to lst[0].name
raw_list.append(f"[{item}]")
else:
raw_list.append(item)
return ".".join(raw_list)
# lst.[0].name => lst[0].name
return ".".join(raw_list).replace(".[", "[")
def convert_extractors(extractors: List) -> Dict:
@@ -33,13 +39,19 @@ def convert_extractors(extractors: List) -> Dict:
{"varA": "body.varA", "varB": "body.varB"}
"""
if isinstance(extractors, Dict):
return extractors
v3_extractors: Dict = {}
v3_extractors = {}
for extractor in extractors:
for k, v in extractor.items():
v3_extractors[k] = convert_jmespath(v)
if isinstance(extractors, List):
for extractor in extractors:
for k, v in extractor.items():
v3_extractors[k] = v
elif isinstance(extractors, Dict):
v3_extractors = extractors
else:
raise exceptions.FileFormatError(f"Invalid extractor: {extractors}")
for k, v in v3_extractors.items():
v3_extractors[k] = convert_jmespath(v)
return v3_extractors

View File

@@ -5,18 +5,46 @@ from httprunner import compat
class TestCompat(unittest.TestCase):
def test_convert_jmespath(self):
self.assertEqual(compat.convert_jmespath("content.abc"), "body.abc")
self.assertEqual(compat.convert_jmespath("json.abc"), "body.abc")
self.assertEqual(
compat.convert_jmespath("content.abc"),
"body.abc"
compat.convert_jmespath("headers.Content-Type"), 'headers."Content-Type"'
)
self.assertEqual(
compat.convert_jmespath("json.abc"),
"body.abc"
compat.convert_jmespath("body.data.buildings.0.building_id"),
"body.data.buildings[0].building_id",
)
def test_convert_extractors(self):
self.assertEqual(
compat.convert_extractors(
[{"varA": "content.varA"}, {"varB": "json.varB"}]
),
{"varA": "body.varA", "varB": "body.varB"},
)
self.assertEqual(
compat.convert_jmespath("headers.Content-Type"),
'headers."Content-Type"'
compat.convert_extractors([{"varA": "content.0.varA"}]),
{"varA": "body[0].varA"},
)
self.assertEqual(
compat.convert_extractors({"varA": "content.0.varA"}),
{"varA": "body[0].varA"},
)
def test_convert_validators(self):
self.assertEqual(
compat.convert_validators(
[{"check": "content.abc", "assert": "eq", "expect": 201}]
),
[{"check": "body.abc", "assert": "eq", "expect": 201}],
)
self.assertEqual(
compat.convert_validators([{"eq": ["content.abc", 201]}]),
[{"eq": ["body.abc", 201]}],
)
self.assertEqual(
compat.convert_validators([{"eq": ["content.0.name", 201]}]),
[{"eq": ["body[0].name", 201]}],
)