From 06b219fd064abb4cca6abfb28b9191310a765a02 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Wed, 27 May 2020 21:56:39 +0800 Subject: [PATCH] fix: compatibility with v2, body.lst.0.name --- httprunner/compat.py | 32 +++++++++++++++++++---------- httprunner/compat_test.py | 42 ++++++++++++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/httprunner/compat.py b/httprunner/compat.py index 1367079a..d69a15cf 100644 --- a/httprunner/compat.py +++ b/httprunner/compat.py @@ -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 diff --git a/httprunner/compat_test.py b/httprunner/compat_test.py index f7b7c72d..b7bd9d5f 100644 --- a/httprunner/compat_test.py +++ b/httprunner/compat_test.py @@ -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]}], )